diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c6e13db..0000000 --- a/.gitignore +++ /dev/null @@ -1,42 +0,0 @@ -*.py[co] -*.egg -*.egg-info -dist -build -eggs -parts -var -sdist -develop-eggs -.installed.cfg -pip-log.txt -.tox -*.mo -.mr.developer.cfg -.DS_Store -Thumbs.db -.venv -.idea -out -target -*.iml -*.ipr -*.iws -doc/html -doc/source/apidoc -doc/source/api -doc/build -*.db -.coverage -nosetests.xml -pylint-report.txt -ChangeLog -cscope.out -horizon -trove_dashboard/test/configs/config.conf -trove_dashboard/test/.secret_key_store -AUTHORS -*.lock - -# Files created by releasenotes build -releasenotes/build diff --git a/.gitreview b/.gitreview deleted file mode 100644 index c04ed43..0000000 --- a/.gitreview +++ /dev/null @@ -1,4 +0,0 @@ -[gerrit] -host=review.openstack.org -port=29418 -project=openstack/trove-dashboard.git diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst deleted file mode 100644 index b1c7f96..0000000 --- a/CONTRIBUTING.rst +++ /dev/null @@ -1,20 +0,0 @@ -If you would like to contribute to the development of OpenStack, -you must follow the steps in this page: - - http://docs.openstack.org/infra/manual/developers.html - -You can find more trove specific info: - - http://docs.openstack.org/developer/trove/ - -Once those steps have been completed, changes to OpenStack -should be submitted for review via the Gerrit tool, following -the workflow documented at: - - http://docs.openstack.org/infra/manual/developers.html#development-workflow - -Pull requests submitted through GitHub will be ignored. - -Bugs should be filed on Launchpad, not GitHub: - - https://bugs.launchpad.net/trove diff --git a/HACKING.rst b/HACKING.rst deleted file mode 100644 index 18ed211..0000000 --- a/HACKING.rst +++ /dev/null @@ -1,12 +0,0 @@ -Trove Style Commandments -========================== - -- Step 1: Read the OpenStack Style Commandments - http://docs.openstack.org/developer/hacking/ -- Step 2: Read on - -Trove Specific Commandments ------------------------------ - -None so far - diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 68c771a..0000000 --- a/LICENSE +++ /dev/null @@ -1,176 +0,0 @@ - - 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. - diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index bebfca8..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,4 +0,0 @@ -recursive-include trove_dashboard *.html *.scss *.js - -include AUTHORS -include ChangeLog diff --git a/README b/README new file mode 100644 index 0000000..8fcd2b2 --- /dev/null +++ b/README @@ -0,0 +1,14 @@ +This project is no longer maintained. + +The contents of this repository are still available in the Git +source code management system. To see the contents of this +repository before it reached its end of life, please check out the +previous commit with "git checkout HEAD^1". + +For ongoing work on maintaining OpenStack packages in the Debian +distribution, please see the Debian OpenStack packaging team at +https://wiki.debian.org/OpenStack/. + +For any further questions, please email +openstack-dev@lists.openstack.org or join #openstack-dev on +Freenode. diff --git a/README.rst b/README.rst deleted file mode 100644 index 640993f..0000000 --- a/README.rst +++ /dev/null @@ -1,99 +0,0 @@ -OpenStack Dashboard plugin for Trove project -============================================ - -.. image:: http://governance.openstack.org/badges/trove-dashboard.svg - :target: http://governance.openstack.org/reference/tags/index.html - - -How to use with Horizon on server: ----------------------------------- - -Use pip to install the package on the server running Horizon. Then either copy -or link the files in trove_dashboard/enabled to -openstack_dashboard/local/enabled. This step will cause the Horizon service to -pick up the trove plugin when it starts. - -How to use with devstack: -------------------------- - -Add the following to your devstack ``local.conf`` file:: - - enable_plugin trove-dashboard git://git.openstack.org/openstack/trove-dashboard - - -To run unit tests: ------------------- -:: - - ./run_tests.sh - -Editing Code ------------- - -Apache -~~~~~~ - -Make a change to trove-dashboard then goto to the horizon directory and -compress the code with django and then restart apache.:: - - # rsync code to /opt/stack/trove-dashboard - # copy or link files from trove-dashboard/enabled/* to horizon/openstack_dashboard/local/enabled/ - cd /opt/stack/horizon - python manage.py compress - python manage.py collectstatic --noinput - sudo service apache2 restart - - -Django -~~~~~~ - -You can also speed up development time using the django test server instead of -apache.:: - - /opt/stack/horizon/run_tests.sh --runserver - -If you set COMPRESS_ENABLED and COMPRESS_OFFLINE to False in local_settings.py -that allows you to bypass the compress and collectstatic as well. - - -Settings -~~~~~~~~ - -The use of a cross-process cache such as Memcached is required. - -Install Memcached itself and a Memcached binding such as python-memcached. - -For a single horizon instance use the CACHES setting like the example below. - -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', - 'LOCATION': '127.0.0.1:11211', - }, -} - -For multiple horizon instances behind a load balancer configure each instance -to use the same cache like the example below. - -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', - 'LOCATION': [u'10.2.100.133:11211', u'10.2.100.134:11211''] - }, -} - - -NOTE: -===== - -As of the Mitaka release, the dashboard for trove is now maintained outside of -the Horizon codebase, in this repository. - -Links: ------- - -Trove project: https://git.openstack.org/openstack/trove - -Trove at wiki.openstack.org: https://wiki.openstack.org/wiki/Trove - -Launchpad project: https://launchpad.net/trove-dashboard diff --git a/babel-django.cfg b/babel-django.cfg deleted file mode 100644 index e78d6c0..0000000 --- a/babel-django.cfg +++ /dev/null @@ -1,5 +0,0 @@ -[extractors] -django = django_babel.extract:extract_django - -[python: **.py] -[django: **/templates/**.html] diff --git a/babel-djangojs.cfg b/babel-djangojs.cfg deleted file mode 100644 index a8273b6..0000000 --- a/babel-djangojs.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[extractors] -# We use a custom extractor to find translatable strings in AngularJS -# templates. The extractor is included in horizon.utils for now. -# See http://babel.pocoo.org/docs/messages/#referencing-extraction-methods for -# details on how this works. -angular = horizon.utils.babel_extract_angular:extract_angular - -[javascript: **.js] - -# We need to look into all static folders for HTML files. -# The **/static ensures that we also search within -# /openstack_dashboard/dashboards/XYZ/static which will ensure -# that plugins are also translated. -[angular: **/static/**.html] diff --git a/devstack/plugin.sh b/devstack/plugin.sh deleted file mode 100644 index 372cc97..0000000 --- a/devstack/plugin.sh +++ /dev/null @@ -1,52 +0,0 @@ -# plugin.sh - DevStack plugin.sh dispatch script trove-dashboard - -TROVE_DASHBOARD_DIR=$(cd $(dirname $BASH_SOURCE)/.. && pwd) - -function install_trove_dashboard { - setup_develop ${TROVE_DASHBOARD_DIR} -} - -function configure_trove_dashboard { - cp -a ${TROVE_DASHBOARD_DIR}/trove_dashboard/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 ${TROVE_DASHBOARD_DIR}/trove_dashboard/locale ]; then - (cd ${TROVE_DASHBOARD_DIR}/trove_dashboard; DJANGO_SETTINGS_MODULE=openstack_dashboard.settings ../manage.py compilemessages) - fi -} - -# check for service enabled -if is_service_enabled trove-dashboard; 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 Trove UI" - install_trove_dashboard - - elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then - # Configure after the other layer 1 and 2 services have been configured - echo_summary "Configurng Trove UI" - configure_trove_dashboard - - 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 diff --git a/devstack/settings b/devstack/settings deleted file mode 100644 index cca7136..0000000 --- a/devstack/settings +++ /dev/null @@ -1,2 +0,0 @@ -# settings file for trove-dashboard plugin -enable_service trove-dashboard diff --git a/manage.py b/manage.py deleted file mode 100755 index 7acb0a2..0000000 --- a/manage.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/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", - "trove_dashboard.test.settings") - execute_from_command_line(sys.argv) diff --git a/releasenotes/notes/.placeholder b/releasenotes/notes/.placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/releasenotes/notes/cluster-endpoints-52bbb9f1c146ae97.yaml b/releasenotes/notes/cluster-endpoints-52bbb9f1c146ae97.yaml deleted file mode 100644 index be9eecb..0000000 --- a/releasenotes/notes/cluster-endpoints-52bbb9f1c146ae97.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -fixes: - - Display all endpoints in the dashboard's cluster - details endpoint list. diff --git a/releasenotes/notes/conf-groups-7bc8115f8d0bcd14.yaml b/releasenotes/notes/conf-groups-7bc8115f8d0bcd14.yaml deleted file mode 100644 index 181f33d..0000000 --- a/releasenotes/notes/conf-groups-7bc8115f8d0bcd14.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -features: - - Support configuration groups in the dashboard. This - includes creating and deleting groups; adding, - editing and removing parameters; attaching and - detaching groups to running instances; and specifying - a group during instance creation. diff --git a/releasenotes/notes/enable-cluster-mariabdb-cassandra-11f3f7f6badfc211.yaml b/releasenotes/notes/enable-cluster-mariabdb-cassandra-11f3f7f6badfc211.yaml deleted file mode 100644 index 1718e60..0000000 --- a/releasenotes/notes/enable-cluster-mariabdb-cassandra-11f3f7f6badfc211.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -features: - - Enable cluster support for MariaDB and Cassandra. diff --git a/releasenotes/notes/enable-pxc-grow-shrink-17568a1c280f1c42.yaml b/releasenotes/notes/enable-pxc-grow-shrink-17568a1c280f1c42.yaml deleted file mode 100644 index 1a0b1b5..0000000 --- a/releasenotes/notes/enable-pxc-grow-shrink-17568a1c280f1c42.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -fixes: - - Enable cluster grow and shrink panels for pxc. diff --git a/releasenotes/notes/fix-grow-cluster-cache-5625d1a519a4ee01.yaml b/releasenotes/notes/fix-grow-cluster-cache-5625d1a519a4ee01.yaml deleted file mode 100644 index 28828b6..0000000 --- a/releasenotes/notes/fix-grow-cluster-cache-5625d1a519a4ee01.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -fixes: - - The current caching initializes the instance list for the grow - cluster manager each time a new process would instantiate the - manager. Changed to manager to only initialize on creation. diff --git a/releasenotes/notes/logging-support-f999a1b1b342eb4d.yaml b/releasenotes/notes/logging-support-f999a1b1b342eb4d.yaml deleted file mode 100644 index ebe8b37..0000000 --- a/releasenotes/notes/logging-support-f999a1b1b342eb4d.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -features: - - Added support for logging features in the dashboard. - This includes listing logs that can be retrieved and - viewing, publishing and stop collection of log contents. diff --git a/releasenotes/source/_static/.placeholder b/releasenotes/source/_static/.placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/releasenotes/source/_templates/.placeholder b/releasenotes/source/_templates/.placeholder deleted file mode 100644 index e69de29..0000000 diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py deleted file mode 100644 index 9c40360..0000000 --- a/releasenotes/source/conf.py +++ /dev/null @@ -1,293 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Trove Dashboard Release Notes documentation build configuration file, created by -# sphinx-quickstart on Thu Apr 14 18:07:45 2016. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -import sys -import os - -# 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 = [ - 'oslosphinx', - 'reno.sphinxext', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# source_suffix = ['.rst', '.md'] -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'Trove Dashboard Release Notes' -copyright = u'2016, Trove developers' -author = u'Trove developers' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -from trove_dashboard.version import version_info as trove_version -# The short X.Y version. -version = trove_version.canonical_version_string() -# The full version, including alpha/beta/rc tags. -release = trove_version.version_string_with_vcs() - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -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. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = [] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -#show_authors = False - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = 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 = 'default' - -# 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. -# " v documentation" by default. -#html_title = u'Trove Dashboard Release Notes vblah' - -# 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 (relative to this directory) to use as a 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 = ['_static'] - -# 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 not None, a 'Last updated on:' timestamp is inserted at every page -# bottom, using the given strftime format. -# The empty string is equivalent to '%b %d, %Y'. -#html_last_updated_fmt = None - -# 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 - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' -#html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# 'ja' uses this config value. -# 'zh' user can custom change `jieba` dictionary path. -#html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. -htmlhelp_basename = 'TroveDashboardReleaseNotesdoc' - -# -- 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': '', - -# Latex figure (float) alignment -#'figure_align': 'htbp', -} - -# 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 = [ - (master_doc, 'TroveDashboardReleaseNotes.tex', u'Trove Dashboard Release Notes Documentation', - u'Trove 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 = [ - (master_doc, 'trovedashboardreleasenotes', u'Trove Dashboard Release Notes Documentation', - [author], 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 = [ - (master_doc, 'TroveDashboardReleaseNotes', u'Trove Dashboard Release Notes Documentation', - author, 'TroveDashboardReleaseNotes', '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' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False - -# -- Options for Internationalization output ------------------------------ -locale_dirs = ['locale/'] diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst deleted file mode 100644 index 996c952..0000000 --- a/releasenotes/source/index.rst +++ /dev/null @@ -1,18 +0,0 @@ -============================= -Trove Dashboard Release Notes -============================= - -Contents: - -.. toctree:: - :maxdepth: 2 - - unreleased - ocata - newton - - -Search -====== - -* :ref:`search` diff --git a/releasenotes/source/locale/de/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/de/LC_MESSAGES/releasenotes.po deleted file mode 100644 index a91c9de..0000000 --- a/releasenotes/source/locale/de/LC_MESSAGES/releasenotes.po +++ /dev/null @@ -1,90 +0,0 @@ -# Robert Simai , 2016. #zanata -# Robert Simai , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: Trove Dashboard Release Notes 8.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-09 20:48+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-04-10 09:37+0000\n" -"Last-Translator: Robert Simai \n" -"Language-Team: German\n" -"Language: de\n" -"X-Generator: Zanata 3.9.6\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgid "7.0.0" -msgstr "7.0.0" - -msgid "8.0.0" -msgstr "8.0.0" - -msgid ":ref:`search`" -msgstr ":ref:`search`" - -msgid "" -"Added support for logging features in the dashboard. This includes listing " -"logs that can be retrieved and viewing, publishing and stop collection of " -"log contents." -msgstr "" -"Unterstützung für Loggingfunktionen im Dashboard hinzugefügt. Dies " -"beinhaltet die Auflistung abrufbarer Logdateien, sowie betrachten, " -"publizieren und stoppen der Aufzeichnung von Loginhalten." - -msgid "Bug Fixes" -msgstr "Fehlerkorrekturen" - -msgid "Contents:" -msgstr "Inhalt:" - -msgid "Current Series Release Notes" -msgstr "Aktuelle Serie Releasenotes" - -msgid "Display all endpoints in the dashboard's cluster details endpoint list." -msgstr "" -"Zeige alle Endpunkte in der Endpunktliste in den Clusterdetails im " -"Dashboard ." - -msgid "Enable cluster grow and shrink panels for pxc." -msgstr "Aktivieren von Panels für pxc zum wachsen und schrumpfen von Clustern" - -msgid "Enable cluster support for MariaDB and Cassandra." -msgstr "Clusterunterstützung für MariaDB und Cassandra aktiviert." - -msgid "New Features" -msgstr "Neue Funktionen" - -msgid "Newton Series Release Notes" -msgstr "Newton Serie Releasenotes" - -msgid "Ocata Series Release Notes" -msgstr "Ocata Serie Releasenotes" - -msgid "Search" -msgstr "Suche" - -msgid "" -"Support configuration groups in the dashboard. This includes creating and " -"deleting groups; adding, editing and removing parameters; attaching and " -"detaching groups to running instances; and specifying a group during " -"instance creation." -msgstr "" -"Unterstützung für Konfigurationsgruppen im Dashboard. Dies schließt anlegen " -"und löschen von Gruppen ein, sowie hinzufügen, bearbeiten und entfernen von " -"Parametern, zuweisen und entfernen von Gruppen zu laufenden Instanzen und " -"die Angabe einer Gruppe während der Instanzerzeugung." - -msgid "" -"The current caching initializes the instance list for the grow cluster " -"manager each time a new process would instantiate the manager. Changed to " -"manager to only initialize on creation." -msgstr "" -"Das aktuelle Caching initialisiert die Instanzliste für den für das Wachsen " -"zuständigen Cluster Manager jedes Mal, wenn ein neuer Prozess den Cluster " -"Manager instanzieren würde. Geändert auf Initialisierung nur bei der " -"Erstellung." - -msgid "Trove Dashboard Release Notes" -msgstr "Trove Dashboard Releasenotes" diff --git a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po deleted file mode 100644 index ebc7641..0000000 --- a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po +++ /dev/null @@ -1,49 +0,0 @@ -# Andi Chandler , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: Trove Dashboard Release Notes 7.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-10-07 13:57+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-06-09 11:08+0000\n" -"Last-Translator: Andi Chandler \n" -"Language-Team: English (United Kingdom)\n" -"Language: en-GB\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgid ":ref:`search`" -msgstr ":ref:`search`" - -msgid "" -"Added support for logging features in the dashboard. This includes listing " -"logs that can be retrieved and viewing, publishing and stop collection of " -"log contents." -msgstr "" -"Added support for logging features in the dashboard. This includes listing " -"logs that can be retrieved and viewing, publishing and stop collection of " -"log contents." - -msgid "Bug Fixes" -msgstr "Bug Fixes" - -msgid "Contents:" -msgstr "Contents:" - -msgid "Current Series Release Notes" -msgstr "Current Series Release Notes" - -msgid "Display all endpoints in the dashboard's cluster details endpoint list." -msgstr "" -"Display all endpoints in the dashboard's cluster details endpoint list." - -msgid "Enable cluster support for MariaDB and Cassandra." -msgstr "Enable cluster support for MariaDB and Cassandra." - -msgid "New Features" -msgstr "New Features" - -msgid "Trove Dashboard Release Notes" -msgstr "Trove Dashboard Release Notes" diff --git a/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po deleted file mode 100644 index 0b23b50..0000000 --- a/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po +++ /dev/null @@ -1,56 +0,0 @@ -# Gérald LONLAS , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: Trove Dashboard Release Notes 8.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-09 20:48+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-10-22 04:24+0000\n" -"Last-Translator: Gérald LONLAS \n" -"Language-Team: French\n" -"Language: fr\n" -"X-Generator: Zanata 3.9.6\n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" - -msgid "7.0.0" -msgstr "7.0.0" - -msgid ":ref:`search`" -msgstr ":ref:`search`" - -#, fuzzy -msgid "" -"Added support for logging features in the dashboard. This includes listing " -"logs that can be retrieved and viewing, publishing and stop collection of " -"log contents." -msgstr "" -"Ajout du support pour logger les fonctionnalités dans le tableau de bord. " -"Added support for logging features in the dashboard. Cela inclut la liste de " -"logs qui sont récupérés affichés et publiés ainsi que l'arrêt de la " -"collecte de logs." - -msgid "Bug Fixes" -msgstr "Corrections de bugs" - -msgid "Contents:" -msgstr "Contenu :" - -msgid "Current Series Release Notes" -msgstr "Note de la release actuelle" - -msgid "Enable cluster support for MariaDB and Cassandra." -msgstr "Activer le support de Cluster pour MariaDB et Cassandra." - -msgid "New Features" -msgstr "Nouvelles fonctionnalités" - -msgid "Newton Series Release Notes" -msgstr "Note de release pour Newton" - -msgid "Search" -msgstr "Recherche" - -msgid "Trove Dashboard Release Notes" -msgstr "Note de release pour le Tableau de bord Trove" diff --git a/releasenotes/source/locale/id/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/id/LC_MESSAGES/releasenotes.po deleted file mode 100644 index c30f33c..0000000 --- a/releasenotes/source/locale/id/LC_MESSAGES/releasenotes.po +++ /dev/null @@ -1,88 +0,0 @@ -# suhartono , 2016. #zanata -# suhartono , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: Trove Dashboard Release Notes 8.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-09 20:48+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-04-17 11:03+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 "7.0.0" -msgstr "7.0.0" - -msgid "8.0.0" -msgstr "8.0.0" - -msgid ":ref:`search`" -msgstr ":ref:`search`" - -msgid "" -"Added support for logging features in the dashboard. This includes listing " -"logs that can be retrieved and viewing, publishing and stop collection of " -"log contents." -msgstr "" -"Dukungan diitambahkan untuk fitur login di dashboard. Ini termasuk log " -"daftar yang dapat diambil dan dilihat, penerbitan dan menghentikan koleksi " -"isi log." - -msgid "Bug Fixes" -msgstr "Bug Fixes (perbaikan kesalahan)" - -msgid "Contents:" -msgstr "Contents:" - -msgid "Current Series Release Notes" -msgstr "Current Series Release Notes (catatan rilis Current Series)" - -msgid "Display all endpoints in the dashboard's cluster details endpoint list." -msgstr "" -"Menampilkan semua endpoint dalam daftar rincian endpoint klaster dashboard." - -msgid "Enable cluster grow and shrink panels for pxc." -msgstr "Aktifkan klaster tumbuh dan ciutkan panel untuk PXC." - -msgid "Enable cluster support for MariaDB and Cassandra." -msgstr "Aktifkan dukungan klaster MariaDB dan Cassandra." - -msgid "New Features" -msgstr "New Features (fitur baru)" - -msgid "Newton Series Release Notes" -msgstr "Newton Series Release Notes (catatan rilis Newton Series)" - -msgid "Ocata Series Release Notes" -msgstr "Ocata Series Release Notes" - -msgid "Search" -msgstr "Search (mencari)" - -msgid "" -"Support configuration groups in the dashboard. This includes creating and " -"deleting groups; adding, editing and removing parameters; attaching and " -"detaching groups to running instances; and specifying a group during " -"instance creation." -msgstr "" -"Mendukung kelompok konfigurasi di dashboard. Ini termasuk membuat dan " -"menghapus kelompok; menambahkan, mengedit dan menghapus parameter; " -"menghbungkan dan memisahkan kelompok untuk menjalankan instance; dan " -"menentukan kelompok selama pembuatan instance." - -msgid "" -"The current caching initializes the instance list for the grow cluster " -"manager each time a new process would instantiate the manager. Changed to " -"manager to only initialize on creation." -msgstr "" -"Caching saat ini menginisialisasi daftar instance bagi manajer klaster " -"tumbuh setiap kali proses baru akan menginstantiate manajer. Diubah menjadi " -"manajer hanya menginisialisasi pada pembuatan." - -msgid "Trove Dashboard Release Notes" -msgstr "Trove Dashboard Release Notes (catatan rilis Trove Dashboard)" diff --git a/releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po deleted file mode 100644 index 840333b..0000000 --- a/releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po +++ /dev/null @@ -1,49 +0,0 @@ -# Shu Muto , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: Trove Dashboard Release Notes 8.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-09 20:48+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-05-23 01:11+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 ":ref:`search`" -msgstr ":ref:`search`" - -msgid "" -"Added support for logging features in the dashboard. This includes listing " -"logs that can be retrieved and viewing, publishing and stop collection of " -"log contents." -msgstr "" -"ダッシュボードでのロギング機能のサポートを追加しました。これは、取得可能なロ" -"グの一覧、表示、公開、ログ内容の収集の停止を含みます。" - -msgid "Bug Fixes" -msgstr "バグ修正" - -msgid "Contents:" -msgstr "内容:" - -msgid "Current Series Release Notes" -msgstr "開発中バージョンのリリースノート" - -msgid "Display all endpoints in the dashboard's cluster details endpoint list." -msgstr "" -"ダッシュボードのクラスター詳細のエンドポイント一覧にすべてのエンドポイントを" -"表示します。" - -msgid "Enable cluster support for MariaDB and Cassandra." -msgstr "MariaDB と Cassandora のクラスターをサポートしました。" - -msgid "New Features" -msgstr "新機能" - -msgid "Trove Dashboard Release Notes" -msgstr "Trove Dashboard リリースノート" diff --git a/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po deleted file mode 100644 index aba21f3..0000000 --- a/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po +++ /dev/null @@ -1,80 +0,0 @@ -# Ian Y. Choi , 2016. #zanata -# Ian Y. Choi , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: Trove Dashboard Release Notes 8.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-09 20:48+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-02-03 06:08+0000\n" -"Last-Translator: Ian Y. Choi \n" -"Language-Team: Korean (South Korea)\n" -"Language: ko-KR\n" -"X-Generator: Zanata 3.9.6\n" -"Plural-Forms: nplurals=1; plural=0\n" - -msgid "7.0.0" -msgstr "7.0.0" - -msgid ":ref:`search`" -msgstr ":ref:`search`" - -msgid "" -"Added support for logging features in the dashboard. This includes listing " -"logs that can be retrieved and viewing, publishing and stop collection of " -"log contents." -msgstr "" -"대시보드 내 로깅 기능에 대한 지원을 추가하였습니다. 가져올 수 있는 로그 목록 " -"나열 및 로그 내용 집합을 퍼블리싱 및 중지를 포함합니다." - -msgid "Bug Fixes" -msgstr "버그 수정" - -msgid "Contents:" -msgstr "내용:" - -msgid "Current Series Release Notes" -msgstr "현재 시리즈에 대한 릴리즈 노트" - -msgid "Display all endpoints in the dashboard's cluster details endpoint list." -msgstr "" -"대시보드의 클러스터 세부 엔드 포인트 목록 내에 모든 엔드 포인트를 보여줍니다." - -msgid "Enable cluster grow and shrink panels for pxc." -msgstr "pxc를 위한 패널에 대해 클러스터 확장 및 축소를 활성화합니다." - -msgid "Enable cluster support for MariaDB and Cassandra." -msgstr "MariaDB 및 Cassandra에 대한 클러스터 지원을 활성화합니다." - -msgid "New Features" -msgstr "새로운 기능" - -msgid "Newton Series Release Notes" -msgstr "Newton 시리즈에 대한 릴리즈 노트" - -msgid "Search" -msgstr "검색" - -msgid "" -"Support configuration groups in the dashboard. This includes creating and " -"deleting groups; adding, editing and removing parameters; attaching and " -"detaching groups to running instances; and specifying a group during " -"instance creation." -msgstr "" -"구성 그룹을 대시보드에서 지원합니다. 그룹 생성 및 삭제; 매개 변수 추가, 편집 " -"및 제거; 그룹을 실행 중인 인스턴스에 연결 및 연결 해제; 그리고 인스턴스 생성 " -"중 그룹 지정을 포함합니다." - -msgid "" -"The current caching initializes the instance list for the grow cluster " -"manager each time a new process would instantiate the manager. Changed to " -"manager to only initialize on creation." -msgstr "" -"현재 캐싱은 새로운 프로세스가 클러스터 확장 관리자를 초기화할 때마다 해당 관" -"리자에 대한 인스턴스 목록을 초기화합니다. 생성할 때에만 관리자를 초기화하도" -"록 변경하였습니다." - -msgid "Trove Dashboard Release Notes" -msgstr "Trove 대시보드 릴리즈 노트" diff --git a/releasenotes/source/locale/ru/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/ru/LC_MESSAGES/releasenotes.po deleted file mode 100644 index e64174d..0000000 --- a/releasenotes/source/locale/ru/LC_MESSAGES/releasenotes.po +++ /dev/null @@ -1,44 +0,0 @@ -# Alexander , 2016. #zanata -# Artem , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: Trove Dashboard Release Notes 8.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-09 20:48+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-23 12:49+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 "7.0.0" -msgstr "7.0.0" - -msgid ":ref:`search`" -msgstr ":ref:`search`" - -msgid "Bug Fixes" -msgstr "Исправления ошибок" - -msgid "Contents:" -msgstr "Содержание:" - -msgid "Current Series Release Notes" -msgstr "Примечания к выпуску Current Series " - -msgid "Enable cluster support for MariaDB and Cassandra." -msgstr "Включить поддержку кластеризации в MariaDB и Cassandra." - -msgid "New Features" -msgstr "Новые особенности" - -msgid "Newton Series Release Notes" -msgstr "Примечания к выпуску Newton Series " - -msgid "Search" -msgstr "Поиск" diff --git a/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po deleted file mode 100644 index 8708991..0000000 --- a/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po +++ /dev/null @@ -1,48 +0,0 @@ -# sunanchen , 2016. #zanata -# zzxwill , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: Trove Dashboard Release Notes 8.0.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-04-09 20:48+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-09-08 06:54+0000\n" -"Last-Translator: sunanchen \n" -"Language-Team: Chinese (China)\n" -"Language: zh-CN\n" -"X-Generator: Zanata 3.9.6\n" -"Plural-Forms: nplurals=1; plural=0\n" - -msgid ":ref:`search`" -msgstr ":ref:`search`" - -msgid "" -"Added support for logging features in the dashboard. This includes listing " -"logs that can be retrieved and viewing, publishing and stop collection of " -"log contents." -msgstr "" -"在dashboard中增加对日志特性的支持。这包含了列出可检索和查看的日志,正在发布的" -"日志以及停止日志内容的收集。" - -msgid "Bug Fixes" -msgstr "Bug修复" - -msgid "Contents:" -msgstr "内容" - -msgid "Current Series Release Notes" -msgstr "当前版本发布说明" - -msgid "Display all endpoints in the dashboard's cluster details endpoint list." -msgstr "在dashboard的集群详情endpoint列表中展示所有的endpoints" - -msgid "Enable cluster support for MariaDB and Cassandra." -msgstr "启动MariaDB和Cassandra的集群支持。" - -msgid "New Features" -msgstr "新特性" - -msgid "Trove Dashboard Release Notes" -msgstr "Trove Dashboard发布说明" diff --git a/releasenotes/source/newton.rst b/releasenotes/source/newton.rst deleted file mode 100644 index 97036ed..0000000 --- a/releasenotes/source/newton.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================================== - Newton Series Release Notes -=================================== - -.. release-notes:: - :branch: origin/stable/newton diff --git a/releasenotes/source/ocata.rst b/releasenotes/source/ocata.rst deleted file mode 100644 index ebe62f4..0000000 --- a/releasenotes/source/ocata.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================================== - Ocata Series Release Notes -=================================== - -.. release-notes:: - :branch: origin/stable/ocata diff --git a/releasenotes/source/unreleased.rst b/releasenotes/source/unreleased.rst deleted file mode 100644 index 875030f..0000000 --- a/releasenotes/source/unreleased.rst +++ /dev/null @@ -1,5 +0,0 @@ -============================ -Current Series Release Notes -============================ - -.. release-notes:: diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 235d709..0000000 --- a/requirements.txt +++ /dev/null @@ -1,14 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -pbr>=1.6 -# Horizon Core Requirements -Babel>=1.3 -Django<1.9,>=1.8 -django-compressor>=1.4 -django-openstack-auth>=2.0.0 -iso8601>=0.1.9 -python-keystoneclient!=1.8.0,>=1.6.0 -python-swiftclient>=2.2.0 -python-troveclient>=1.2.0 diff --git a/run_tests.sh b/run_tests.sh deleted file mode 100755 index 285a48e..0000000 --- a/run_tests.sh +++ /dev/null @@ -1,554 +0,0 @@ -#!/bin/bash - -set -o errexit - -function usage { - echo "Usage: $0 [OPTION]..." - echo "Run Horizon's test suite(s)" - echo "" - echo " -V, --virtual-env Always use virtualenv. Install automatically" - echo " if not present" - echo " -N, --no-virtual-env Don't use virtualenv. Run tests in local" - echo " environment" - echo " -c, --coverage Generate reports using Coverage" - echo " -f, --force Force a clean re-build of the virtual" - echo " environment. Useful when dependencies have" - echo " been added." - echo " -m, --manage Run a Django management command." - echo " --makemessages Create/Update English translation files." - echo " --compilemessages Compile all translation files." - echo " --check-only Do not update translation files (--makemessages only)." - echo " --pseudo Pseudo translate a language." - echo " -p, --pep8 Just run pep8" - echo " -8, --pep8-changed []" - echo " Just run PEP8 and HACKING compliance check" - echo " on files changed since HEAD~1 (or )" - echo " -P, --no-pep8 Don't run pep8 by default" - echo " -t, --tabs Check for tab characters in files." - echo " -y, --pylint Just run pylint" - echo " -q, --quiet Run non-interactively. (Relatively) quiet." - echo " Implies -V if -N is not set." - echo " --only-selenium Run only the Selenium unit tests" - echo " --with-selenium Run unit tests including Selenium tests" - echo " --selenium-headless Run Selenium tests headless" - echo " --integration Run the integration tests (requires a running " - echo " OpenStack environment)" - echo " --runserver Run the Django development server for" - echo " openstack_dashboard in the virtual" - echo " environment." - echo " --docs Just build the documentation" - echo " --backup-environment Make a backup of the environment on exit" - echo " --restore-environment Restore the environment before running" - echo " --destroy-environment Destroy the environment and exit" - echo " -h, --help Print this usage message" - echo "" - echo "Note: with no options specified, the script will try to run the tests in" - echo " a virtual environment, If no virtualenv is found, the script will ask" - echo " if you would like to create one. If you prefer to run tests NOT in a" - echo " virtual environment, simply pass the -N option." - exit -} - -# DEFAULTS FOR RUN_TESTS.SH -# -root=`pwd -P` -venv=$root/.venv -venv_env_version=$venv/environments -with_venv=tools/with_venv.sh -included_dirs="trove_dashboard" - -always_venv=0 -backup_env=0 -command_wrapper="" -destroy=0 -force=0 -just_pep8=0 -just_pep8_changed=0 -no_pep8=0 -just_pylint=0 -just_docs=0 -just_tabs=0 -never_venv=0 -quiet=0 -restore_env=0 -runserver=0 -only_selenium=0 -with_selenium=0 -selenium_headless=0 -integration=0 -testopts="" -testargs="" -with_coverage=0 -makemessages=0 -compilemessages=0 -check_only=0 -pseudo=0 -manage=0 - -# Jenkins sets a "JOB_NAME" variable, if it's not set, we'll make it "default" -[ "$JOB_NAME" ] || JOB_NAME="default" - -function process_option { - # If running manage command, treat the rest of options as arguments. - if [ $manage -eq 1 ]; then - testargs="$testargs $1" - return 0 - fi - - case "$1" in - -h|--help) usage;; - -V|--virtual-env) always_venv=1; never_venv=0;; - -N|--no-virtual-env) always_venv=0; never_venv=1;; - -p|--pep8) just_pep8=1;; - -8|--pep8-changed) just_pep8_changed=1;; - -P|--no-pep8) no_pep8=1;; - -y|--pylint) just_pylint=1;; - -f|--force) force=1;; - -t|--tabs) just_tabs=1;; - -q|--quiet) quiet=1;; - -c|--coverage) with_coverage=1;; - -m|--manage) manage=1;; - --makemessages) makemessages=1;; - --compilemessages) compilemessages=1;; - --check-only) check_only=1;; - --pseudo) pseudo=1;; - --only-selenium) only_selenium=1;; - --with-selenium) with_selenium=1;; - --selenium-headless) selenium_headless=1;; - --integration) integration=1;; - --docs) just_docs=1;; - --runserver) runserver=1;; - --backup-environment) backup_env=1;; - --restore-environment) restore_env=1;; - --destroy-environment) destroy=1;; - -*) testopts="$testopts $1";; - *) testargs="$testargs $1" - esac -} - -function run_management_command { - ${command_wrapper} python $root/manage.py $testopts $testargs -} - -function run_server { - echo "Starting Django development server..." - ${command_wrapper} python $root/manage.py runserver $testopts $testargs - echo "Server stopped." -} - -function run_pylint { - echo "Running pylint ..." - PYTHONPATH=$root ${command_wrapper} pylint --rcfile=.pylintrc -f parseable $included_dirs > pylint.txt || true - CODE=$? - grep Global -A2 pylint.txt - if [ $CODE -lt 32 ]; then - echo "Completed successfully." - exit 0 - else - echo "Completed with problems." - exit $CODE - fi -} - -function warn_on_flake8_without_venv { - set +o errexit - ${command_wrapper} python -c "import hacking" 2>/dev/null - no_hacking=$? - set -o errexit - if [ $never_venv -eq 1 -a $no_hacking -eq 1 ]; then - echo "**WARNING**:" >&2 - echo "OpenStack hacking is not installed on your host. Its detection will be missed." >&2 - echo "Please install or use virtual env if you need OpenStack hacking detection." >&2 - fi -} - -function run_pep8 { - echo "Running flake8 ..." - warn_on_flake8_without_venv - DJANGO_SETTINGS_MODULE=trove_dashboard.test.settings ${command_wrapper} flake8 -} - -function run_pep8_changed { - # NOTE(gilliard) We want use flake8 to check the entirety of every file that has - # a change in it. Unfortunately the --filenames argument to flake8 only accepts - # file *names* and there are no files named (eg) "nova/compute/manager.py". The - # --diff argument behaves surprisingly as well, because although you feed it a - # diff, it actually checks the file on disk anyway. - local base_commit=${testargs:-HEAD~1} - files=$(git diff --name-only $base_commit | tr '\n' ' ') - echo "Running flake8 on ${files}" - warn_on_flake8_without_venv - diff -u --from-file /dev/null ${files} | DJANGO_SETTINGS_MODULE=trove_dashboard.test.settings ${command_wrapper} flake8 --diff - exit -} - -function run_sphinx { - echo "Building sphinx..." - DJANGO_SETTINGS_MODULE=trove_dashboard.test.settings ${command_wrapper} python setup.py build_sphinx - echo "Build complete." -} - -function tab_check { - TAB_VIOLATIONS=`find $included_dirs -type f -regex ".*\.\(css\|js\|py\|html\)" -print0 | xargs -0 awk '/\t/' | wc -l` - if [ $TAB_VIOLATIONS -gt 0 ]; then - echo "TABS! $TAB_VIOLATIONS of them! Oh no!" - HORIZON_FILES=`find $included_dirs -type f -regex ".*\.\(css\|js\|py|\html\)"` - for TABBED_FILE in $HORIZON_FILES - do - TAB_COUNT=`awk '/\t/' $TABBED_FILE | wc -l` - if [ $TAB_COUNT -gt 0 ]; then - echo "$TABBED_FILE: $TAB_COUNT" - fi - done - fi - return $TAB_VIOLATIONS; -} - -function destroy_venv { - echo "Cleaning environment..." - echo "Removing virtualenv..." - rm -rf $venv - echo "Virtualenv removed." -} - -function environment_check { - echo "Checking environment." - if [ -f $venv_env_version ]; then - set +o errexit - cat requirements.txt test-requirements.txt | cmp $venv_env_version - > /dev/null - local env_check_result=$? - set -o errexit - if [ $env_check_result -eq 0 ]; then - # If the environment exists and is up-to-date then set our variables - command_wrapper="${root}/${with_venv}" - echo "Environment is up to date." - return 0 - fi - fi - - if [ $always_venv -eq 1 ]; then - install_venv - else - if [ ! -e ${venv} ]; then - echo -e "Environment not found. Install? (Y/n) \c" - else - echo -e "Your environment appears to be out of date. Update? (Y/n) \c" - fi - read update_env - if [ "x$update_env" = "xY" -o "x$update_env" = "x" -o "x$update_env" = "xy" ]; then - install_venv - else - # Set our command wrapper anyway. - command_wrapper="${root}/${with_venv}" - fi - fi -} - -function sanity_check { - # Anything that should be determined prior to running the tests, server, etc. - # Don't sanity-check anything environment-related in -N flag is set - if [ $never_venv -eq 0 ]; then - if [ ! -e ${venv} ]; then - echo "Virtualenv not found at $venv. Did install_venv.py succeed?" - exit 1 - fi - fi - # Remove .pyc files. This is sanity checking because they can linger - # after old files are deleted. - find . -name "*.pyc" -exec rm -rf {} \; -} - -function backup_environment { - if [ $backup_env -eq 1 ]; then - echo "Backing up environment \"$JOB_NAME\"..." - if [ ! -e ${venv} ]; then - echo "Environment not installed. Cannot back up." - return 0 - fi - if [ -d /tmp/.horizon_environment/$JOB_NAME ]; then - mv /tmp/.horizon_environment/$JOB_NAME /tmp/.horizon_environment/$JOB_NAME.old - rm -rf /tmp/.horizon_environment/$JOB_NAME - fi - mkdir -p /tmp/.horizon_environment/$JOB_NAME - cp -r $venv /tmp/.horizon_environment/$JOB_NAME/ - # Remove the backup now that we've completed successfully - rm -rf /tmp/.horizon_environment/$JOB_NAME.old - echo "Backup completed" - fi -} - -function restore_environment { - if [ $restore_env -eq 1 ]; then - echo "Restoring environment from backup..." - if [ ! -d /tmp/.horizon_environment/$JOB_NAME ]; then - echo "No backup to restore from." - return 0 - fi - - cp -r /tmp/.horizon_environment/$JOB_NAME/.venv ./ || true - - echo "Environment restored successfully." - fi -} - -function install_venv { - # Install with install_venv.py - export PIP_DOWNLOAD_CACHE=${PIP_DOWNLOAD_CACHE-/tmp/.pip_download_cache} - export PIP_USE_MIRRORS=true - if [ $quiet -eq 1 ]; then - export PIP_NO_INPUT=true - fi - echo "Fetching new src packages..." - rm -rf $venv/src - python tools/install_venv.py - command_wrapper="$root/${with_venv}" - # Make sure it worked and record the environment version - sanity_check - chmod -R 754 $venv - cat requirements.txt test-requirements.txt > $venv_env_version -} - -function run_tests { - sanity_check - - if [ $with_selenium -eq 1 ]; then - export WITH_SELENIUM=1 - elif [ $only_selenium -eq 1 ]; then - export WITH_SELENIUM=1 - export SKIP_UNITTESTS=1 - fi - - if [ $selenium_headless -eq 1 ]; then - export SELENIUM_HEADLESS=1 - fi - - # TODO(david-lyle) remove when configuration files for Trove are not loaded - # by default in Horizon - ${command_wrapper} python tools/clean_enabled_files.py - - if [ -z "$testargs" ]; then - run_tests_all - else - run_tests_subset - fi -} - -function run_tests_subset { - project=`echo $testargs | awk -F. '{print $1}'` - ${command_wrapper} python $root/manage.py test --settings=$project.test.settings $testopts $testargs -} - -function run_tests_all { - echo "Running trove_dashboard application tests" - export NOSE_XUNIT_FILE=trove_dashboard/nosetests.xml - if [ "$NOSE_WITH_HTML_OUTPUT" = '1' ]; then - export NOSE_HTML_OUT_FILE='trove_dashboard_nose_results.html' - fi - if [ $with_coverage -eq 1 ]; then - ${command_wrapper} python -m coverage.__main__ erase - coverage_run="python -m coverage.__main__ run -p" - fi - ${command_wrapper} ${coverage_run} $root/manage.py test trove_dashboard --settings=trove_dashboard.test.settings $testopts - # get results of the Horizon tests - trove_dashboard_RESULT=$? - - if [ $with_coverage -eq 1 ]; then - echo "Generating coverage reports" - ${command_wrapper} python -m coverage.__main__ combine - ${command_wrapper} python -m coverage.__main__ xml -i --omit='/usr*,setup.py,*egg*,.venv/*' - ${command_wrapper} python -m coverage.__main__ html -i --omit='/usr*,setup.py,*egg*,.venv/*' -d reports - fi - # Remove the leftover coverage files from the -p flag earlier. - rm -f .coverage.* - - PEP8_RESULT=0 - if [ $no_pep8 -eq 0 ] && [ $only_selenium -eq 0 ]; then - run_pep8 - PEP8_RESULT=$? - fi - - TEST_RESULT=$(($trove_dashboard_RESULT || $PEP8_RESULT)) - if [ $TEST_RESULT -eq 0 ]; then - echo "Tests completed successfully." - else - echo "Tests failed." - fi - exit $TEST_RESULT -} - -function run_integration_tests { - export INTEGRATION_TESTS=1 - - if [ $selenium_headless -eq 1 ]; then - export SELENIUM_HEADLESS=1 - fi - - export HORIZON_INTEGRATION_TESTS_CONFIG_FILE="trove_dashboard/test/integration_tests/horizon.conf" - - echo "Running Horizon integration tests..." - if [ -z "$testargs" ]; then - ${command_wrapper} nosetests trove_dashboard/test/integration_tests/tests - else - ${command_wrapper} nosetests $testargs - fi - exit 0 -} - -function run_makemessages { - OPTS="-l en --no-obsolete --settings=openstack_dashboard.test.settings" - DASHBOARD_OPTS="--extension=html,txt,csv --ignore=openstack" - echo -n "horizon: " - cd horizon - ${command_wrapper} $root/manage.py makemessages $OPTS - HORIZON_PY_RESULT=$? - echo -n "horizon javascript: " - ${command_wrapper} $root/manage.py makemessages -d djangojs $OPTS - HORIZON_JS_RESULT=$? - echo -n "openstack_dashboard: " - cd ../openstack_dashboard - ${command_wrapper} $root/manage.py makemessages $DASHBOARD_OPTS $OPTS - DASHBOARD_RESULT=$? - cd .. - if [ $check_only -eq 1 ]; then - git checkout -- horizon/locale/en/LC_MESSAGES/django*.po - git checkout -- openstack_dashboard/locale/en/LC_MESSAGES/django.po - fi - exit $(($HORIZON_PY_RESULT || $HORIZON_JS_RESULT || $DASHBOARD_RESULT)) -} - -function run_compilemessages { - OPTS="--settings=openstack_dashboard.test.settings" - cd horizon - ${command_wrapper} $root/manage.py compilemessages $OPTS - HORIZON_PY_RESULT=$? - cd ../openstack_dashboard - ${command_wrapper} $root/manage.py compilemessages $OPTS - DASHBOARD_RESULT=$? - cd .. - # English is the source language, so compiled catalogs are unnecessary. - rm -vf horizon/locale/en/LC_MESSAGES/django*.mo - rm -vf openstack_dashboard/locale/en/LC_MESSAGES/django.mo - exit $(($HORIZON_PY_RESULT || $DASHBOARD_RESULT)) -} - -function run_pseudo { - for lang in $testargs - # Use English po file as the source file/pot file just like real Horizon translations - do - ${command_wrapper} $root/tools/pseudo.py openstack_dashboard/locale/en/LC_MESSAGES/django.po openstack_dashboard/locale/$lang/LC_MESSAGES/django.po $lang - ${command_wrapper} $root/tools/pseudo.py horizon/locale/en/LC_MESSAGES/django.po horizon/locale/$lang/LC_MESSAGES/django.po $lang - ${command_wrapper} $root/tools/pseudo.py horizon/locale/en/LC_MESSAGES/djangojs.po horizon/locale/$lang/LC_MESSAGES/djangojs.po $lang - done - exit $? -} - - -# ---------PREPARE THE ENVIRONMENT------------ # - -# PROCESS ARGUMENTS, OVERRIDE DEFAULTS -for arg in "$@"; do - process_option $arg -done - -if [ $quiet -eq 1 ] && [ $never_venv -eq 0 ] && [ $always_venv -eq 0 ] -then - always_venv=1 -fi - -# If destroy is set, just blow it away and exit. -if [ $destroy -eq 1 ]; then - destroy_venv - exit 0 -fi - -# Ignore all of this if the -N flag was set -if [ $never_venv -eq 0 ]; then - - # Restore previous environment if desired - if [ $restore_env -eq 1 ]; then - restore_environment - fi - - # Remove the virtual environment if --force used - if [ $force -eq 1 ]; then - destroy_venv - fi - - # Then check if it's up-to-date - environment_check - - # Create a backup of the up-to-date environment if desired - if [ $backup_env -eq 1 ]; then - backup_environment - fi -fi - -# ---------EXERCISE THE CODE------------ # - -# Run management commands -if [ $manage -eq 1 ]; then - run_management_command - exit $? -fi - -# Build the docs -if [ $just_docs -eq 1 ]; then - run_sphinx - exit $? -fi - -# Update translation files -if [ $makemessages -eq 1 ]; then - run_makemessages - exit $? -fi - -# Compile translation files -if [ $compilemessages -eq 1 ]; then - run_compilemessages - exit $? -fi - -# Generate Pseudo translation -if [ $pseudo -eq 1 ]; then - run_pseudo - exit $? -fi - -# PEP8 -if [ $just_pep8 -eq 1 ]; then - run_pep8 - exit $? -fi - -if [ $just_pep8_changed -eq 1 ]; then - run_pep8_changed - exit $? -fi - -# Pylint -if [ $just_pylint -eq 1 ]; then - run_pylint - exit $? -fi - -# Tab checker -if [ $just_tabs -eq 1 ]; then - tab_check - exit $? -fi - -# Integration tests -if [ $integration -eq 1 ]; then - run_integration_tests - exit $? -fi - -# Django development server -if [ $runserver -eq 1 ]; then - run_server - exit $? -fi - -# Full test suite -run_tests || exit diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index f095e55..0000000 --- a/setup.cfg +++ /dev/null @@ -1,32 +0,0 @@ -[metadata] -name = trove-dashboard -summary = Trove Management Dashboard -description-file = - README.rst -author = OpenStack -author-email = openstack-dev@lists.openstack.org -home-page = http://docs.openstack.org/developer/trove/ -classifier = - Environment :: OpenStack - Intended Audience :: Information Technology - Intended Audience :: System Administrators - License :: OSI Approved :: Apache Software License - Operating System :: POSIX :: Linux - Programming Language :: Python - Programming Language :: Python :: 2 - Programming Language :: Python :: 2.7 - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.3 - Programming Language :: Python :: 3.4 - -[files] -packages = - trove_dashboard - -[build_sphinx] -source-dir = doc/source -build-dir = doc/build -all_files = 1 - -[upload_sphinx] -upload-dir = doc/build/html diff --git a/setup.py b/setup.py deleted file mode 100644 index 782bb21..0000000 --- a/setup.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT -import setuptools - -# In python < 2.7.4, a lazy loading of package `pbr` will break -# setuptools if some other modules registered functions in `atexit`. -# solution from: http://bugs.python.org/issue15881#msg170215 -try: - import multiprocessing # noqa -except ImportError: - pass - -setuptools.setup( - setup_requires=['pbr>=1.8'], - pbr=True) diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index 5425992..0000000 --- a/test-requirements.txt +++ /dev/null @@ -1,20 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -hacking<0.11,>=0.10.0 -coverage>=3.6 -ddt>=0.7.0 -django-nose>=1.2 -mock>=1.2 -mox3>=0.7.0 -python-subunit>=0.0.18 -selenium -sphinx!=1.2.0,!=1.3b1,<1.3,>=1.1.2 -oslosphinx!=3.4.0,>=2.5.0 # Apache-2.0 -testrepository>=0.0.18 -testscenarios>=0.4 -testtools>=1.4.0 -# This also needs xvfb library installed on your OS -xvfbwrapper>=0.1.3 #license: MIT -reno>=1.6.2 # Apache2 diff --git a/tools/clean_enabled_files.py b/tools/clean_enabled_files.py deleted file mode 100644 index 5a30702..0000000 --- a/tools/clean_enabled_files.py +++ /dev/null @@ -1,45 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 temporarily needed to allow the conversion from integrated -# Sahara content in Horizon to plugin based content. Horizon currently defines -# the same module name data_processing and imports it by default. This utility -# removes the configuration files that are responsible for importing the old -# version of the module. Only Sahara content configuration files are effected -# in Horizon. - -import os - -from openstack_dashboard import enabled as local_enabled - -from trove_dashboard import enabled - -ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) -WITH_VENV = os.path.join(ROOT, 'tools', 'with_venv.sh') - -def main(): - src_path = os.path.dirname(enabled.__file__) - dest_path = os.path.dirname(local_enabled.__file__) - - src_files = os.listdir(src_path) - for file in src_files: - # skip the __init__.py or bad things happen - if file == "__init__.py": - continue - - file_path = os.path.join(dest_path, file) - if os.path.isfile(file_path): - print ("removing ", file_path) - os.remove(file_path) - -if __name__ == '__main__': - main() diff --git a/tools/install_venv.py b/tools/install_venv.py deleted file mode 100644 index bcb1f93..0000000 --- a/tools/install_venv.py +++ /dev/null @@ -1,160 +0,0 @@ -# Copyright 2012 United States Government as represented by the -# Administrator of the National Aeronautics and Space Administration. -# All Rights Reserved. -# -# Copyright 2012 OpenStack, LLC -# -# Copyright 2012 Nebula, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -Installation script for the OpenStack Dashboard development virtualenv. -""" - -import os -import subprocess -import sys - - -ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) -VENV = os.path.join(ROOT, '.venv') -WITH_VENV = os.path.join(ROOT, 'tools', 'with_venv.sh') -PIP_REQUIRES = os.path.join(ROOT, 'requirements.txt') -TEST_REQUIRES = os.path.join(ROOT, 'test-requirements.txt') -PIP_INSTALL_WRAPPER = os.path.join(ROOT, 'tools', 'pip_install.sh') - - -def die(message, *args): - print >> sys.stderr, message % args - sys.exit(1) - - -def run_command(cmd, redirect_output=True, check_exit_code=True, cwd=ROOT, - die_message=None): - """ - Runs a command in an out-of-process shell, returning the - output of that command. Working directory is ROOT. - """ - if redirect_output: - stdout = subprocess.PIPE - else: - stdout = None - - proc = subprocess.Popen(cmd, cwd=cwd, stdout=stdout) - output = proc.communicate()[0] - if check_exit_code and proc.returncode != 0: - if die_message is None: - die('Command "%s" failed.\n%s', ' '.join(cmd), output) - else: - die(die_message) - return output - - -HAS_EASY_INSTALL = bool(run_command(['which', 'easy_install'], - check_exit_code=False).strip()) -HAS_VIRTUALENV = bool(run_command(['which', 'virtualenv'], - check_exit_code=False).strip()) - - -def check_dependencies(): - """Make sure virtualenv is in the path.""" - - print 'Checking dependencies...' - if not HAS_VIRTUALENV: - print 'Virtual environment not found.' - # Try installing it via easy_install... - if HAS_EASY_INSTALL: - print 'Installing virtualenv via easy_install...', - run_command(['easy_install', 'virtualenv'], - die_message='easy_install failed to install virtualenv' - '\ndevelopment requires virtualenv, please' - ' install it using your favorite tool') - if not run_command(['which', 'virtualenv']): - die('ERROR: virtualenv not found in path.\n\ndevelopment ' - ' requires virtualenv, please install it using your' - ' favorite package management tool and ensure' - ' virtualenv is in your path') - print 'virtualenv installation done.' - else: - die('easy_install not found.\n\nInstall easy_install' - ' (python-setuptools in ubuntu) or virtualenv by hand,' - ' then rerun.') - print 'dependency check done.' - - -def create_virtualenv(venv=VENV): - """Creates the virtual environment and installs PIP only into the - virtual environment - """ - print 'Creating venv...', - run_command(['virtualenv', '-q', '--no-site-packages', VENV]) - print 'done.' - print 'Installing pip in virtualenv...', - if not run_command([WITH_VENV, 'easy_install', 'pip']).strip(): - die("Failed to install pip.") - print 'done.' - print 'Installing distribute in virtualenv...' - pip_install('distribute>=0.6.24') - print 'done.' - - -def pip_install(*args): - args = [WITH_VENV, 'pip', 'install', '--upgrade'] + list(args) - run_command(args, redirect_output=False) - - -def pip_install_with_horizon(*args): - args = [WITH_VENV, PIP_INSTALL_WRAPPER, 'unconstrained'] + list(args) - run_command(args, redirect_output=False) - - -def install_dependencies(venv=VENV): - print "Installing dependencies..." - print "(This may take several minutes, don't panic)" - pip_install_with_horizon('-r', TEST_REQUIRES) - pip_install_with_horizon('-r', PIP_REQUIRES) - - # Tell the virtual env how to "import dashboard" - py = 'python%d.%d' % (sys.version_info[0], sys.version_info[1]) - pthfile = os.path.join(venv, "lib", py, "site-packages", "dashboard.pth") - f = open(pthfile, 'w') - f.write("%s\n" % ROOT) - - -def install_horizon(): - print 'Installing horizon module in development mode...' - run_command([WITH_VENV, 'python', 'setup.py', 'develop'], cwd=ROOT) - - -def print_summary(): - summary = """ -Horizon development environment setup is complete. - -To activate the virtualenv for the extent of your current shell session you -can run: - -$ source .venv/bin/activate -""" - print summary - - -def main(): - check_dependencies() - create_virtualenv() - install_dependencies() - install_horizon() - print_summary() - -if __name__ == '__main__': - main() diff --git a/tools/pip_install.sh b/tools/pip_install.sh deleted file mode 100755 index c7568eb..0000000 --- a/tools/pip_install.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh - -# This script is borrowed from Sahara who borrowed from neutron-* repos. - -# Many of horizon's repos suffer from the problem of depending on horizon, -# but it not existing on pypi. - -# This wrapper for tox's package installer will use the existing package -# if it exists, else use zuul-cloner if that program exists, else grab it -# from horizon master via a hard-coded URL. That last case should only -# happen with devs running unit tests locally. - -# From the tox.ini config page: -# install_command=ARGV -# default: -# pip install {opts} {packages} - -ZUUL_CLONER=/usr/zuul-env/bin/zuul-cloner -BRANCH_NAME=master -horizon_installed=$(echo "import horizon" | python 2>/dev/null ; echo $?) - -set -e - -install_cmd="pip install $1" -shift - -if [ $horizon_installed -eq 0 ]; then - echo "ALREADY INSTALLED" > /tmp/tox_install.txt - echo "Horizon already installed; using existing package" -elif [ -x "$ZUUL_CLONER" ]; then - export ZUUL_BRANCH=${ZUUL_BRANCH-$BRANCH} - echo "ZUUL CLONER" > /tmp/tox_install.txt - cwd=$(/bin/pwd) - cd /tmp - $ZUUL_CLONER --cache-dir \ - /opt/git \ - --branch $BRANCH_NAME \ - git://git.openstack.org \ - openstack/horizon - cd openstack/horizon - $install_cmd -e . - cd "$cwd" -else - echo "PIP HARDCODE" > /tmp/tox_install.txt - if [ -z "$HORIZON_PIP_LOCATION" ]; then - HORIZON_PIP_LOCATION="git+https://git.openstack.org/openstack/horizon@$BRANCH_NAME#egg=horizon" - fi - $install_cmd -U -e ${HORIZON_PIP_LOCATION} -fi - -$install_cmd -U $* -exit $? diff --git a/tools/with_venv.sh b/tools/with_venv.sh deleted file mode 100755 index 7303990..0000000 --- a/tools/with_venv.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -TOOLS_PATH=${TOOLS_PATH:-$(dirname $0)} -VENV_PATH=${VENV_PATH:-${TOOLS_PATH}} -VENV_DIR=${VENV_NAME:-/../.venv} -TOOLS=${TOOLS_PATH} -VENV=${VENV:-${VENV_PATH}/${VENV_DIR}} -source ${VENV}/bin/activate && "$@" diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 7e34976..0000000 --- a/tox.ini +++ /dev/null @@ -1,67 +0,0 @@ -[tox] -minversion = 1.6 -envlist = py27,pep8,py27dj18 -skipsdist = True - -[testenv] -usedevelop = True -install_command = {toxinidir}/tools/pip_install.sh \ - -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} \ - {opts} {packages} -setenv = - VIRTUAL_ENV={envdir} -deps = -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -commands = /bin/bash run_tests.sh -N --no-pep8 {posargs} - -[testenv:py27] -setenv = DJANGO_SETTINGS_MODULE=trove_dashboard.test.settings - -[testenv:pep8] -commands = flake8 - -[testenv:venv] -# This target does not use script since we do not need to install horizon. -install_command = pip install \ - -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt} \ - -U --force-reinstall {opts} {packages} -commands = {posargs} - -# Django-1.8 is LTS -[testenv:py27dj18] -basepython = python2.7 -commands = pip install django>=1.8,<1.9 - /bin/bash run_tests.sh -N --no-pep8 {posargs} - -[testenv:py27dj19] -basepython = python2.7 -commands = pip install django>=1.9,<1.10 - /bin/bash run_tests.sh -N --no-pep8 {posargs} - -[testenv:py27dj110] -basepython = python2.7 -commands = pip install django>=1.10,<1.11 - /bin/bash run_tests.sh -N --no-pep8 {posargs} - -[testenv:py27integration] -basepython = python2.7 -commands = /bin/bash run_tests.sh -N --integration --selenium-headless {posargs} - -[testenv:cover] -commands = python setup.py testr --coverage --testr-args='{posargs}' - -[testenv:docs] -commands = python setup.py build_sphinx - -[testenv:debug] -commands = oslo_debug_helper {posargs} - -[testenv:releasenotes] -commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html - -[flake8] -show-source = True -# H405 multi line docstring summary not separated with an empty line -ignore = H405 -builtins = _ -exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,.ropeproject,tools,releasenotes diff --git a/trove_dashboard/__init__.py b/trove_dashboard/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/api/__init__.py b/trove_dashboard/api/__init__.py deleted file mode 100644 index 8ae9ece..0000000 --- a/trove_dashboard/api/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from trove_dashboard.api import trove - -__all__ = [ - "trove" -] diff --git a/trove_dashboard/api/rest/__init__.py b/trove_dashboard/api/rest/__init__.py deleted file mode 100644 index 8aa5ed2..0000000 --- a/trove_dashboard/api/rest/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# 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. - -# import REST API modules here -from trove_dashboard.api.rest import trove # noqa diff --git a/trove_dashboard/api/rest/trove.py b/trove_dashboard/api/rest/trove.py deleted file mode 100644 index 4347e2d..0000000 --- a/trove_dashboard/api/rest/trove.py +++ /dev/null @@ -1,82 +0,0 @@ -# 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. - -from django.views import generic - -from trove_dashboard.api import trove - -from openstack_dashboard.api.rest import urls -from openstack_dashboard.api.rest import utils as rest_utils - - -@urls.register -class Backup(generic.View): - """API for retrieving information about a single backup. - """ - url_regex = r'trove_dashboard/backups/(?P[^/]+)$' - - @rest_utils.ajax() - def get(self, request, backup_id): - """Get a specific backup. - """ - return trove.backup_get(request, backup_id).to_dict() - - -@urls.register -class Backups(generic.View): - """API for backups. - """ - url_regex = r'trove/backups/$' - - @rest_utils.ajax() - def get(self, request): - """Get a list of the Backups. - - The returned result is an object with property 'items' and each - item under this is a backup. - """ - result = trove.backup_list(request) - backups = [] - for b in result: - instance = trove.instance_get(request, b.instance_id) - backups.append({'id': b.id, - 'name': b.name, - 'datastore': b.datastore.get('type'), - 'datastoreversion': b.datastore.get('version'), - 'created': b.created, - 'database': instance.name, - 'incremental': bool(b.parent_id), - 'status': b.status - }) - return backups - - @rest_utils.ajax(data_required=True) - def delete(self, request): - """Delete one or more backup by name. - - Returns HTTP 204 (no content) on successful deletion. - """ - for backup_id in request.DATA: - trove.backup_delete(request, backup_id) - - @rest_utils.ajax(data_required=True) - def create(self, request): - """Create a new backup. - - Returns the new backup object on success. - """ - new_backup = trove.backup_create(request, **request.DATA) - return rest_utils.CreatedResponse( - '/api/messaging/backups/%s' % new_backup.name, - new_backup.to_dict()) diff --git a/trove_dashboard/api/trove.py b/trove_dashboard/api/trove.py deleted file mode 100644 index 079c5d7..0000000 --- a/trove_dashboard/api/trove.py +++ /dev/null @@ -1,403 +0,0 @@ -# Copyright 2013 Rackspace Hosting. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -from django.conf import settings -from troveclient.v1 import client - -from openstack_dashboard.api import base - -from horizon.utils import functions as utils -from horizon.utils.memoized import memoized # noqa - -LOG = logging.getLogger(__name__) - - -@memoized -def troveclient(request): - insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', False) - cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', None) - trove_url = base.url_for(request, 'database') - c = client.Client(request.user.username, - request.user.token.id, - project_id=request.user.project_id, - auth_url=trove_url, - insecure=insecure, - cacert=cacert, - http_log_debug=settings.DEBUG) - c.client.auth_token = request.user.token.id - c.client.management_url = trove_url - return c - - -def cluster_list(request, marker=None): - page_size = utils.get_page_size(request) - return troveclient(request).clusters.list(limit=page_size, marker=marker) - - -def cluster_get(request, cluster_id): - return troveclient(request).clusters.get(cluster_id) - - -def cluster_delete(request, cluster_id): - return troveclient(request).clusters.delete(cluster_id) - - -def cluster_create(request, name, volume, flavor, num_instances, - datastore, datastore_version, - nics=None, root_password=None, locality=None): - instances = [] - for i in range(num_instances): - instance = {} - instance["flavorRef"] = flavor - if volume > 0: - instance["volume"] = {'size': volume} - if nics: - instance["nics"] = [{"net-id": nics}] - instances.append(instance) - - # TODO(saurabhs): vertica needs root password on cluster create - return troveclient(request).clusters.create( - name, - datastore, - datastore_version, - instances=instances, - locality=locality) - - -def cluster_grow(request, cluster_id, new_instances): - instances = [] - for new_instance in new_instances: - instance = {} - instance["flavorRef"] = new_instance.flavor_id - if new_instance.volume > 0: - instance["volume"] = {'size': new_instance.volume} - if new_instance.name: - instance["name"] = new_instance.name - if new_instance.type: - instance["type"] = new_instance.type - if new_instance.related_to: - instance["related_to"] = new_instance.related_to - if new_instance.nics: - instance["nics"] = [{'net-id': new_instance.nics}] - instances.append(instance) - return troveclient(request).clusters.grow(cluster_id, instances) - - -def cluster_shrink(request, cluster_id, instances): - return troveclient(request).clusters.shrink(cluster_id, instances) - - -def create_cluster_root(request, cluster_id, password): - # It appears the code below depends on this trove change - # https://review.openstack.org/#/c/166954/. Comment out when that - # change merges. - # return troveclient(request).cluster.reset_root_password(cluster_id) - troveclient(request).root.create_cluster_root(cluster_id, password) - - -def instance_list(request, marker=None): - page_size = utils.get_page_size(request) - return troveclient(request).instances.list(limit=page_size, marker=marker) - - -def instance_list_all(request): - instances = instance_list(request) - marker = instances.next - while marker: - temp_instances = instance_list(request, marker=marker) - marker = temp_instances.next - for instance in temp_instances: - instances.append(instance) - instances.links = temp_instances.links - instances.next = None - return instances - - -def instance_get(request, instance_id): - return troveclient(request).instances.get(instance_id) - - -def instance_delete(request, instance_id): - return troveclient(request).instances.delete(instance_id) - - -def instance_create(request, name, volume, flavor, databases=None, - users=None, restore_point=None, nics=None, - datastore=None, datastore_version=None, - replica_of=None, replica_count=None, - volume_type=None, configuration=None, locality=None, - availability_zone=None): - # TODO(dklyle): adding conditional to support trove without volume - # support for now until API supports checking for volume support - if volume > 0: - volume_params = {'size': volume} - if volume_type: - volume_params['type'] = volume_type - else: - volume_params = None - return troveclient(request).instances.create( - name, - flavor, - volume=volume_params, - databases=databases, - users=users, - restorePoint=restore_point, - nics=nics, - datastore=datastore, - datastore_version=datastore_version, - replica_of=replica_of, - replica_count=replica_count, - configuration=configuration, - locality=locality, - availability_zone=availability_zone) - - -def instance_resize_volume(request, instance_id, size): - return troveclient(request).instances.resize_volume(instance_id, size) - - -def instance_resize(request, instance_id, flavor_id): - return troveclient(request).instances.resize_instance(instance_id, - flavor_id) - - -def instance_backups(request, instance_id): - return troveclient(request).instances.backups(instance_id) - - -def instance_restart(request, instance_id): - return troveclient(request).instances.restart(instance_id) - - -def instance_detach_replica(request, instance_id): - return troveclient(request).instances.edit(instance_id, - detach_replica_source=True) - - -def promote_to_replica_source(request, instance_id): - return troveclient(request).instances.promote_to_replica_source( - instance_id) - - -def eject_replica_source(request, instance_id): - return troveclient(request).instances.eject_replica_source(instance_id) - - -def instance_attach_configuration(request, instance_id, configuration): - return troveclient(request).instances.modify(instance_id, - configuration=configuration) - - -def instance_detach_configuration(request, instance_id): - return troveclient(request).instances.modify(instance_id) - - -def database_list(request, instance_id): - return troveclient(request).databases.list(instance_id) - - -def database_create(request, instance_id, db_name, character_set=None, - collation=None): - database = {'name': db_name} - if collation: - database['collate'] = collation - if character_set: - database['character_set'] = character_set - return troveclient(request).databases.create(instance_id, [database]) - - -def database_delete(request, instance_id, db_name): - return troveclient(request).databases.delete(instance_id, db_name) - - -def backup_list(request): - return troveclient(request).backups.list() - - -def backup_get(request, backup_id): - return troveclient(request).backups.get(backup_id) - - -def backup_delete(request, backup_id): - return troveclient(request).backups.delete(backup_id) - - -def backup_create(request, name, instance_id, description=None, - parent_id=None): - return troveclient(request).backups.create(name, instance_id, - description, parent_id) - - -def flavor_list(request): - return troveclient(request).flavors.list() - - -def datastore_flavors(request, datastore_name=None, - datastore_version=None): - # if datastore info is available then get datastore specific flavors - if datastore_name and datastore_version: - try: - return troveclient(request).flavors.\ - list_datastore_version_associated_flavors(datastore_name, - datastore_version) - except Exception: - LOG.warning("Failed to retrieve datastore specific flavors") - return flavor_list(request) - - -def flavor_get(request, flavor_id): - return troveclient(request).flavors.get(flavor_id) - - -def root_enable(request, instance_ids): - username, password = troveclient(request).root.create(instance_ids[0]) - return username, password - - -def root_show(request, instance_id): - return troveclient(request).root.is_root_enabled(instance_id) - - -def root_disable(request, instance_id): - return troveclient(request).root.delete(instance_id) - - -def users_list(request, instance_id): - return troveclient(request).users.list(instance_id) - - -def user_create(request, instance_id, username, password, - host=None, databases=[]): - user = {'name': username, 'password': password, 'databases': databases} - if host: - user['host'] = host - - return troveclient(request).users.create(instance_id, [user]) - - -def user_delete(request, instance_id, user, host=None): - return troveclient(request).users.delete(instance_id, user, hostname=host) - - -def user_update_attributes(request, instance_id, name, host=None, - new_name=None, new_password=None, new_host=None): - new_attributes = {} - if new_name: - new_attributes['name'] = new_name - if new_password: - new_attributes['password'] = new_password - if new_host: - new_attributes['host'] = new_host - return troveclient(request).users.update_attributes( - instance_id, name, newuserattr=new_attributes, hostname=host) - - -def user_list_access(request, instance_id, username, host=None): - return troveclient(request).users.list_access( - instance_id, username, hostname=host) - - -def user_grant_access(request, instance_id, username, databases, host=None): - return troveclient(request).users.grant( - instance_id, username, databases, hostname=host) - - -def user_revoke_access(request, instance_id, username, database, host=None): - return troveclient(request).users.revoke( - instance_id, username, database, hostname=host) - - -def user_show_access(request, instance_id, username, host=None): - return troveclient(request).users.list_access( - instance_id, username, hostname=host) - - -def datastore_list(request): - return troveclient(request).datastores.list() - - -def datastore_version_list(request, datastore): - return troveclient(request).datastore_versions.list(datastore) - - -def log_list(request, instance_id): - return troveclient(request).instances.log_list(instance_id) - - -def log_enable(request, instance_id, log_name): - return troveclient(request).instances.log_enable(instance_id, log_name) - - -def log_disable(request, instance_id, log_name): - return troveclient(request).instances.log_disable(instance_id, log_name) - - -def log_publish(request, instance_id, log_name): - return troveclient(request).instances.log_publish(instance_id, log_name) - - -def log_discard(request, instance_id, log_name): - return troveclient(request).instances.log_discard(instance_id, log_name) - - -def log_tail(request, instance_id, log_name, publish, lines, swift=None): - return troveclient(request).instances.log_generator(instance_id, - log_name, - publish=publish, - lines=lines, - swift=swift) - - -def configuration_list(request): - return troveclient(request).configurations.list() - - -def configuration_get(request, group_id): - return troveclient(request).configurations.get(group_id) - - -def configuration_parameters_list(request, datastore, datastore_version): - return troveclient(request).configuration_parameters.parameters( - datastore, datastore_version) - - -def configuration_create(request, - name, - values, - description=None, - datastore=None, - datastore_version=None): - return troveclient(request).configurations.create(name, - values, - description, - datastore, - datastore_version) - - -def configuration_delete(request, group_id): - return troveclient(request).configurations.delete(group_id) - - -def configuration_instances(request, group_id): - return troveclient(request).configurations.instances(group_id) - - -def configuration_update(request, group_id, values): - return troveclient(request).configurations.update(group_id, values) - - -def configuration_default(request, instance_id): - return troveclient(request).instances.configuration(instance_id) diff --git a/trove_dashboard/content/__init__.py b/trove_dashboard/content/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/content/database_backups/__init__.py b/trove_dashboard/content/database_backups/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/content/database_backups/panel.py b/trove_dashboard/content/database_backups/panel.py deleted file mode 100644 index 74fdfd3..0000000 --- a/trove_dashboard/content/database_backups/panel.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.utils.translation import ugettext_lazy as _ - -import horizon -from openstack_dashboard.dashboards.project import dashboard - - -class Backups(horizon.Panel): - name = _("Backups") - slug = 'database_backups' - permissions = ('openstack.services.database', - 'openstack.services.object-store',) - - -dashboard.Project.register(Backups) diff --git a/trove_dashboard/content/database_backups/tables.py b/trove_dashboard/content/database_backups/tables.py deleted file mode 100644 index 1e05b8c..0000000 --- a/trove_dashboard/content/database_backups/tables.py +++ /dev/null @@ -1,191 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.conf import settings -from django.core.urlresolvers import reverse -from django.template import defaultfilters as d_filters -from django.utils.translation import pgettext_lazy -from django.utils.translation import ugettext_lazy as _ -from django.utils.translation import ungettext_lazy - -from horizon import tables -from horizon.utils import filters - -from trove_dashboard import api - - -STATUS_CHOICES = ( - ("BUILDING", None), - ("COMPLETED", True), - ("DELETE_FAILED", False), - ("FAILED", False), - ("NEW", None), - ("SAVING", None), -) -STATUS_DISPLAY_CHOICES = ( - ("BUILDING", pgettext_lazy("Current status of a Database Backup", - u"Building")), - ("COMPLETED", pgettext_lazy("Current status of a Database Backup", - u"Completed")), - ("DELETE_FAILED", pgettext_lazy("Current status of a Database Backup", - u"Delete Failed")), - ("FAILED", pgettext_lazy("Current status of a Database Backup", - u"Failed")), - ("NEW", pgettext_lazy("Current status of a Database Backup", - u"New")), - ("SAVING", pgettext_lazy("Current status of a Database Backup", - u"Saving")), -) - - -class LaunchLink(tables.LinkAction): - name = "create" - verbose_name = _("Create Backup") - url = "horizon:project:database_backups:create" - classes = ("ajax-modal", "btn-create") - icon = "camera" - - -class RestoreLink(tables.LinkAction): - name = "restore" - verbose_name = _("Restore Backup") - url = "horizon:project:databases:launch" - classes = ("ajax-modal",) - icon = "cloud-upload" - - def allowed(self, request, backup=None): - return backup.status == 'COMPLETED' - - def get_link_url(self, datum): - url = reverse(self.url) - return url + '?backup=%s' % datum.id - - -class DownloadBackup(tables.LinkAction): - name = "download" - verbose_name = _("Download Backup") - url = 'horizon:project:containers:object_download' - classes = ("btn-download",) - - def get_link_url(self, datum): - ref = datum.locationRef.split('/') - container_name = ref[5] - object_path = '/'.join(ref[6:]) - return reverse(self.url, - kwargs={'container_name': container_name, - 'object_path': object_path}) - - def allowed(self, request, datum): - legacy_swift_panel_enabled = False - if ('swift_panel' in settings.HORIZON_CONFIG and - settings.HORIZON_CONFIG['swift_panel'] == 'legacy' and - datum.status == 'COMPLETED'): - legacy_swift_panel_enabled = True - return legacy_swift_panel_enabled - - -class DeleteBackup(tables.DeleteAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Delete Backup", - u"Delete Backups", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Deleted Backup", - u"Deleted Backups", - count - ) - - def delete(self, request, obj_id): - api.trove.backup_delete(request, obj_id) - - -class UpdateRow(tables.Row): - ajax = True - - def get_data(self, request, backup_id): - backup = api.trove.backup_get(request, backup_id) - try: - backup.instance = api.trove.instance_get(request, - backup.instance_id) - except Exception: - pass - return backup - - -def db_link(obj): - if not hasattr(obj, 'instance'): - return - if hasattr(obj.instance, 'name'): - return reverse( - 'horizon:project:databases:detail', - kwargs={'instance_id': obj.instance_id}) - - -def db_name(obj): - if not hasattr(obj, 'instance') or not hasattr(obj.instance, 'name'): - return obj.instance_id - return obj.instance.name - - -def get_datastore(obj): - if hasattr(obj, "datastore"): - return obj.datastore["type"] - return _("Not available") - - -def get_datastore_version(obj): - if hasattr(obj, "datastore"): - return obj.datastore["version"] - return _("Not available") - - -def is_incremental(obj): - return hasattr(obj, 'parent_id') and obj.parent_id is not None - - -class BackupsTable(tables.DataTable): - name = tables.Column("name", - link="horizon:project:database_backups:detail", - verbose_name=_("Name")) - datastore = tables.Column(get_datastore, - verbose_name=_("Datastore")) - datastore_version = tables.Column(get_datastore_version, - verbose_name=_("Datastore Version")) - created = tables.Column("created", verbose_name=_("Created"), - filters=[filters.parse_isotime]) - instance = tables.Column(db_name, link=db_link, - verbose_name=_("Database")) - incremental = tables.Column(is_incremental, - verbose_name=_("Incremental"), - filters=(d_filters.yesno, - d_filters.capfirst)) - status = tables.Column("status", - verbose_name=_("Status"), - status=True, - status_choices=STATUS_CHOICES, - display_choices=STATUS_DISPLAY_CHOICES) - - class Meta(object): - name = "backups" - verbose_name = _("Backups") - status_columns = ["status"] - row_class = UpdateRow - table_actions = (LaunchLink, DeleteBackup) - row_actions = (RestoreLink, DownloadBackup, DeleteBackup) diff --git a/trove_dashboard/content/database_backups/templates/database_backups/_backup_details_help.html b/trove_dashboard/content/database_backups/templates/database_backups/_backup_details_help.html deleted file mode 100644 index 163ef75..0000000 --- a/trove_dashboard/content/database_backups/templates/database_backups/_backup_details_help.html +++ /dev/null @@ -1,4 +0,0 @@ -{% load i18n %} - -

{% blocktrans trimmed %}Specify the details for the database backup.{% endblocktrans %}

-

{% blocktrans trimmed %}You can perform an incremental backup by specifying a parent backup. However, not all databases support incremental backups in which case this operation will result in an error.{% endblocktrans %}

diff --git a/trove_dashboard/content/database_backups/templates/database_backups/backup.html b/trove_dashboard/content/database_backups/templates/database_backups/backup.html deleted file mode 100644 index b8621b1..0000000 --- a/trove_dashboard/content/database_backups/templates/database_backups/backup.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{% trans "Backup Database" %}{% endblock %} - -{% block main %} - {% include 'horizon/common/_workflow.html' %} -{% endblock %} diff --git a/trove_dashboard/content/database_backups/templates/database_backups/details.html b/trove_dashboard/content/database_backups/templates/database_backups/details.html deleted file mode 100644 index 3567fa0..0000000 --- a/trove_dashboard/content/database_backups/templates/database_backups/details.html +++ /dev/null @@ -1,74 +0,0 @@ -{% extends 'base.html' %} -{% load i18n sizeformat %} -{% block title %}{% trans "Backup Details" %}{% endblock %} - -{% block main %} -
-
-

{% trans "Backup Overview" %}

- -
-

{% trans "Information" %}

-
-
-
{% trans "Name" %}
-
{{ backup.name }}
-
{% trans "Description" %}
-
{{ backup.description|linebreaksbr }}
-
{% trans "ID" %}
-
{{ backup.id }}
- {% if backup.datastore %} -
{% trans "Datastore" %}
-
{{ backup.datastore.type }}
-
{% trans "Datastore Version" %}
-
{{ backup.datastore.version }}
- {% endif %} -
{% trans "Status" %}
-
{{ backup.status|title }}
-
{% trans "Backup File Location" %}
-
{{ backup.locationRef }}
-
{% trans "Initial Volume Size" %}
-
{{ backup.size }} {% trans "GB" %}
-
{% trans "Created" %}
-
{{ backup.created|parse_isotime }}
-
{% trans "Updated" %}
-
{{ backup.updated|parse_isotime }}
-
{% trans "Backup Duration" %}
-
{{ backup.duration }}
-
-
- - {% if backup.parent %} -
-

{% trans "Incremental Backup" %}

-
-
-
{% trans "Parent Backup" %}
-
- {% url 'horizon:project:database_backups:detail' backup.parent.id as parent_url %} - {{ backup.parent.name }} -
-
-
- {% endif %} - - {% if instance %} -
-

{% trans "Database Info" %}

-
-
-
{% trans "Name" %}
-
{{ instance.name }}
-
{% trans "ID" %}
-
- {% url 'horizon:project:databases:detail' instance.id as instance_url %} - {{ instance.id }} -
-
{% trans "Status" %}
-
{{ instance.status|title }}
-
-
- {% endif %} -
-
-{% endblock %} diff --git a/trove_dashboard/content/database_backups/templates/database_backups/index.html b/trove_dashboard/content/database_backups/templates/database_backups/index.html deleted file mode 100644 index 6520926..0000000 --- a/trove_dashboard/content/database_backups/templates/database_backups/index.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{% trans "Database Backups" %}{% endblock %} - -{% block main %} - {{ table.render }} -{% endblock %} diff --git a/trove_dashboard/content/database_backups/tests.py b/trove_dashboard/content/database_backups/tests.py deleted file mode 100644 index 2db9a04..0000000 --- a/trove_dashboard/content/database_backups/tests.py +++ /dev/null @@ -1,193 +0,0 @@ -# Copyright 2013 Mirantis Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.core.urlresolvers import reverse -from django import http -from mox3.mox import IsA # noqa -import six - -from openstack_auth import policy - -from trove_dashboard import api -from trove_dashboard.test import helpers as test - -INDEX_URL = reverse('horizon:project:database_backups:index') -BACKUP_URL = reverse('horizon:project:database_backups:create') -DETAILS_URL = reverse('horizon:project:database_backups:detail', args=['id']) - - -class DatabasesBackupsTests(test.TestCase): - @test.create_stubs({api.trove: ('backup_list', 'instance_get')}) - def test_index(self): - api.trove.backup_list(IsA(http.HttpRequest))\ - .AndReturn(self.database_backups.list()) - - api.trove.instance_get(IsA(http.HttpRequest), - IsA(str))\ - .MultipleTimes()\ - .AndReturn(self.databases.first()) - - self.mox.ReplayAll() - - res = self.client.get(INDEX_URL) - - self.assertTemplateUsed(res, 'project/database_backups/index.html') - - @test.create_stubs({api.trove: ('backup_list',)}) - def test_index_exception(self): - api.trove.backup_list(IsA(http.HttpRequest))\ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - res = self.client.get(INDEX_URL) - - self.assertTemplateUsed( - res, 'project/database_backups/index.html') - self.assertEqual(res.status_code, 200) - self.assertMessageCount(res, error=1) - - @test.create_stubs({ - api.trove: ('instance_list', 'backup_list', 'backup_create'), - policy: ('check',), - }) - def test_launch_backup(self): - policy.check((), IsA(http.HttpRequest)).MultipleTimes().AndReturn(True) - api.trove.instance_list(IsA(http.HttpRequest))\ - .AndReturn(self.databases.list()) - api.trove.backup_list(IsA(http.HttpRequest)) \ - .AndReturn(self.database_backups.list()) - - database = self.databases.first() - backupName = "NewBackup" - backupDesc = "Backup Description" - - api.trove.backup_create( - IsA(http.HttpRequest), - backupName, - database.id, - backupDesc, - "") - - self.mox.ReplayAll() - - post = { - 'name': backupName, - 'instance': database.id, - 'description': backupDesc, - 'parent': "" - } - res = self.client.post(BACKUP_URL, post) - - self.assertNoFormErrors(res) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('instance_list', 'backup_list'), - policy: ('check',), - }) - def test_launch_backup_exception(self): - policy.check((), IsA(http.HttpRequest)).MultipleTimes().AndReturn(True) - api.trove.instance_list(IsA(http.HttpRequest))\ - .AndRaise(self.exceptions.trove) - api.trove.backup_list(IsA(http.HttpRequest)) \ - .AndReturn(self.database_backups.list()) - - self.mox.ReplayAll() - - res = self.client.get(BACKUP_URL) - self.assertMessageCount(res, error=1) - self.assertTemplateUsed(res, - 'project/database_backups/backup.html') - - @test.create_stubs({ - api.trove: ('instance_list', 'backup_list', 'backup_create'), - policy: ('check',), - }) - def test_launch_backup_incr(self): - policy.check((), IsA(http.HttpRequest)).MultipleTimes().AndReturn(True) - api.trove.instance_list(IsA(http.HttpRequest)) \ - .AndReturn(self.databases.list()) - api.trove.backup_list(IsA(http.HttpRequest)) \ - .AndReturn(self.database_backups.list()) - - database = self.databases.first() - backupName = "NewBackup" - backupDesc = "Backup Description" - backupParent = self.database_backups.first() - - api.trove.backup_create( - IsA(http.HttpRequest), - backupName, - database.id, - backupDesc, - backupParent.id) - - self.mox.ReplayAll() - - post = { - 'name': backupName, - 'instance': database.id, - 'description': backupDesc, - 'parent': backupParent.id, - } - res = self.client.post(BACKUP_URL, post) - - self.assertNoFormErrors(res) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({api.trove: ('backup_get', 'instance_get')}) - def test_detail_backup(self): - api.trove.backup_get(IsA(http.HttpRequest), - IsA(six.text_type))\ - .AndReturn(self.database_backups.first()) - - api.trove.instance_get(IsA(http.HttpRequest), - IsA(str))\ - .AndReturn(self.databases.first()) - - self.mox.ReplayAll() - res = self.client.get(DETAILS_URL) - - self.assertTemplateUsed(res, - 'project/database_backups/details.html') - - @test.create_stubs({api.trove: ('backup_get',)}) - def test_detail_backup_notfound(self): - api.trove.backup_get(IsA(http.HttpRequest), - IsA(six.text_type))\ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - res = self.client.get(DETAILS_URL) - - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({api.trove: ('backup_get', 'instance_get')}) - def test_detail_backup_incr(self): - incr_backup = self.database_backups.list()[2] - parent_backup = self.database_backups.list()[1] - - api.trove.backup_get(IsA(http.HttpRequest), IsA(six.text_type))\ - .AndReturn(incr_backup) - api.trove.backup_get(IsA(http.HttpRequest), incr_backup.parent_id) \ - .AndReturn(parent_backup) - api.trove.instance_get(IsA(http.HttpRequest), IsA(str))\ - .AndReturn(self.databases.list()[1]) - - self.mox.ReplayAll() - url = reverse('horizon:project:database_backups:detail', - args=[incr_backup.id]) - res = self.client.get(url) - self.assertTemplateUsed(res, 'project/database_backups/details.html') diff --git a/trove_dashboard/content/database_backups/urls.py b/trove_dashboard/content/database_backups/urls.py deleted file mode 100644 index 1f7555c..0000000 --- a/trove_dashboard/content/database_backups/urls.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.conf.urls import url - -from trove_dashboard.content.database_backups import views - -urlpatterns = [ - url(r'^$', views.IndexView.as_view(), name='index'), - url(r'^create$', views.BackupView.as_view(), name='create'), - url(r'^(?P[^/]+)/$', views.DetailView.as_view(), - name='detail'), -] diff --git a/trove_dashboard/content/database_backups/views.py b/trove_dashboard/content/database_backups/views.py deleted file mode 100644 index d2fe462..0000000 --- a/trove_dashboard/content/database_backups/views.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -Views for displaying database backups. -""" -from django.core.urlresolvers import reverse -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import tables as horizon_tables -from horizon.utils import filters -from horizon import views as horizon_views -from horizon import workflows as horizon_workflows - -from trove_dashboard import api -from trove_dashboard.content.database_backups import tables -from trove_dashboard.content.database_backups \ - import workflows - - -class IndexView(horizon_tables.DataTableView): - table_class = tables.BackupsTable - template_name = 'project/database_backups/index.html' - page_title = _("Backups") - - def _get_extra_data(self, backup): - """Apply extra info to the backup.""" - instance_id = backup.instance_id - # TODO(rdopieralski) It's not clear where this attribute is supposed - # to come from. At first glance it looks like it will always be {}. - if not hasattr(self, '_instances'): - self._instances = {} - instance = self._instances.get(instance_id) - if instance is None: - try: - instance = api.trove.instance_get(self.request, instance_id) - except Exception: - instance = _('Not Found') - backup.instance = instance - return backup - - def get_data(self): - # TODO(rmyers) Add pagination support after it is available - # https://blueprints.launchpad.net/trove/+spec/paginate-backup-list - try: - backups = api.trove.backup_list(self.request) - backups = map(self._get_extra_data, backups) - except Exception: - backups = [] - msg = _('Error getting database backup list.') - exceptions.handle(self.request, msg) - return backups - - -class BackupView(horizon_workflows.WorkflowView): - workflow_class = workflows.CreateBackup - template_name = "project/database_backups/backup.html" - page_title = _("Backup Database") - - def get_context_data(self, **kwargs): - context = super(BackupView, self).get_context_data(**kwargs) - context["instance_id"] = kwargs.get("instance_id") - self._instance = context['instance_id'] - return context - - -class DetailView(horizon_views.APIView): - template_name = "project/database_backups/details.html" - page_title = _("Backup Details: {{ backup.name }}") - - def get_data(self, request, context, *args, **kwargs): - backup_id = kwargs.get("backup_id") - try: - backup = api.trove.backup_get(request, backup_id) - created_at = filters.parse_isotime(backup.created) - updated_at = filters.parse_isotime(backup.updated) - backup.duration = updated_at - created_at - except Exception: - redirect = reverse('horizon:project:database_backups:index') - msg = _('Unable to retrieve details for backup: %s') % backup_id - exceptions.handle(self.request, msg, redirect=redirect) - - try: - if(hasattr(backup, 'parent_id') and backup.parent_id is not None): - backup.parent = api.trove.backup_get(request, backup.parent_id) - except Exception: - redirect = reverse('horizon:project:database_backups:index') - msg = (_('Unable to retrieve details for parent backup: %s') - % backup.parent_id) - exceptions.handle(self.request, msg, redirect=redirect) - - try: - instance = api.trove.instance_get(request, backup.instance_id) - except Exception: - instance = None - context['backup'] = backup - context['instance'] = instance - return context diff --git a/trove_dashboard/content/database_backups/workflows/__init__.py b/trove_dashboard/content/database_backups/workflows/__init__.py deleted file mode 100644 index bdf3bcd..0000000 --- a/trove_dashboard/content/database_backups/workflows/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Importing non-modules that are not used explicitly - -from .create_backup import CreateBackup # noqa diff --git a/trove_dashboard/content/database_backups/workflows/create_backup.py b/trove_dashboard/content/database_backups/workflows/create_backup.py deleted file mode 100644 index e1b8ca8..0000000 --- a/trove_dashboard/content/database_backups/workflows/create_backup.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import forms -from horizon import workflows - -from trove_dashboard import api -from trove_dashboard.content.databases \ - import tables as project_tables - - -LOG = logging.getLogger(__name__) - - -class BackupDetailsAction(workflows.Action): - name = forms.CharField(max_length=80, label=_("Name")) - instance = forms.ChoiceField(label=_("Database Instance")) - description = forms.CharField(max_length=512, label=_("Description"), - widget=forms.TextInput(), - required=False, - help_text=_("Optional Backup Description")) - parent = forms.ChoiceField(label=_("Parent Backup"), - required=False, - help_text=_("Optional parent backup")) - - class Meta(object): - name = _("Details") - help_text_template = \ - "project/database_backups/_backup_details_help.html" - - def populate_instance_choices(self, request, context): - LOG.info("Obtaining list of instances.") - try: - instances = api.trove.instance_list(request) - except Exception: - instances = [] - msg = _("Unable to list database instances to backup.") - exceptions.handle(request, msg) - return [(i.id, i.name) for i in instances - if i.status in project_tables.ACTIVE_STATES] - - def populate_parent_choices(self, request, context): - try: - backups = api.trove.backup_list(request) - choices = [(b.id, b.name) for b in backups - if b.status == 'COMPLETED'] - except Exception: - choices = [] - msg = _("Unable to list database backups for parent.") - exceptions.handle(request, msg) - - if choices: - choices.insert(0, ("", _("Select parent backup"))) - else: - choices.insert(0, ("", _("No backups available"))) - return choices - - -class SetBackupDetails(workflows.Step): - action_class = BackupDetailsAction - contributes = ["name", "description", "instance", "parent"] - - -class CreateBackup(workflows.Workflow): - slug = "create_backup" - name = _("Backup Database") - finalize_button_name = _("Backup") - success_message = _('Scheduled backup "%(name)s".') - failure_message = _('Unable to launch %(count)s named "%(name)s".') - success_url = "horizon:project:database_backups:index" - default_steps = [SetBackupDetails] - - def get_initial(self): - initial = super(CreateBackup, self).get_initial() - initial['instance_id'] - - def format_status_message(self, message): - name = self.context.get('name', 'unknown instance') - return message % {"count": _("instance"), "name": name} - - def handle(self, request, context): - try: - LOG.info("Creating backup") - api.trove.backup_create(request, - context['name'], - context['instance'], - context['description'], - context['parent']) - return True - except Exception: - LOG.exception("Exception while creating backup") - msg = _('Error creating database backup.') - exceptions.handle(request, msg) - return False diff --git a/trove_dashboard/content/database_clusters/__init__.py b/trove_dashboard/content/database_clusters/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/content/database_clusters/cluster_manager.py b/trove_dashboard/content/database_clusters/cluster_manager.py deleted file mode 100644 index ffc10c6..0000000 --- a/trove_dashboard/content/database_clusters/cluster_manager.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright 2016 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -from django.core import cache - - -def get(cluster_id): - if not has_cluster(cluster_id): - manager = ClusterInstanceManager(cluster_id) - cache.cache.set(cluster_id, manager) - - return cache.cache.get(cluster_id) - - -def delete(cluster_id): - manager = get(cluster_id) - manager.clear_instances() - cache.cache.delete(cluster_id) - - -def update(cluster_id, manager): - cache.cache.set(cluster_id, manager) - - -def has_cluster(cluster_id): - if cache.cache.get(cluster_id): - return True - else: - return False - - -class ClusterInstanceManager(object): - def __init__(self, cluster_id): - self.cluster_id = cluster_id - self.instances = [] - - def get_instances(self): - if not hasattr(self, 'instances'): - self.instances = [] - return self.instances - - def get_instance(self, id): - for instance in self.get_instances(): - if instance.id == id: - return instance - return None - - def add_instance(self, id, name, flavor_id, - flavor, volume, type, related_to, nics): - instance = ClusterInstance(id, name, flavor_id, flavor, - volume, type, related_to, nics) - self.instances.append(instance) - update(self.cluster_id, self) - return self.get_instances() - - def delete_instance(self, id): - instance = self.get_instance(id) - if instance: - self.instances.remove(instance) - update(self.cluster_id, self) - - def clear_instances(self): - self.instances = [] - update(self.cluster_id, self) - - -class ClusterInstance(object): - def __init__(self, id, name, flavor_id, flavor, volume, type, - related_to, nics): - self.id = id - self.name = name - self.flavor_id = flavor_id - self.flavor = flavor - self.volume = volume - self.type = type - self.related_to = related_to - self.nics = nics diff --git a/trove_dashboard/content/database_clusters/forms.py b/trove_dashboard/content/database_clusters/forms.py deleted file mode 100644 index b4bb224..0000000 --- a/trove_dashboard/content/database_clusters/forms.py +++ /dev/null @@ -1,493 +0,0 @@ -# Copyright 2015 HP Software, LLC -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import binascii -import collections -import logging -import uuid - -from django.core.urlresolvers import reverse -from django.utils.translation import ugettext_lazy as _ -from django.views.decorators.debug import sensitive_variables # noqa - -from horizon import exceptions -from horizon import forms -from horizon import messages -from horizon.utils import memoized -from openstack_dashboard import api - -from openstack_dashboard.dashboards.project.instances \ - import utils as instance_utils -from trove_dashboard import api as trove_api -from trove_dashboard.content.database_clusters \ - import cluster_manager -from trove_dashboard.content.databases import db_capability -from trove_dashboard.content.databases.workflows \ - import create_instance - -LOG = logging.getLogger(__name__) - - -class LaunchForm(forms.SelfHandlingForm): - name = forms.CharField(label=_("Cluster Name"), - max_length=80) - datastore = forms.ChoiceField( - label=_("Datastore"), - help_text=_("Type and version of datastore."), - widget=forms.Select(attrs={ - 'class': 'switchable', - 'data-slug': 'datastore' - })) - network = forms.ChoiceField( - label=_("Network"), - help_text=_("Network attached to instance."), - required=False) - volume = forms.IntegerField( - label=_("Volume Size"), - min_value=0, - initial=1, - help_text=_("Size of the volume in GB.")) - locality = forms.ChoiceField( - label=_("Locality"), - choices=[("", "None"), - ("affinity", "affinity"), - ("anti-affinity", "anti-affinity")], - required=False, - help_text=_("Specify whether instances in the cluster will " - "be created on the same hypervisor (affinity) or on " - "different hypervisors (anti-affinity).")) - root_password = forms.CharField( - label=_("Root Password"), - required=False, - help_text=_("Password for root user."), - widget=forms.PasswordInput(attrs={ - 'class': 'switched', - 'data-switch-on': 'datastore', - })) - num_instances_vertica = forms.IntegerField( - label=_("Number of Instances"), - min_value=3, - initial=3, - required=False, - help_text=_("Number of instances in the cluster. (Read only)"), - widget=forms.TextInput(attrs={ - 'readonly': 'readonly', - 'class': 'switched', - 'data-switch-on': 'datastore', - })) - num_shards = forms.IntegerField( - label=_("Number of Shards"), - min_value=1, - initial=1, - required=False, - help_text=_("Number of shards. (Read only)"), - widget=forms.TextInput(attrs={ - 'readonly': 'readonly', - 'class': 'switched', - 'data-switch-on': 'datastore', - })) - num_instances = forms.IntegerField( - label=_("Number of Instances"), - initial=3, - required=False, - help_text=_("Number of instances in the cluster."), - widget=forms.TextInput(attrs={ - 'class': 'switched', - 'data-switch-on': 'datastore', - })) - - # (name of field variable, label) - default_fields = [ - ('num_instances', _('Number of Instances')) - ] - mongodb_fields = default_fields + [ - ('num_shards', _('Number of Shards')), - ] - vertica_fields = [ - ('num_instances_vertica', ('Number of Instances')), - ('root_password', _('Root Password')), - ] - - def __init__(self, request, *args, **kwargs): - super(LaunchForm, self).__init__(request, *args, **kwargs) - - self.fields['datastore'].choices = self.populate_datastore_choices( - request) - self.fields['network'].choices = self.populate_network_choices( - request) - - def clean(self): - datastore_field_value = self.data.get("datastore", None) - if datastore_field_value: - datastore, datastore_version = ( - create_instance.parse_datastore_and_version_text( - binascii.unhexlify(datastore_field_value))) - - flavor_field_name = self._build_widget_field_name( - datastore, datastore_version) - if not self.data.get(flavor_field_name, None): - msg = _("The flavor must be specified.") - self._errors[flavor_field_name] = self.error_class([msg]) - - if db_capability.is_vertica_datastore(datastore): - if not self.data.get("root_password", None): - msg = _("Password for root user must be specified.") - self._errors["root_password"] = self.error_class([msg]) - else: - if int(self.data.get("num_instances", 0)) < 1: - msg = _("The number of instances must be greater than 1.") - self._errors["num_instances"] = self.error_class([msg]) - - if db_capability.is_mongodb_datastore(datastore): - if int(self.data.get("num_shards", 0)) < 1: - msg = _("The number of shards must be greater than 1.") - self._errors["num_shards"] = self.error_class([msg]) - - if not self.data.get("locality", None): - self.cleaned_data["locality"] = None - - return self.cleaned_data - - @memoized.memoized_method - def datastore_flavors(self, request, datastore_name, datastore_version): - try: - return trove_api.trove.datastore_flavors( - request, datastore_name, datastore_version) - except Exception: - LOG.exception("Exception while obtaining flavors list") - self._flavors = [] - redirect = reverse('horizon:project:database_clusters:index') - exceptions.handle(request, - _('Unable to obtain flavors.'), - redirect=redirect) - - @memoized.memoized_method - def populate_network_choices(self, request): - network_list = [] - try: - if api.base.is_service_enabled(request, 'network'): - tenant_id = self.request.user.tenant_id - networks = api.neutron.network_list_for_tenant(request, - tenant_id) - network_list = [(network.id, network.name_or_id) - for network in networks] - else: - self.fields['network'].widget = forms.HiddenInput() - except exceptions.ServiceCatalogException: - network_list = [] - redirect = reverse('horizon:project:database_clusters:index') - exceptions.handle(request, - _('Unable to retrieve networks.'), - redirect=redirect) - return network_list - - @memoized.memoized_method - def datastores(self, request): - try: - return trove_api.trove.datastore_list(request) - except Exception: - LOG.exception("Exception while obtaining datastores list") - self._datastores = [] - redirect = reverse('horizon:project:database_clusters:index') - exceptions.handle(request, - _('Unable to obtain datastores.'), - redirect=redirect) - - def filter_cluster_datastores(self, request): - datastores = [] - for ds in self.datastores(request): - # TODO(michayu): until capabilities lands - if db_capability.is_cluster_capable_datastore(ds.name): - datastores.append(ds) - return datastores - - @memoized.memoized_method - def datastore_versions(self, request, datastore): - try: - return trove_api.trove.datastore_version_list(request, datastore) - except Exception: - LOG.exception("Exception while obtaining datastore version list") - self._datastore_versions = [] - redirect = reverse('horizon:project:database_clusters:index') - exceptions.handle(request, - _('Unable to obtain datastore versions.'), - redirect=redirect) - - def populate_datastore_choices(self, request): - choices = () - datastores = self.filter_cluster_datastores(request) - if datastores is not None: - datastore_flavor_fields = {} - for ds in datastores: - versions = self.datastore_versions(request, ds.name) - if versions: - # only add to choices if datastore has at least one version - version_choices = () - for v in versions: - if hasattr(v, 'active') and not v.active: - continue - selection_text = self._build_datastore_display_text( - ds.name, v.name) - widget_text = self._build_widget_field_name( - ds.name, v.name) - version_choices = (version_choices + - ((widget_text, selection_text),)) - k, v = self._add_datastore_flavor_field(request, - ds.name, - v.name) - datastore_flavor_fields[k] = v - self._add_attr_to_optional_fields(ds.name, - widget_text) - - choices = choices + version_choices - self._insert_datastore_version_fields(datastore_flavor_fields) - return choices - - def _add_datastore_flavor_field(self, - request, - datastore, - datastore_version): - name = self._build_widget_field_name(datastore, datastore_version) - attr_key = 'data-datastore-' + name - field = forms.ChoiceField( - label=_("Flavor"), - help_text=_("Size of image to launch."), - required=False, - widget=forms.Select(attrs={ - 'class': 'switched', - 'data-switch-on': 'datastore', - attr_key: _("Flavor") - })) - valid_flavors = self.datastore_flavors(request, - datastore, - datastore_version) - if valid_flavors: - field.choices = instance_utils.sort_flavor_list( - request, valid_flavors) - - return name, field - - def _build_datastore_display_text(self, datastore, datastore_version): - return datastore + ' - ' + datastore_version - - def _build_widget_field_name(self, datastore, datastore_version): - # Since the fieldnames cannot contain an uppercase character - # we generate a hex encoded string representation of the - # datastore and version as the fieldname - return binascii.hexlify( - self._build_datastore_display_text(datastore, datastore_version)) - - def _insert_datastore_version_fields(self, datastore_flavor_fields): - fields_to_restore_at_the_end = collections.OrderedDict() - while True: - k, v = self.fields.popitem() - if k == 'datastore': - self.fields[k] = v - break - else: - fields_to_restore_at_the_end[k] = v - - for k, v in datastore_flavor_fields.iteritems(): - self.fields[k] = v - - for k in reversed(fields_to_restore_at_the_end.keys()): - self.fields[k] = fields_to_restore_at_the_end[k] - - def _add_attr_to_optional_fields(self, datastore, selection_text): - if db_capability.is_mongodb_datastore(datastore): - fields = self.mongodb_fields - elif db_capability.is_vertica_datastore(datastore): - fields = self.vertica_fields - else: - fields = self.default_fields - - for field in fields: - attr_key = 'data-datastore-' + selection_text - widget = self.fields[field[0]].widget - if attr_key not in widget.attrs: - widget.attrs[attr_key] = field[1] - - def _get_locality(self, data): - locality = None - if data.get('locality'): - locality = data['locality'] - return locality - - @sensitive_variables('data') - def handle(self, request, data): - try: - datastore, datastore_version = ( - create_instance.parse_datastore_and_version_text( - binascii.unhexlify(data['datastore']))) - - flavor_field_name = self._build_widget_field_name( - datastore, datastore_version) - flavor = data[flavor_field_name] - num_instances = data['num_instances'] - root_password = None - if db_capability.is_vertica_datastore(datastore): - root_password = data['root_password'] - num_instances = data['num_instances_vertica'] - LOG.info("Launching cluster with parameters " - "{name=%s, volume=%s, flavor=%s, " - "datastore=%s, datastore_version=%s", - "locality=%s", - data['name'], data['volume'], flavor, - datastore, datastore_version, self._get_locality(data)) - - trove_api.trove.cluster_create(request, - data['name'], - data['volume'], - flavor, - num_instances, - datastore=datastore, - datastore_version=datastore_version, - nics=data['network'], - root_password=root_password, - locality=self._get_locality(data)) - messages.success(request, - _('Launched cluster "%s"') % data['name']) - return True - except Exception as e: - redirect = reverse("horizon:project:database_clusters:index") - exceptions.handle(request, - _('Unable to launch cluster. %s') % e.message, - redirect=redirect) - - -class ClusterAddInstanceForm(forms.SelfHandlingForm): - cluster_id = forms.CharField( - required=False, - widget=forms.HiddenInput()) - flavor = forms.ChoiceField( - label=_("Flavor"), - help_text=_("Size of image to launch.")) - volume = forms.IntegerField( - label=_("Volume Size"), - min_value=0, - initial=1, - help_text=_("Size of the volume in GB.")) - name = forms.CharField( - label=_("Name"), - required=False, - help_text=_("Optional name of the instance.")) - type = forms.CharField( - label=_("Instance Type"), - required=False, - help_text=_("Optional datastore specific type of the instance.")) - related_to = forms.CharField( - label=_("Related To"), - required=False, - help_text=_("Optional datastore specific value that defines the " - "relationship from one instance in the cluster to " - "another.")) - network = forms.ChoiceField( - label=_("Network"), - help_text=_("Network attached to instance."), - required=False) - - def __init__(self, request, *args, **kwargs): - super(ClusterAddInstanceForm, self).__init__(request, *args, **kwargs) - self.fields['cluster_id'].initial = kwargs['initial']['cluster_id'] - self.fields['flavor'].choices = self.populate_flavor_choices(request) - self.fields['network'].choices = self.populate_network_choices( - request) - - @memoized.memoized_method - def flavors(self, request): - try: - datastore = None - datastore_version = None - datastore_dict = self.initial.get('datastore', None) - if datastore_dict: - datastore = datastore_dict.get('type', None) - datastore_version = datastore_dict.get('version', None) - return trove_api.trove.datastore_flavors( - request, - datastore_name=datastore, - datastore_version=datastore_version) - except Exception: - LOG.exception("Exception while obtaining flavors list") - self._flavors = [] - redirect = reverse('horizon:project:database_clusters:index') - exceptions.handle(request, - _('Unable to obtain flavors.'), - redirect=redirect) - - def populate_flavor_choices(self, request): - flavor_list = [(f.id, "%s" % f.name) for f in self.flavors(request)] - return sorted(flavor_list) - - @memoized.memoized_method - def populate_network_choices(self, request): - network_list = [] - try: - if api.base.is_service_enabled(request, 'network'): - tenant_id = self.request.user.tenant_id - networks = api.neutron.network_list_for_tenant(request, - tenant_id) - network_list = [(network.id, network.name_or_id) - for network in networks] - else: - self.fields['network'].widget = forms.HiddenInput() - except exceptions.ServiceCatalogException: - network_list = [] - redirect = reverse('horizon:project:database_clusters:index') - exceptions.handle(request, - _('Unable to retrieve networks.'), - redirect=redirect) - return network_list - - def handle(self, request, data): - try: - flavor = trove_api.trove.flavor_get(request, data['flavor']) - manager = cluster_manager.get(data['cluster_id']) - manager.add_instance(str(uuid.uuid4()), - data.get('name', None), - data['flavor'], - flavor.name, - data['volume'], - data.get('type', None), - data.get('related_to', None), - data.get('network', None)) - except Exception as e: - redirect = reverse("horizon:project:database_clusters:index") - exceptions.handle(request, - _('Unable to grow cluster. %s') % e.message, - redirect=redirect) - return True - - -class ResetPasswordForm(forms.SelfHandlingForm): - cluster_id = forms.CharField(widget=forms.HiddenInput()) - password = forms.CharField(widget=forms.PasswordInput(), - label=_("New Password"), - help_text=_("New password for cluster access.")) - - @sensitive_variables('data') - def handle(self, request, data): - password = data.get("password") - cluster_id = data.get("cluster_id") - try: - trove_api.trove.create_cluster_root(request, - cluster_id, - password) - messages.success(request, _('Root password updated for ' - 'cluster "%s"') % cluster_id) - except Exception as e: - redirect = reverse("horizon:project:database_clusters:index") - exceptions.handle(request, _('Unable to reset password. %s') % - e.message, redirect=redirect) - return True diff --git a/trove_dashboard/content/database_clusters/panel.py b/trove_dashboard/content/database_clusters/panel.py deleted file mode 100644 index 7905d41..0000000 --- a/trove_dashboard/content/database_clusters/panel.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (c) 2014 eBay Software Foundation -# Copyright 2015 HP Software, LLC -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.utils.translation import ugettext_lazy as _ - -import horizon -from openstack_dashboard.dashboards.project import dashboard - - -class Clusters(horizon.Panel): - name = _("Clusters") - slug = 'database_clusters' - permissions = ('openstack.services.database', - 'openstack.services.object-store',) - - -dashboard.Project.register(Clusters) diff --git a/trove_dashboard/content/database_clusters/tables.py b/trove_dashboard/content/database_clusters/tables.py deleted file mode 100644 index d80c134..0000000 --- a/trove_dashboard/content/database_clusters/tables.py +++ /dev/null @@ -1,434 +0,0 @@ -# Copyright (c) 2014 eBay Software Foundation -# Copyright 2015 HP Software, LLC -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -from django.core import urlresolvers -from django import shortcuts -from django.template.defaultfilters import title # noqa -from django.utils.translation import ugettext_lazy as _ -from django.utils.translation import ungettext_lazy - -from horizon import messages -from horizon import tables -from horizon.templatetags import sizeformat -from horizon.utils import filters -from horizon.utils import functions -from horizon.utils import memoized - -from trove_dashboard import api -from trove_dashboard.content.database_clusters import cluster_manager -from trove_dashboard.content.databases import db_capability - -LOG = logging.getLogger(__name__) - -ACTIVE_STATES = ("ACTIVE",) - - -class DeleteCluster(tables.BatchAction): - name = "delete" - icon = "remove" - classes = ('btn-danger',) - help_text = _("Deleted cluster is not recoverable.") - - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Delete Cluster", - u"Delete Clusters", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Scheduled deletion of Cluster", - u"Scheduled deletion of Clusters", - count - ) - - def action(self, request, obj_id): - api.trove.cluster_delete(request, obj_id) - - -class LaunchLink(tables.LinkAction): - name = "launch" - verbose_name = _("Launch Cluster") - url = "horizon:project:database_clusters:launch" - classes = ("btn-launch", "ajax-modal") - icon = "cloud-upload" - - -class ClusterGrow(tables.LinkAction): - name = "cluster_grow" - verbose_name = _("Grow Cluster") - url = "horizon:project:database_clusters:cluster_grow_details" - - def allowed(self, request, cluster=None): - if (cluster and cluster.task["name"] == 'NONE' and - db_capability.can_modify_cluster(cluster.datastore['type'])): - return True - return False - - -class ClusterShrink(tables.LinkAction): - name = "cluster_shrink" - verbose_name = _("Shrink Cluster") - url = "horizon:project:database_clusters:cluster_shrink_details" - - def allowed(self, request, cluster=None): - if (cluster and cluster.task["name"] == 'NONE' and - db_capability.can_modify_cluster(cluster.datastore['type'])): - return True - return False - - -class ResetPassword(tables.LinkAction): - name = "reset_password" - verbose_name = _("Reset Root Password") - url = "horizon:project:database_clusters:reset_password" - classes = ("ajax-modal",) - - def allowed(self, request, cluster=None): - if (cluster and cluster.task["name"] == 'NONE' and - db_capability.is_vertica_datastore(cluster.datastore['type'])): - return True - return False - - def get_link_url(self, datum): - cluster_id = self.table.get_object_id(datum) - return urlresolvers.reverse(self.url, args=[cluster_id]) - - -class UpdateRow(tables.Row): - ajax = True - - @memoized.memoized_method - def get_data(self, request, cluster_id): - cluster = api.trove.cluster_get(request, cluster_id) - try: - # TODO(michayu): assumption that cluster is homogeneous - flavor_id = cluster.instances[0]['flavor']['id'] - cluster.full_flavor = api.trove.flavor_get(request, flavor_id) - except Exception: - pass - return cluster - - -def get_datastore(cluster): - return cluster.datastore["type"] - - -def get_datastore_version(cluster): - return cluster.datastore["version"] - - -def get_size(cluster): - if db_capability.is_vertica_datastore(cluster.datastore['type']): - return "3" - - if hasattr(cluster, "full_flavor"): - size_string = _("%(name)s | %(RAM)s RAM | %(instances)s instances") - vals = {'name': cluster.full_flavor.name, - 'RAM': sizeformat.mbformat(cluster.full_flavor.ram), - 'instances': len(cluster.instances)} - return size_string % vals - elif hasattr(cluster, "instances"): - return "%s instances" % len(cluster.instances) - return _("Not available") - - -def get_task(cluster): - return cluster.task["name"] - - -class ClustersTable(tables.DataTable): - TASK_CHOICES = ( - ("none", True), - ) - name = tables.Column("name", - link=("horizon:project:database_clusters:detail"), - verbose_name=_("Cluster Name")) - datastore = tables.Column(get_datastore, - verbose_name=_("Datastore")) - datastore_version = tables.Column(get_datastore_version, - verbose_name=_("Datastore Version")) - size = tables.Column(get_size, - verbose_name=_("Cluster Size"), - attrs={'data-type': 'size'}) - task = tables.Column(get_task, - filters=(title, filters.replace_underscores), - verbose_name=_("Current Task"), - status=True, - status_choices=TASK_CHOICES) - - class Meta(object): - name = "clusters" - verbose_name = _("Clusters") - status_columns = ["task"] - row_class = UpdateRow - table_actions = (LaunchLink, DeleteCluster) - row_actions = (ClusterGrow, ClusterShrink, ResetPassword, - DeleteCluster) - - -def get_instance_size(instance): - if hasattr(instance, "full_flavor"): - size_string = _("%(name)s | %(RAM)s RAM") - vals = {'name': instance.full_flavor.name, - 'RAM': sizeformat.mbformat(instance.full_flavor.ram)} - return size_string % vals - return _("Not available") - - -def get_instance_type(instance): - if hasattr(instance, "type"): - return instance.type - return _("Not available") - - -def get_host(instance): - if hasattr(instance, "hostname"): - return instance.hostname - elif hasattr(instance, "ip") and instance.ip: - return instance.ip[0] - return _("Not Assigned") - - -class InstancesTable(tables.DataTable): - name = tables.Column("name", - verbose_name=_("Name")) - type = tables.Column(get_instance_type, - verbose_name=_("Type")) - host = tables.Column(get_host, - verbose_name=_("Host")) - size = tables.Column(get_instance_size, - verbose_name=_("Size"), - attrs={'data-type': 'size'}) - status = tables.Column("status", - filters=(title, filters.replace_underscores), - verbose_name=_("Status")) - - class Meta(object): - name = "instances" - verbose_name = _("Instances") - - -class ClusterShrinkAction(tables.BatchAction): - name = "cluster_shrink_action" - icon = "remove" - classes = ('btn-danger',) - success_url = 'horizon:project:database_clusters:index' - help_text = _("Shrinking a cluster is not recoverable.") - - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Shrink Cluster", - u"Shrink Cluster", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Scheduled Shrinking of Cluster", - u"Scheduled Shrinking of Cluster", - count - ) - - def handle(self, table, request, obj_ids): - datum_display_objs = [] - for datum_id in obj_ids: - datum = table.get_object_by_id(datum_id) - datum_display = table.get_object_display(datum) or datum_id - datum_display_objs.append(datum_display) - display_str = functions.lazy_join(", ", datum_display_objs) - - try: - cluster_id = table.kwargs['cluster_id'] - data = [{'id': instance_id} for instance_id in obj_ids] - api.trove.cluster_shrink(request, cluster_id, data) - LOG.info('%s: "%s"' % - (self._get_action_name(past=True), - display_str)) - msg = _('Removed instances from cluster.') - messages.info(request, msg) - except Exception as ex: - LOG.error('Action %(action)s failed with %(ex)s for %(data)s' % - {'action': self._get_action_name(past=True).lower(), - 'ex': ex.message, - 'data': display_str}) - msg = _('Unable to remove instances from cluster: %s') - messages.error(request, msg % ex.message) - - return shortcuts.redirect(self.get_success_url(request)) - - -class ClusterShrinkInstancesTable(tables.DataTable): - name = tables.Column("name", - verbose_name=_("Name")) - status = tables.Column("status", - filters=(title, filters.replace_underscores), - verbose_name=_("Status")) - - class Meta(object): - name = "shrink_cluster_table" - verbose_name = _("Instances") - table_actions = (ClusterShrinkAction,) - row_actions = (ClusterShrinkAction,) - - -class ClusterGrowAddInstance(tables.LinkAction): - name = "cluster_grow_add_instance" - verbose_name = _("Add Instance") - url = "horizon:project:database_clusters:add_instance" - classes = ("ajax-modal",) - - def get_link_url(self): - return urlresolvers.reverse( - self.url, args=[self.table.kwargs['cluster_id']]) - - -class ClusterGrowRemoveInstance(tables.BatchAction): - name = "cluster_grow_remove_instance" - - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Remove Instance", - u"Remove Instances", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Removed Instance", - u"Removed Instances", - count - ) - - def action(self, request, datum_id): - manager = cluster_manager.get(self.table.kwargs['cluster_id']) - manager.delete_instance(datum_id) - - def handle(self, table, request, obj_ids): - action_success = [] - action_failure = [] - action_not_allowed = [] - for datum_id in obj_ids: - datum = table.get_object_by_id(datum_id) - datum_display = table.get_object_display(datum) or datum_id - if not table._filter_action(self, request, datum): - action_not_allowed.append(datum_display) - LOG.warning('Permission denied to %s: "%s"' % - (self._get_action_name(past=True).lower(), - datum_display)) - continue - try: - self.action(request, datum_id) - # Call update to invoke changes if needed - self.update(request, datum) - action_success.append(datum_display) - self.success_ids.append(datum_id) - LOG.info('%s: "%s"' % - (self._get_action_name(past=True), datum_display)) - except Exception as ex: - # Handle the exception but silence it since we'll display - # an aggregate error message later. Otherwise we'd get - # multiple error messages displayed to the user. - action_failure.append(datum_display) - action_description = ( - self._get_action_name(past=True).lower(), datum_display) - LOG.error( - 'Action %(action)s Failed for %(reason)s', { - 'action': action_description, 'reason': ex}) - - if action_not_allowed: - msg = _('You are not allowed to %(action)s: %(objs)s') - params = {"action": - self._get_action_name(action_not_allowed).lower(), - "objs": functions.lazy_join(", ", action_not_allowed)} - messages.error(request, msg % params) - if action_failure: - msg = _('Unable to %(action)s: %(objs)s') - params = {"action": self._get_action_name(action_failure).lower(), - "objs": functions.lazy_join(", ", action_failure)} - messages.error(request, msg % params) - - return shortcuts.redirect(self.get_success_url(request)) - - -class ClusterGrowAction(tables.Action): - name = "grow_cluster_action" - verbose_name = _("Grow Cluster") - verbose_name_plural = _("Grow Cluster") - requires_input = False - icon = "plus" - - def handle(self, table, request, obj_ids): - if not table.data: - msg = _("Cannot grow cluster. No instances specified.") - messages.info(request, msg) - return shortcuts.redirect(request.build_absolute_uri()) - - datum_display_objs = [] - for instance in table.data: - msg = _("[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, " - "type=%(type)s, related_to=%(related_to)s, " - "nics=%(nics)s]") - params = {"flavor": instance.flavor_id, "volume": instance.volume, - "name": instance.name, "type": instance.type, - "related_to": instance.related_to, "nics": instance.nics} - datum_display_objs.append(msg % params) - display_str = functions.lazy_join(", ", datum_display_objs) - - cluster_id = table.kwargs['cluster_id'] - try: - api.trove.cluster_grow(request, cluster_id, table.data) - LOG.info('%s: "%s"' % (_("Grow Cluster"), display_str)) - msg = _('Scheduled growing of cluster.') - messages.success(request, msg) - except Exception as ex: - LOG.error('Action grow cluster failed with %(ex)s for %(data)s' % - {'ex': ex.message, - 'data': display_str}) - msg = _('Unable to grow cluster: %s') - messages.error(request, msg % ex.message) - finally: - cluster_manager.delete(cluster_id) - - return shortcuts.redirect(urlresolvers.reverse( - "horizon:project:database_clusters:index")) - - -class ClusterGrowInstancesTable(tables.DataTable): - id = tables.Column("id", hidden=True) - name = tables.Column("name", verbose_name=_("Name")) - flavor = tables.Column("flavor", verbose_name=_("Flavor")) - flavor_id = tables.Column("flavor_id", hidden=True) - volume = tables.Column("volume", verbose_name=_("Volume")) - type = tables.Column("type", verbose_name=_("Instance Type")) - related_to = tables.Column("related_to", verbose_name=_("Related To")) - nics = tables.Column("nics", verbose_name=_("Network")) - - class Meta(object): - name = "cluster_grow_instances_table" - verbose_name = _("Instances") - table_actions = (ClusterGrowAddInstance, ClusterGrowRemoveInstance, - ClusterGrowAction) - row_actions = (ClusterGrowRemoveInstance,) diff --git a/trove_dashboard/content/database_clusters/tabs.py b/trove_dashboard/content/database_clusters/tabs.py deleted file mode 100644 index 725a1a7..0000000 --- a/trove_dashboard/content/database_clusters/tabs.py +++ /dev/null @@ -1,92 +0,0 @@ -# Copyright (c) 2014 eBay Software Foundation -# Copyright 2015 HP Software, LLC -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django import template -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import tabs - -from trove_dashboard import api -from trove_dashboard.content.database_clusters import tables -from trove_dashboard.content.databases import db_capability - - -class OverviewTab(tabs.Tab): - name = _("Overview") - slug = "overview" - - def get_context_data(self, request): - return {"cluster": self.tab_group.kwargs['cluster']} - - def get_template_name(self, request): - cluster = self.tab_group.kwargs['cluster'] - template_file = ('project/database_clusters/_detail_overview_%s.html' - % self._get_template_type(cluster.datastore['type'])) - try: - template.loader.get_template(template_file) - return template_file - except template.TemplateDoesNotExist: - # This datastore type does not have a template file - # Just use the base template file - return ('project/database_clusters/_detail_overview.html') - - def _get_template_type(self, datastore): - if db_capability.is_mysql_compatible(datastore): - return 'mysql' - - return datastore - - -class InstancesTab(tabs.TableTab): - table_classes = (tables.InstancesTable,) - name = _("Instances") - slug = "instances_tab" - cluster = None - template_name = "horizon/common/_detail_table.html" - preload = True - - def get_instances_data(self): - cluster = self.tab_group.kwargs['cluster'] - data = [] - try: - instances = api.trove.cluster_get(self.request, - cluster.id).instances - for instance in instances: - instance_info = api.trove.instance_get(self.request, - instance['id']) - flavor_id = instance_info.flavor['id'] - instance_info.full_flavor = api.trove.flavor_get(self.request, - flavor_id) - if "type" in instance: - instance_info.type = instance["type"] - if "ip" in instance: - instance_info.ip = instance["ip"] - if "hostname" in instance: - instance_info.hostname = instance["hostname"] - - data.append(instance_info) - except Exception: - msg = _('Unable to get instances data.') - exceptions.handle(self.request, msg) - data = [] - return data - - -class ClusterDetailTabs(tabs.TabGroup): - slug = "cluster_details" - tabs = (OverviewTab, InstancesTab) - sticky = True diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/_add_instance.html b/trove_dashboard/content/database_clusters/templates/database_clusters/_add_instance.html deleted file mode 100644 index 2961af7..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/_add_instance.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block modal-body-right %} -

{% trans "Specify the details of the instance to be added to the cluster." %}

-

{% trans "The name field is optional. If the field is left blank a name will be generated when the cluster is grown." %}

-

{% trans "The 'Instance Type' and 'Related To' fields are datastore specific and optional. See the Trove documentation for more information on using these fields." %}

-{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview.html b/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview.html deleted file mode 100644 index 7a0a176..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview.html +++ /dev/null @@ -1,27 +0,0 @@ -{% load i18n sizeformat %} - -
-
-
{% trans "Name" %}
-
{{ cluster.name }}
-
{% trans "ID" %}
-
{{ cluster.id }}
-
{% trans "Datastore" %}
-
{{ cluster.datastore.type }}
-
{% trans "Datastore Version" %}
-
{{ cluster.datastore.version }}
-
{% trans "Current Task" %}
-
{{ cluster.task.name|title }}
-
{% trans "RAM" %}
-
{{ cluster.full_flavor.ram|mbformat }}
-
{% trans "Number of Instances" %}
-
{{ cluster.num_instances }}
- {% if cluster.locality %} -
{% trans "Locality" %}
-
{{ cluster.locality }}
- {% endif %} -
- -{% block connection_info %} -{% endblock %} -
diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_cassandra.html b/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_cassandra.html deleted file mode 100644 index 91bbf36..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_cassandra.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "project/database_clusters/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% with cluster.ip.0 as ip %} -
{% trans "Host" %}
- {% if not ip %} -
{% trans "Not Assigned" %}
- {% else %} -
{{ ip }}
-
{% trans "Connection Examples" %}
-
cqlsh {{ ip }} 9042
- {% endif %} - {% endwith %} -
-{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_mongodb.html b/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_mongodb.html deleted file mode 100644 index 6d32d17..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_mongodb.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "project/database_clusters/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% with cluster.ip.0 as ip %} -
{% trans "Host" %}
- {% if not ip %} -
{% trans "Not Assigned" %}
- {% else %} -
{{ cluster.ip|join:', ' }}
-
{% trans "Database Port" %}
-
27017
-
{% trans "Connection Examples" %}
-
mongo --host {{ ip }}
-
mongodb://[{% trans "USERNAME" %}:{% trans "PASSWORD" %}@]{{ ip }}:27017/{% trans "DATABASE" %}
- {% endif %} - {% endwith %} -
-{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_mysql.html b/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_mysql.html deleted file mode 100644 index 601d724..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_mysql.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "project/database_clusters/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% with cluster.ip.0 as ip %} -
{% trans "Host" %}
- {% if not ip %} -
{% trans "Not Assigned" %}
- {% else %} -
{{ ip }}
-
{% trans "Connection Examples" %}
-
mysql {{ ip }} 3306
- {% endif %} - {% endwith %} -
-{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_redis.html b/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_redis.html deleted file mode 100644 index 78f814b..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_redis.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "project/database_clusters/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% with cluster.ip.0 as ip %} -
{% trans "Host" %}
- {% if not ip %} -
{% trans "Not Assigned" %}
- {% else %} -
{{ cluster.ip|join:', ' }}
-
{% trans "Connection Examples" %}
-
redis-cli -h {{ ip }}
- {% endif %} - {% endwith %} -
-{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_vertica.html b/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_vertica.html deleted file mode 100644 index d429e0f..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/_detail_overview_vertica.html +++ /dev/null @@ -1,25 +0,0 @@ -{% load i18n sizeformat %} - -
-
-
{% trans "Name" %}
-
{{ cluster.name }}
-
{% trans "ID" %}
-
{{ cluster.id }}
-
{% trans "Datastore" %}
-
{{ cluster.datastore.type }}
-
{% trans "Datastore Version" %}
-
{{ cluster.datastore.version }}
-
{% trans "Current Task" %}
-
{{ cluster.task.name|title }}
-
{% trans "RAM" %}
-
{{ cluster.full_flavor.ram|mbformat }}
-
{% trans "Number of Instances" %}
-
{{ cluster.num_instances }}
-
{% trans "Management Console" %}
-
{{ cluster.mgmt_url }}
-
-
- -{% block connection_info %} -{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/_launch.html b/trove_dashboard/content/database_clusters/templates/database_clusters/_launch.html deleted file mode 100644 index 847102c..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/_launch.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} - -{% block modal-body %} -
-
- {% include "horizon/common/_form_fields.html" %} -
-
-{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/_reset_password.html b/trove_dashboard/content/database_clusters/templates/database_clusters/_reset_password.html deleted file mode 100644 index a95023a..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/_reset_password.html +++ /dev/null @@ -1,24 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block form_id %}reset_password_form{% endblock %} -{% block form_action %}{% url "horizon:project:database_clusters:reset_password" cluster_id %}{% endblock %} - -{% block modal_id %}reset_password_modal{% endblock %} -{% block modal-header %}{% trans "Reset Root Password" %}{% endblock %} - -{% block modal-body %} -
-
- {% include "horizon/common/_form_fields.html" %} -
-
-
-

{% blocktrans trimmed %}Specify the new root password for vertica cluster.{% endblocktrans %}

-
-{% endblock %} - -{% block modal-footer %} - - {% trans "Cancel" %} -{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/add_instance.html b/trove_dashboard/content/database_clusters/templates/database_clusters/add_instance.html deleted file mode 100644 index eada158..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/add_instance.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} - -{% block main %} - {% include "project/database_clusters/_add_instance.html" %} -{% endblock %} \ No newline at end of file diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/cluster_grow_details.html b/trove_dashboard/content/database_clusters/templates/database_clusters/cluster_grow_details.html deleted file mode 100644 index fa64abb..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/cluster_grow_details.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} - -{% block main %} -
-
- {% trans "Specify the instances to be added to the cluster. When all the instances are specified click 'Grow Cluster' to perform the grow operation." %} -
-
-
- {{ table.render }} -
-
-{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/cluster_shrink_details.html b/trove_dashboard/content/database_clusters/templates/database_clusters/cluster_shrink_details.html deleted file mode 100644 index 941afa5..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/cluster_shrink_details.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} - -{% block main %} -
-
- {% trans "Select the instance(s) that will be removed from the cluster." %} -
-
-
- {{ table.render }} -
-
-{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/index.html b/trove_dashboard/content/database_clusters/templates/database_clusters/index.html deleted file mode 100644 index c0212f0..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/index.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{% trans "Clusters" %}{% endblock %} - -{% block page_header %} - {% include "horizon/common/_page_header.html" with title=_("Clusters") %} -{% endblock page_header %} - -{% block main %} - {{ table.render }} -{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/launch.html b/trove_dashboard/content/database_clusters/templates/database_clusters/launch.html deleted file mode 100644 index 4d97f95..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/launch.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends 'base.html' %} - -{% block main %} - {% include 'project/database_clusters/_launch.html' %} -{% endblock %} diff --git a/trove_dashboard/content/database_clusters/templates/database_clusters/reset_password.html b/trove_dashboard/content/database_clusters/templates/database_clusters/reset_password.html deleted file mode 100644 index cb90724..0000000 --- a/trove_dashboard/content/database_clusters/templates/database_clusters/reset_password.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "base.html" %} -{% load i18n %} -{% block title %}{% trans "Reset Root Password" %}{% endblock %} - -{% block main %} - {% include "project/database_clusters/_reset_password.html" %} -{% endblock %} \ No newline at end of file diff --git a/trove_dashboard/content/database_clusters/tests.py b/trove_dashboard/content/database_clusters/tests.py deleted file mode 100644 index da57539..0000000 --- a/trove_dashboard/content/database_clusters/tests.py +++ /dev/null @@ -1,666 +0,0 @@ -# Copyright (c) 2014 eBay Software Foundation -# Copyright 2015 HP Software, LLC -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import binascii -import logging - -from django.core.urlresolvers import reverse -from django import http - -from mox3.mox import IsA # noqa - -from openstack_dashboard import api -from troveclient import common - -from trove_dashboard import api as trove_api -from trove_dashboard.content.database_clusters \ - import cluster_manager -from trove_dashboard.content.database_clusters import tables -from trove_dashboard.test import helpers as test - -INDEX_URL = reverse('horizon:project:database_clusters:index') -LAUNCH_URL = reverse('horizon:project:database_clusters:launch') -DETAILS_URL = reverse('horizon:project:database_clusters:detail', args=['id']) -RESET_PASSWORD_VIEWNAME = 'horizon:project:database_clusters:reset_password' - - -class ClustersTests(test.TestCase): - @test.create_stubs({trove_api.trove: ('cluster_list', - 'flavor_list')}) - def test_index(self): - clusters = common.Paginated(self.trove_clusters.list()) - trove_api.trove.cluster_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(clusters) - trove_api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndReturn(self.flavors.list()) - - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed(res, 'project/database_clusters/index.html') - - @test.create_stubs({trove_api.trove: ('cluster_list', - 'flavor_list')}) - def test_index_flavor_exception(self): - clusters = common.Paginated(self.trove_clusters.list()) - trove_api.trove.cluster_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(clusters) - trove_api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed(res, 'project/database_clusters/index.html') - self.assertMessageCount(res, error=1) - - @test.create_stubs({trove_api.trove: ('cluster_list',)}) - def test_index_list_exception(self): - trove_api.trove.cluster_list(IsA(http.HttpRequest), marker=None)\ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed(res, 'project/database_clusters/index.html') - self.assertMessageCount(res, error=1) - - @test.create_stubs({trove_api.trove: ('cluster_list', - 'flavor_list')}) - def test_index_pagination(self): - clusters = self.trove_clusters.list() - last_record = clusters[1] - clusters = common.Paginated(clusters, next_marker="foo") - trove_api.trove.cluster_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(clusters) - trove_api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndReturn(self.flavors.list()) - - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed(res, 'project/database_clusters/index.html') - self.assertContains( - res, 'marker=' + last_record.id) - - @test.create_stubs({trove_api.trove: ('cluster_list', - 'flavor_list')}) - def test_index_flavor_list_exception(self): - clusters = common.Paginated(self.trove_clusters.list()) - trove_api.trove.cluster_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(clusters) - trove_api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - res = self.client.get(INDEX_URL) - - self.assertTemplateUsed(res, 'project/database_clusters/index.html') - self.assertMessageCount(res, error=1) - - @test.create_stubs({trove_api.trove: ('datastore_flavors', - 'datastore_list', - 'datastore_version_list'), - api.base: ['is_service_enabled']}) - def test_launch_cluster(self): - api.base.is_service_enabled(IsA(http.HttpRequest), 'network')\ - .AndReturn(False) - filtered_datastores = self._get_filtered_datastores('mongodb') - trove_api.trove.datastore_flavors(IsA(http.HttpRequest), - 'mongodb', '2.6')\ - .AndReturn(self.flavors.list()) - trove_api.trove.datastore_list(IsA(http.HttpRequest))\ - .AndReturn(filtered_datastores) - trove_api.trove.datastore_version_list(IsA(http.HttpRequest), - IsA(str))\ - .AndReturn( - self._get_filtered_datastore_versions(filtered_datastores)) - self.mox.ReplayAll() - res = self.client.get(LAUNCH_URL) - self.assertTemplateUsed(res, 'project/database_clusters/launch.html') - - def test_launch_cluster_mongo_fields(self): - datastore = 'mongodb' - datastore_version = '2.6' - fields = self.launch_cluster_fields_setup(datastore, - datastore_version) - field_name = self._build_flavor_widget_name(datastore, - datastore_version) - - self.assertTrue(self._contains_datastore_in_attribute( - fields[field_name], field_name)) - self.assertTrue(self._contains_datastore_in_attribute( - fields['num_instances'], field_name)) - self.assertTrue(self._contains_datastore_in_attribute( - fields['num_shards'], field_name)) - self.assertFalse(self._contains_datastore_in_attribute( - fields['root_password'], field_name)) - self.assertFalse(self._contains_datastore_in_attribute( - fields['num_instances_vertica'], field_name)) - - def test_launch_cluster_redis_fields(self): - datastore = 'redis' - datastore_version = '3.0' - fields = self.launch_cluster_fields_setup(datastore, - datastore_version) - field_name = self._build_flavor_widget_name(datastore, - datastore_version) - - self.assertTrue(self._contains_datastore_in_attribute( - fields[field_name], field_name)) - self.assertTrue(self._contains_datastore_in_attribute( - fields['num_instances'], field_name)) - self.assertFalse(self._contains_datastore_in_attribute( - fields['num_shards'], field_name)) - self.assertFalse(self._contains_datastore_in_attribute( - fields['root_password'], field_name)) - self.assertFalse(self._contains_datastore_in_attribute( - fields['num_instances_vertica'], field_name)) - - def test_launch_cluster_vertica_fields(self): - datastore = 'vertica' - datastore_version = '7.1' - fields = self.launch_cluster_fields_setup(datastore, - datastore_version) - field_name = self._build_flavor_widget_name(datastore, - datastore_version) - - self.assertTrue(self._contains_datastore_in_attribute( - fields[field_name], field_name)) - self.assertFalse(self._contains_datastore_in_attribute( - fields['num_instances'], field_name)) - self.assertFalse(self._contains_datastore_in_attribute( - fields['num_shards'], field_name)) - self.assertTrue(self._contains_datastore_in_attribute( - fields['root_password'], field_name)) - self.assertTrue(self._contains_datastore_in_attribute( - fields['num_instances_vertica'], field_name)) - - @test.create_stubs({trove_api.trove: ('datastore_flavors', - 'datastore_list', - 'datastore_version_list'), - api.base: ['is_service_enabled']}) - def launch_cluster_fields_setup(self, datastore, datastore_version): - api.base.is_service_enabled(IsA(http.HttpRequest), 'network')\ - .AndReturn(False) - filtered_datastores = self._get_filtered_datastores(datastore) - trove_api.trove.datastore_flavors(IsA(http.HttpRequest), - datastore, datastore_version)\ - .AndReturn(self.flavors.list()) - trove_api.trove.datastore_list(IsA(http.HttpRequest))\ - .AndReturn(filtered_datastores) - trove_api.trove.datastore_version_list(IsA(http.HttpRequest), - IsA(str))\ - .AndReturn( - self._get_filtered_datastore_versions(filtered_datastores)) - self.mox.ReplayAll() - res = self.client.get(LAUNCH_URL) - return res.context_data['form'].fields - - @test.create_stubs({trove_api.trove: ['datastore_flavors', - 'cluster_create', - 'datastore_list', - 'datastore_version_list'], - api.base: ['is_service_enabled']}) - def test_create_simple_cluster(self): - api.base.is_service_enabled(IsA(http.HttpRequest), 'network')\ - .AndReturn(False) - filtered_datastores = self._get_filtered_datastores('mongodb') - trove_api.trove.datastore_flavors(IsA(http.HttpRequest), - 'mongodb', '2.6')\ - .AndReturn(self.flavors.list()) - trove_api.trove.datastore_list(IsA(http.HttpRequest))\ - .AndReturn(filtered_datastores) - trove_api.trove.datastore_version_list(IsA(http.HttpRequest), - IsA(str))\ - .AndReturn( - self._get_filtered_datastore_versions(filtered_datastores)) - - cluster_name = u'MyCluster' - cluster_volume = 1 - cluster_flavor = u'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' - cluster_instances = 3 - cluster_datastore = u'mongodb' - cluster_datastore_version = u'2.6' - cluster_network = u'' - trove_api.trove.cluster_create( - IsA(http.HttpRequest), - cluster_name, - cluster_volume, - cluster_flavor, - cluster_instances, - datastore=cluster_datastore, - datastore_version=cluster_datastore_version, - nics=cluster_network, - root_password=None, - locality=None).AndReturn(self.trove_clusters.first()) - - field_name = self._build_flavor_widget_name(cluster_datastore, - cluster_datastore_version) - self.mox.ReplayAll() - post = { - 'name': cluster_name, - 'volume': cluster_volume, - 'num_instances': cluster_instances, - 'num_shards': 1, - 'datastore': field_name, - field_name: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - } - - res = self.client.post(LAUNCH_URL, post) - self.assertNoFormErrors(res) - self.assertMessageCount(success=1) - - @test.create_stubs({trove_api.trove: ['datastore_flavors', - 'cluster_create', - 'datastore_list', - 'datastore_version_list'], - api.neutron: ['network_list_for_tenant'], - api.base: ['is_service_enabled']}) - def test_create_simple_cluster_neutron(self): - api.base.is_service_enabled(IsA(http.HttpRequest), 'network')\ - .AndReturn(True) - api.neutron.network_list_for_tenant(IsA(http.HttpRequest), '1')\ - .AndReturn(self.networks.list()) - filtered_datastores = self._get_filtered_datastores('mongodb') - trove_api.trove.datastore_flavors(IsA(http.HttpRequest), - 'mongodb', '2.6')\ - .AndReturn(self.flavors.list()) - trove_api.trove.datastore_list(IsA(http.HttpRequest))\ - .AndReturn(filtered_datastores) - trove_api.trove.datastore_version_list(IsA(http.HttpRequest), - IsA(str))\ - .AndReturn( - self._get_filtered_datastore_versions(filtered_datastores)) - - cluster_name = u'MyCluster' - cluster_volume = 1 - cluster_flavor = u'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' - cluster_instances = 3 - cluster_datastore = u'mongodb' - cluster_datastore_version = u'2.6' - cluster_network = u'82288d84-e0a5-42ac-95be-e6af08727e42' - trove_api.trove.cluster_create( - IsA(http.HttpRequest), - cluster_name, - cluster_volume, - cluster_flavor, - cluster_instances, - datastore=cluster_datastore, - datastore_version=cluster_datastore_version, - nics=cluster_network, - root_password=None, - locality=None).AndReturn(self.trove_clusters.first()) - - field_name = self._build_flavor_widget_name(cluster_datastore, - cluster_datastore_version) - self.mox.ReplayAll() - post = { - 'name': cluster_name, - 'volume': cluster_volume, - 'num_instances': cluster_instances, - 'num_shards': 1, - 'datastore': field_name, - field_name: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - 'network': cluster_network, - } - - res = self.client.post(LAUNCH_URL, post) - self.assertNoFormErrors(res) - self.assertMessageCount(success=1) - - @test.create_stubs({trove_api.trove: ['datastore_flavors', - 'cluster_create', - 'datastore_list', - 'datastore_version_list'], - api.neutron: ['network_list_for_tenant']}) - def test_create_simple_cluster_exception(self): - api.neutron.network_list_for_tenant(IsA(http.HttpRequest), '1')\ - .AndReturn(self.networks.list()) - filtered_datastores = self._get_filtered_datastores('mongodb') - trove_api.trove.datastore_flavors(IsA(http.HttpRequest), - 'mongodb', '2.6')\ - .AndReturn(self.flavors.list()) - trove_api.trove.datastore_list(IsA(http.HttpRequest))\ - .AndReturn(filtered_datastores) - trove_api.trove.datastore_version_list(IsA(http.HttpRequest), - IsA(str))\ - .AndReturn( - self._get_filtered_datastore_versions(filtered_datastores)) - - cluster_name = u'MyCluster' - cluster_volume = 1 - cluster_flavor = u'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' - cluster_instances = 3 - cluster_datastore = u'mongodb' - cluster_datastore_version = u'2.6' - cluster_network = u'82288d84-e0a5-42ac-95be-e6af08727e42' - trove_api.trove.cluster_create( - IsA(http.HttpRequest), - cluster_name, - cluster_volume, - cluster_flavor, - cluster_instances, - datastore=cluster_datastore, - datastore_version=cluster_datastore_version, - nics=cluster_network, - root_password=None, - locality=None).AndReturn(self.trove_clusters.first()) - - field_name = self._build_flavor_widget_name(cluster_datastore, - cluster_datastore_version) - self.mox.ReplayAll() - post = { - 'name': cluster_name, - 'volume': cluster_volume, - 'num_instances': cluster_instances, - 'num_shards': 1, - 'datastore': field_name, - field_name: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - } - - res = self.client.post(LAUNCH_URL, post) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({trove_api.trove: ('cluster_get', - 'instance_get', - 'flavor_get',)}) - def test_details(self): - cluster = self.trove_clusters.first() - trove_api.trove.cluster_get(IsA(http.HttpRequest), cluster.id)\ - .MultipleTimes().AndReturn(cluster) - trove_api.trove.instance_get(IsA(http.HttpRequest), IsA(str))\ - .MultipleTimes().AndReturn(self.databases.first()) - trove_api.trove.flavor_get(IsA(http.HttpRequest), IsA(str))\ - .MultipleTimes().AndReturn(self.flavors.first()) - self.mox.ReplayAll() - - details_url = reverse('horizon:project:database_clusters:detail', - args=[cluster.id]) - res = self.client.get(details_url) - self.assertTemplateUsed(res, 'horizon/common/_detail.html') - self.assertContains(res, cluster.ip[0]) - - @test.create_stubs({trove_api.trove: ('cluster_get', - 'instance_get', - 'flavor_get',)}) - def test_details_without_locality(self): - cluster = self.trove_clusters.list()[1] - trove_api.trove.cluster_get(IsA(http.HttpRequest), cluster.id) \ - .MultipleTimes().AndReturn(cluster) - trove_api.trove.instance_get(IsA(http.HttpRequest), IsA(str)) \ - .MultipleTimes().AndReturn(self.databases.first()) - trove_api.trove.flavor_get(IsA(http.HttpRequest), IsA(str)) \ - .MultipleTimes().AndReturn(self.flavors.first()) - self.mox.ReplayAll() - - details_url = reverse('horizon:project:database_clusters:detail', - args=[cluster.id]) - res = self.client.get(details_url) - self.assertTemplateUsed(res, 'horizon/common/_detail.html') - self.assertNotContains(res, "Locality") - - @test.create_stubs({trove_api.trove: ('cluster_get', - 'instance_get', - 'flavor_get',)}) - def test_details_with_locality(self): - cluster = self.trove_clusters.first() - trove_api.trove.cluster_get(IsA(http.HttpRequest), cluster.id) \ - .MultipleTimes().AndReturn(cluster) - trove_api.trove.instance_get(IsA(http.HttpRequest), IsA(str)) \ - .MultipleTimes().AndReturn(self.databases.first()) - trove_api.trove.flavor_get(IsA(http.HttpRequest), IsA(str)) \ - .MultipleTimes().AndReturn(self.flavors.first()) - self.mox.ReplayAll() - - details_url = reverse('horizon:project:database_clusters:detail', - args=[cluster.id]) - res = self.client.get(details_url) - self.assertTemplateUsed(res, 'project/database_clusters/' - '_detail_overview.html') - self.assertContains(res, "Locality") - - @test.create_stubs( - {trove_api.trove: ('cluster_get', - 'cluster_grow'), - cluster_manager: ('get',)}) - def test_grow_cluster(self): - cluster = self.trove_clusters.first() - trove_api.trove.cluster_get(IsA(http.HttpRequest), cluster.id)\ - .AndReturn(cluster) - cluster_volume = 1 - flavor = self.flavors.first() - cluster_flavor = flavor.id - cluster_flavor_name = flavor.name - instances = [ - cluster_manager.ClusterInstance("id1", "name1", cluster_flavor, - cluster_flavor_name, - cluster_volume, "master", None, - None), - cluster_manager.ClusterInstance("id2", "name2", cluster_flavor, - cluster_flavor_name, - cluster_volume, "slave", - "master", None), - cluster_manager.ClusterInstance("id3", None, cluster_flavor, - cluster_flavor_name, - cluster_volume, None, None, None), - ] - - manager = cluster_manager.ClusterInstanceManager(cluster.id) - manager.instances = instances - cluster_manager.get(cluster.id).MultipleTimes().AndReturn(manager) - trove_api.trove.cluster_grow(IsA(http.HttpRequest), - cluster.id, - instances) - self.mox.ReplayAll() - - url = reverse('horizon:project:database_clusters:cluster_grow_details', - args=[cluster.id]) - res = self.client.get(url) - self.assertTemplateUsed( - res, 'project/database_clusters/cluster_grow_details.html') - table = res.context_data[ - "".join([tables.ClusterGrowInstancesTable.Meta.name, '_table'])] - self.assertEqual(len(cluster.instances), len(table.data)) - - action = "".join([tables.ClusterGrowInstancesTable.Meta.name, '__', - tables.ClusterGrowRemoveInstance.name, '__', - 'id1']) - self.client.post(url, {'action': action}) - self.assertEqual(len(cluster.instances) - 1, len(table.data)) - - action = "".join([tables.ClusterGrowInstancesTable.Meta.name, '__', - tables.ClusterGrowAction.name, '__', - cluster.id]) - res = self.client.post(url, {'action': action}) - self.assertMessageCount(success=1) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({trove_api.trove: ('cluster_get',)}) - def test_grow_cluster_no_instances(self): - cluster = self.trove_clusters.first() - trove_api.trove.cluster_get(IsA(http.HttpRequest), cluster.id)\ - .AndReturn(cluster) - self.mox.ReplayAll() - - url = reverse('horizon:project:database_clusters:cluster_grow_details', - args=[cluster.id]) - res = self.client.get(url) - self.assertTemplateUsed( - res, 'project/database_clusters/cluster_grow_details.html') - - action = "".join([tables.ClusterGrowInstancesTable.Meta.name, '__', - tables.ClusterGrowAction.name, '__', - cluster.id]) - self.client.post(url, {'action': action}) - self.assertMessageCount(info=1) - - @test.create_stubs( - {trove_api.trove: ('cluster_get', - 'cluster_grow',), - cluster_manager: ('get',)}) - def test_grow_cluster_exception(self): - cluster = self.trove_clusters.first() - trove_api.trove.cluster_get(IsA(http.HttpRequest), cluster.id)\ - .AndReturn(cluster) - cluster_volume = 1 - flavor = self.flavors.first() - cluster_flavor = flavor.id - cluster_flavor_name = flavor.name - instances = [ - cluster_manager.ClusterInstance("id1", "name1", cluster_flavor, - cluster_flavor_name, - cluster_volume, "master", None, - None), - cluster_manager.ClusterInstance("id2", "name2", cluster_flavor, - cluster_flavor_name, - cluster_volume, "slave", - "master", None), - cluster_manager.ClusterInstance("id3", None, cluster_flavor, - cluster_flavor_name, - cluster_volume, None, None, None), - ] - - manager = cluster_manager.ClusterInstanceManager(cluster.id) - manager.instances = instances - cluster_manager.get(cluster.id).MultipleTimes().AndReturn(manager) - trove_api.trove.cluster_grow(IsA(http.HttpRequest), - cluster.id, - instances).AndRaise(self.exceptions.trove) - self.mox.ReplayAll() - - url = reverse('horizon:project:database_clusters:cluster_grow_details', - args=[cluster.id]) - res = self.client.get(url) - self.assertTemplateUsed( - res, 'project/database_clusters/cluster_grow_details.html') - - toSuppress = ["trove_dashboard.content.database_clusters.tables"] - - # Suppress expected log messages in the test output - loggers = [] - for cls in toSuppress: - logger = logging.getLogger(cls) - loggers.append((logger, logger.getEffectiveLevel())) - logger.setLevel(logging.CRITICAL) - - try: - action = "".join([tables.ClusterGrowInstancesTable.Meta.name, '__', - tables.ClusterGrowAction.name, '__', - cluster.id]) - res = self.client.post(url, {'action': action}) - - self.assertMessageCount(error=1) - self.assertRedirectsNoFollow(res, INDEX_URL) - finally: - # Restore the previous log levels - for (log, level) in loggers: - log.setLevel(level) - - @test.create_stubs({trove_api.trove: ('cluster_get', - 'cluster_shrink')}) - def test_shrink_cluster(self): - cluster = self.trove_clusters.first() - trove_api.trove.cluster_get(IsA(http.HttpRequest), cluster.id)\ - .MultipleTimes().AndReturn(cluster) - instance_id = cluster.instances[0]['id'] - cluster_instances = [{'id': instance_id}] - trove_api.trove.cluster_shrink(IsA(http.HttpRequest), - cluster.id, - cluster_instances) - self.mox.ReplayAll() - - url = reverse( - 'horizon:project:database_clusters:cluster_shrink_details', - args=[cluster.id]) - res = self.client.get(url) - self.assertTemplateUsed( - res, 'project/database_clusters/cluster_shrink_details.html') - table = res.context_data[ - "".join([tables.ClusterShrinkInstancesTable.Meta.name, '_table'])] - self.assertEqual(len(cluster.instances), len(table.data)) - - action = "".join([tables.ClusterShrinkInstancesTable.Meta.name, '__', - tables.ClusterShrinkAction.name, '__', - instance_id]) - res = self.client.post(url, {'action': action}) - self.assertNoFormErrors(res) - self.assertMessageCount(info=1) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({trove_api.trove: ('cluster_get', - 'cluster_shrink')}) - def test_shrink_cluster_exception(self): - cluster = self.trove_clusters.first() - trove_api.trove.cluster_get(IsA(http.HttpRequest), cluster.id)\ - .MultipleTimes().AndReturn(cluster) - cluster_id = cluster.instances[0]['id'] - cluster_instances = [cluster_id] - trove_api.trove.cluster_shrink(IsA(http.HttpRequest), - cluster.id, - cluster_instances)\ - .AndRaise(self.exceptions.trove) - self.mox.ReplayAll() - - url = reverse( - 'horizon:project:database_clusters:cluster_shrink_details', - args=[cluster.id]) - action = "".join([tables.ClusterShrinkInstancesTable.Meta.name, '__', - tables.ClusterShrinkAction.name, '__', - cluster_id]) - - toSuppress = ["trove_dashboard.content.database_clusters.tables"] - - # Suppress expected log messages in the test output - loggers = [] - for cls in toSuppress: - logger = logging.getLogger(cls) - loggers.append((logger, logger.getEffectiveLevel())) - logger.setLevel(logging.CRITICAL) - - try: - res = self.client.post(url, {'action': action}) - self.assertMessageCount(error=1) - self.assertRedirectsNoFollow(res, INDEX_URL) - finally: - # Restore the previous log levels - for (log, level) in loggers: - log.setLevel(level) - - def _get_filtered_datastores(self, datastore): - filtered_datastore = [] - for ds in self.datastores.list(): - if datastore in ds.name: - filtered_datastore.append(ds) - return filtered_datastore - - def _get_filtered_datastore_versions(self, datastores): - filtered_datastore_versions = [] - for ds in datastores: - for dsv in self.datastore_versions.list(): - if ds.id == dsv.datastore: - filtered_datastore_versions.append(dsv) - return filtered_datastore_versions - - def _contains_datastore_in_attribute(self, field, datastore): - for key, value in field.widget.attrs.iteritems(): - if datastore in key: - return True - return False - - def _build_datastore_display_text(self, datastore, datastore_version): - return datastore + ' - ' + datastore_version - - def _build_flavor_widget_name(self, datastore, datastore_version): - return binascii.hexlify(self._build_datastore_display_text( - datastore, datastore_version)) diff --git a/trove_dashboard/content/database_clusters/urls.py b/trove_dashboard/content/database_clusters/urls.py deleted file mode 100644 index b08a955..0000000 --- a/trove_dashboard/content/database_clusters/urls.py +++ /dev/null @@ -1,40 +0,0 @@ -# Copyright (c) 2014 eBay Software Foundation -# Copyright 2015 HP Software, LLC -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.conf.urls import url # noqa - -from trove_dashboard.content.database_clusters import views - -CLUSTERS = r'^(?P[^/]+)/%s$' - -urlpatterns = [ - url(r'^$', views.IndexView.as_view(), name='index'), - url(r'^launch$', views.LaunchClusterView.as_view(), name='launch'), - url(r'^(?P[^/]+)/$', views.DetailView.as_view(), - name='detail'), - url(CLUSTERS % 'cluster_grow_details', - views.ClusterGrowView.as_view(), - name='cluster_grow_details'), - url(CLUSTERS % 'add_instance', - views.ClusterAddInstancesView.as_view(), - name='add_instance'), - url(CLUSTERS % 'cluster_shrink_details', - views.ClusterShrinkView.as_view(), - name='cluster_shrink_details'), - url(CLUSTERS % 'reset_password', - views.ResetPasswordView.as_view(), - name='reset_password'), -] diff --git a/trove_dashboard/content/database_clusters/views.py b/trove_dashboard/content/database_clusters/views.py deleted file mode 100644 index 43cf729..0000000 --- a/trove_dashboard/content/database_clusters/views.py +++ /dev/null @@ -1,262 +0,0 @@ -# Copyright (c) 2014 eBay Software Foundation -# Copyright 2015 HP Software, LLC -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -Views for managing database clusters. -""" -from collections import OrderedDict -import logging - -from django.core.urlresolvers import reverse -from django.core.urlresolvers import reverse_lazy -from django.utils.translation import ugettext_lazy as _ - -import six - -from horizon import exceptions -from horizon import forms as horizon_forms -from horizon import tables as horizon_tables -from horizon import tabs as horizon_tabs -from horizon.utils import memoized - -from trove_dashboard import api -from trove_dashboard.content.database_clusters \ - import cluster_manager -from trove_dashboard.content.database_clusters import forms -from trove_dashboard.content.database_clusters import tables -from trove_dashboard.content.database_clusters import tabs - - -LOG = logging.getLogger(__name__) - - -class IndexView(horizon_tables.DataTableView): - table_class = tables.ClustersTable - template_name = 'project/database_clusters/index.html' - - def has_more_data(self, table): - return self._more - - @memoized.memoized_method - def get_flavors(self): - try: - flavors = api.trove.flavor_list(self.request) - except Exception: - flavors = [] - msg = _('Unable to retrieve database size information.') - exceptions.handle(self.request, msg) - return OrderedDict((six.text_type(flavor.id), flavor) - for flavor in flavors) - - def _extra_data(self, cluster): - try: - cluster_flavor = cluster.instances[0]["flavor"]["id"] - flavors = self.get_flavors() - flavor = flavors.get(cluster_flavor) - if flavor is not None: - cluster.full_flavor = flavor - except Exception: - # ignore any errors and just return cluster unaltered - pass - return cluster - - def get_data(self): - marker = self.request.GET.get( - tables.ClustersTable._meta.pagination_param) - # Gather our clusters - try: - clusters = api.trove.cluster_list(self.request, marker=marker) - self._more = clusters.next or False - except Exception: - self._more = False - clusters = [] - msg = _('Unable to retrieve database clusters.') - exceptions.handle(self.request, msg) - - map(self._extra_data, clusters) - - return clusters - - -class LaunchClusterView(horizon_forms.ModalFormView): - form_class = forms.LaunchForm - form_id = "launch_form" - modal_header = _("Launch Cluster") - modal_id = "launch_modal" - template_name = 'project/database_clusters/launch.html' - submit_label = _("Launch") - submit_url = reverse_lazy('horizon:project:database_clusters:launch') - success_url = reverse_lazy('horizon:project:database_clusters:index') - - -class DetailView(horizon_tabs.TabbedTableView): - tab_group_class = tabs.ClusterDetailTabs - template_name = 'horizon/common/_detail.html' - page_title = "{{ cluster.name|default:cluster.id }}" - - def get_context_data(self, **kwargs): - context = super(DetailView, self).get_context_data(**kwargs) - context["url"] = reverse('horizon:project:database_clusters:index') - context["cluster"] = self.get_data() - return context - - @memoized.memoized_method - def get_data(self): - try: - cluster_id = self.kwargs['cluster_id'] - cluster = api.trove.cluster_get(self.request, cluster_id) - except Exception: - redirect = reverse('horizon:project:database_clusters:index') - msg = _('Unable to retrieve details ' - 'for database cluster: %s') % cluster_id - exceptions.handle(self.request, msg, redirect=redirect) - try: - cluster.full_flavor = api.trove.flavor_get( - self.request, cluster.instances[0]["flavor"]["id"]) - except Exception: - LOG.error('Unable to retrieve flavor details' - ' for database cluster: %s' % cluster_id) - cluster.num_instances = len(cluster.instances) - - # Todo(saurabhs) Set mgmt_url to dispaly Mgmt Console URL on - # cluster details page - # for instance in cluster.instances: - # if instance['type'] == "master": - # cluster.mgmt_url = "https://%s:5450/webui" % instance['ip'][0] - - return cluster - - def get_tabs(self, request, *args, **kwargs): - cluster = self.get_data() - return self.tab_group_class(request, cluster=cluster, **kwargs) - - -class ClusterGrowView(horizon_tables.DataTableView): - table_class = tables.ClusterGrowInstancesTable - template_name = 'project/database_clusters/cluster_grow_details.html' - page_title = _("Grow Cluster: {{cluster_name}}") - - def get_data(self): - manager = cluster_manager.get(self.kwargs['cluster_id']) - return manager.get_instances() - - def get_context_data(self, **kwargs): - context = super(ClusterGrowView, self).get_context_data(**kwargs) - context['cluster_id'] = self.kwargs['cluster_id'] - cluster = self.get_cluster(self.kwargs['cluster_id']) - context['cluster_name'] = cluster.name - return context - - @memoized.memoized_method - def get_cluster(self, cluster_id): - try: - return api.trove.cluster_get(self.request, cluster_id) - except Exception: - redirect = reverse("horizon:project:database_clusters:index") - msg = _('Unable to retrieve cluster details.') - exceptions.handle(self.request, msg, redirect=redirect) - - -class ClusterAddInstancesView(horizon_forms.ModalFormView): - form_class = forms.ClusterAddInstanceForm - form_id = "cluster_add_instances_form" - modal_header = _("Add Instance") - modal_id = "cluster_add_instances_modal" - template_name = "project/database_clusters/add_instance.html" - submit_label = _("Add") - submit_url = "horizon:project:database_clusters:add_instance" - success_url = "horizon:project:database_clusters:cluster_grow_details" - cancel_url = "horizon:project:database_clusters:cluster_grow_details" - page_title = _("Add Instance") - - def get_context_data(self, **kwargs): - context = (super(ClusterAddInstancesView, self) - .get_context_data(**kwargs)) - context['cluster_id'] = self.kwargs['cluster_id'] - args = (self.kwargs['cluster_id'],) - context['submit_url'] = reverse(self.submit_url, args=args) - return context - - def get_initial(self): - initial = super(ClusterAddInstancesView, self).get_initial() - initial['cluster_id'] = self.kwargs['cluster_id'] - return initial - - def get_success_url(self): - return reverse(self.success_url, args=[self.kwargs['cluster_id']]) - - def get_cancel_url(self): - return reverse(self.cancel_url, args=[self.kwargs['cluster_id']]) - - -class ClusterInstance(object): - def __init__(self, id, name, status): - self.id = id - self.name = name - self.status = status - - -class ClusterShrinkView(horizon_tables.DataTableView): - table_class = tables.ClusterShrinkInstancesTable - template_name = "project/database_clusters/cluster_shrink_details.html" - page_title = _("Shrink Cluster: {{cluster_name}}") - - @memoized.memoized_method - def get_cluster(self, cluster_id): - try: - return api.trove.cluster_get(self.request, cluster_id) - except Exception: - redirect = reverse("horizon:project:database_clusters:index") - msg = _('Unable to retrieve cluster details.') - exceptions.handle(self.request, msg, redirect=redirect) - - def get_data(self): - cluster = self.get_cluster(self.kwargs['cluster_id']) - instances = [ClusterInstance(i['id'], i['name'], i['status']) - for i in cluster.instances] - return instances - - def get_context_data(self, **kwargs): - context = super(ClusterShrinkView, self).get_context_data(**kwargs) - context['cluster_id'] = self.kwargs['cluster_id'] - cluster = self.get_cluster(self.kwargs['cluster_id']) - context['cluster_name'] = cluster.name - return context - - -class ResetPasswordView(horizon_forms.ModalFormView): - form_class = forms.ResetPasswordForm - template_name = 'project/database_clusters/reset_password.html' - success_url = reverse_lazy('horizon:project:database_clusters:index') - page_title = _("Reset Root Password") - - @memoized.memoized_method - def get_object(self, *args, **kwargs): - cluster_id = self.kwargs['cluster_id'] - try: - return api.trove.cluster_get(self.request, cluster_id) - except Exception: - msg = _('Unable to retrieve cluster details.') - redirect = reverse('horizon:project:database_clusters:index') - exceptions.handle(self.request, msg, redirect=redirect) - - def get_context_data(self, **kwargs): - context = super(ResetPasswordView, self).get_context_data(**kwargs) - context['cluster_id'] = self.kwargs['cluster_id'] - return context - - def get_initial(self): - return {'cluster_id': self.kwargs['cluster_id']} diff --git a/trove_dashboard/content/database_configurations/__init__.py b/trove_dashboard/content/database_configurations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/content/database_configurations/config_param_manager.py b/trove_dashboard/content/database_configurations/config_param_manager.py deleted file mode 100644 index fe2ec90..0000000 --- a/trove_dashboard/content/database_configurations/config_param_manager.py +++ /dev/null @@ -1,193 +0,0 @@ -# Copyright 2015 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -from django.core import cache -from django.utils.translation import ugettext_lazy as _ - -from trove_dashboard import api - -from oslo_serialization import jsonutils - - -def get(request, configuration_group_id): - if not has_config(configuration_group_id): - manager = ConfigParamManager(configuration_group_id) - manager.configuration_get(request) - cache.cache.set(configuration_group_id, manager) - - return cache.cache.get(configuration_group_id) - - -def delete(configuration_group_id): - cache.cache.delete(configuration_group_id) - - -def update(configuration_group_id, manager): - cache.cache.set(configuration_group_id, manager) - - -def has_config(configuration_group_id): - if cache.cache.get(configuration_group_id): - return True - else: - return False - - -def dict_has_changes(original, other): - if len(other) != len(original): - return True - - diffs = (set(original.keys()) - set(other.keys())) - if len(diffs).__nonzero__(): - return True - - for key in original: - if original[key] != other[key]: - return True - - return False - - -class ConfigParamManager(object): - - original_configuration_values = None - configuration = None - - def __init__(self, configuration_id): - self.configuration_id = configuration_id - - def configuration_get(self, request): - if self.configuration is None: - configuration = api.trove.configuration_get( - request, self.configuration_id) - # need to make one that can be cached - self.configuration = Configuration( - self.configuration_id, - configuration.name, - configuration.description, - configuration.datastore_name, - configuration.datastore_version_name, - configuration.created, - configuration.updated) - self.configuration.values = dict.copy(configuration.values) - self.original_configuration_values = dict.copy( - self.configuration.values) - - return self.get_configuration() - - def get_configuration(self): - return self.configuration - - def create_config_value(self, name, value): - return ConfigParam(self.configuration_id, name, value) - - def get_param(self, name): - for key_name in self.configuration.values: - if key_name == name: - return self.create_config_value( - key_name, self.configuration.values[key_name]) - return None - - def update_param(self, name, value): - self.configuration.values[name] = value - update(self.configuration_id, self) - - def delete_param(self, name): - del self.configuration.values[name] - update(self.configuration_id, self) - - def add_param(self, name, value): - self.update_param(name, value) - - def to_json(self): - return jsonutils.dumps(self.configuration.values) - - def has_changes(self): - return dict_has_changes(self.original_configuration_values, - self.configuration.values) - - -class ConfigParam(object): - def __init__(self, configuration_id, name, value): - self.configuration_id = configuration_id - self.name = name - self.value = value - - -class Configuration(object): - def __init__(self, id, name, description, datastore_name, - datastore_version_name, created, updated): - self.id = id - self.name = name - self.description = description - self.datastore_name = datastore_name - self.datastore_version_name = datastore_version_name - self.created = created - self.updated = updated - - -def validate_config_param_value(config_param, value): - if (config_param.type in (u"boolean", u"float", u"integer", u"long")): - if config_param.type == u"boolean": - if (value.lower() not in ("true", "false")): - return _('Value must be "true" or "false".') - else: - try: - float(value) - except ValueError: - return _('Value must be a number.') - - min = getattr(config_param, "min", None) - max = getattr(config_param, "max", None) - try: - val = adjust_type(config_param.type, value) - except ValueError: - return (_('Value must be of type %s.') % config_param.type) - - if min is not None and max is not None: - if val < min or val > max: - return (_('Value must be a number ' - 'between %(min)s and %(max)s.') % - {"min": min, "max": max}) - elif min is not None: - if val < min: - return _('Value must be a number greater ' - 'than or equal to %s.') % min - elif max is not None: - if val > max: - return _('Value must be a number ' - 'less than or equal to %s.') % max - return None - - -def find_parameter(name, config_params): - for param in config_params: - if param.name == name: - return param - return None - - -def adjust_type(data_type, value): - if not value: - return value - if data_type == "float": - new_value = float(value) - elif data_type == "long": - new_value = long(value) - elif data_type == "integer": - new_value = int(value) - else: - new_value = value - return new_value diff --git a/trove_dashboard/content/database_configurations/forms.py b/trove_dashboard/content/database_configurations/forms.py deleted file mode 100644 index f77cd0f..0000000 --- a/trove_dashboard/content/database_configurations/forms.py +++ /dev/null @@ -1,190 +0,0 @@ -# Copyright 2015 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -from django.core.urlresolvers import reverse -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import forms -from horizon import messages -from horizon.utils import memoized - -from trove_dashboard import api -from trove_dashboard.content.database_configurations \ - import config_param_manager - -LOG = logging.getLogger(__name__) - - -class CreateConfigurationForm(forms.SelfHandlingForm): - name = forms.CharField(label=_("Name")) - description = forms.CharField(label=_("Description"), required=False) - datastore = forms.ChoiceField( - label=_("Datastore"), - help_text=_("Type and version of datastore.")) - - def __init__(self, request, *args, **kwargs): - super(CreateConfigurationForm, self).__init__(request, *args, **kwargs) - - choices = self.get_datastore_choices(request) - self.fields['datastore'].choices = choices - - @memoized.memoized_method - def datastores(self, request): - try: - return api.trove.datastore_list(request) - except Exception: - LOG.exception("Exception while obtaining datastores list") - redirect = reverse('horizon:project:database_configurations:index') - exceptions.handle(request, - _('Unable to obtain datastores.'), - redirect=redirect) - - @memoized.memoized_method - def datastore_versions(self, request, datastore): - try: - return api.trove.datastore_version_list(request, datastore) - except Exception: - LOG.exception("Exception while obtaining datastore version list") - redirect = reverse('horizon:project:database_configurations:index') - exceptions.handle(request, - _('Unable to obtain datastore versions.'), - redirect=redirect) - - def get_datastore_choices(self, request): - choices = () - set_initial = False - datastores = self.datastores(request) - if datastores is not None: - num_datastores_with_one_version = 0 - for ds in datastores: - versions = self.datastore_versions(request, ds.name) - if not set_initial: - if len(versions) >= 2: - set_initial = True - elif len(versions) == 1: - num_datastores_with_one_version += 1 - if num_datastores_with_one_version > 1: - set_initial = True - if len(versions) > 0: - # only add to choices if datastore has at least one version - version_choices = () - for v in versions: - version_choices = (version_choices + - ((ds.name + ',' + v.name, v.name),)) - datastore_choices = (ds.name, version_choices) - choices = choices + (datastore_choices,) - if set_initial: - # prepend choice to force user to choose - initial = ('', _('Select datastore type and version')) - choices = (initial,) + choices - return choices - - def handle(self, request, data): - try: - datastore = data['datastore'].split(',')[0] - datastore_version = data['datastore'].split(',')[1] - - api.trove.configuration_create(request, data['name'], "{}", - description=data['description'], - datastore=datastore, - datastore_version=datastore_version) - - messages.success(request, _('Created configuration group')) - except Exception as e: - redirect = reverse("horizon:project:database_configurations:index") - exceptions.handle(request, _('Unable to create configuration ' - 'group. %s') - % e.message, redirect=redirect) - return True - - -class AddParameterForm(forms.SelfHandlingForm): - name = forms.ChoiceField(label=_("Name")) - value = forms.CharField(label=_("Value")) - - def __init__(self, request, *args, **kwargs): - super(AddParameterForm, self).__init__(request, *args, **kwargs) - - configuration = (config_param_manager - .get(request, kwargs["initial"]["configuration_id"]) - .get_configuration()) - - self.fields['name'].choices = self.get_parameters( - request, configuration.datastore_name, - configuration.datastore_version_name) - - self.fields['value'].parameters = self.parameters - - @memoized.memoized_method - def parameters(self, request, datastore, datastore_version): - try: - return api.trove.configuration_parameters_list( - request, datastore, datastore_version) - except Exception: - LOG.exception( - "Exception while obtaining configuration parameter list") - redirect = reverse('horizon:project:database_configurations:index') - exceptions.handle(request, - _('Unable to obtain list of parameters.'), - redirect=redirect) - - def get_parameters(self, request, datastore, datastore_version): - try: - choices = [] - - self.parameters = self.parameters( - request, datastore, datastore_version) - for parameter in self.parameters: - choices.append((parameter.name, parameter.name)) - - return sorted(choices) - except Exception: - LOG.exception( - "Exception while obtaining configuration parameters list") - redirect = reverse('horizon:project:database_configurations:index') - exceptions.handle(request, - _('Unable to create list of parameters.'), - redirect=redirect) - - def clean(self): - cleaned_data = super(AddParameterForm, self).clean() - - if "value" in cleaned_data: - config_param = config_param_manager.find_parameter( - cleaned_data["name"], self.parameters) - if config_param: - error_msg = config_param_manager.validate_config_param_value( - config_param, cleaned_data["value"]) - if error_msg: - self._errors['value'] = self.error_class([error_msg]) - return cleaned_data - - def handle(self, request, data): - try: - (config_param_manager - .get(request, self.initial["configuration_id"]) - .add_param(data["name"], - config_param_manager.adjust_type( - config_param_manager.find_parameter( - data["name"], self.parameters).type, - data["value"]))) - messages.success(request, _('Successfully added parameter')) - except Exception as e: - redirect = reverse("horizon:project:database_configurations:index") - exceptions.handle(request, _('Unable to add new parameter: %s') - % e.message, redirect=redirect) - return True diff --git a/trove_dashboard/content/database_configurations/panel.py b/trove_dashboard/content/database_configurations/panel.py deleted file mode 100644 index 37e5f8b..0000000 --- a/trove_dashboard/content/database_configurations/panel.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2015 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.utils.translation import ugettext_lazy as _ - -import horizon -from openstack_dashboard.dashboards.project import dashboard - - -class Configurations(horizon.Panel): - name = _("Configuration Groups") - slug = 'database_configurations' - permissions = ('openstack.services.database',) - - -dashboard.Project.register(Configurations) diff --git a/trove_dashboard/content/database_configurations/tables.py b/trove_dashboard/content/database_configurations/tables.py deleted file mode 100644 index b56d5af..0000000 --- a/trove_dashboard/content/database_configurations/tables.py +++ /dev/null @@ -1,285 +0,0 @@ -# Copyright 2015 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import types - -from django.core import exceptions as core_exceptions -from django.core import urlresolvers -from django import shortcuts -from django.utils.translation import ugettext_lazy as _ -from django.utils.translation import ungettext_lazy - -from horizon import forms -from horizon import messages -from horizon import tables -from horizon.utils import memoized - -from trove_dashboard import api -from trove_dashboard.content.database_configurations \ - import config_param_manager - - -class CreateConfiguration(tables.LinkAction): - name = "create_configuration" - verbose_name = _("Create Configuration Group") - url = "horizon:project:database_configurations:create" - classes = ('ajax-modal', ) - icon = "plus" - - -class DeleteConfiguration(tables.DeleteAction): - data_type_singular = _("Configuration Group") - data_type_plural = _("Configuration Groups") - - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Delete Configuration Group", - u"Delete Configuration Groups", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Deleted Configuration Group", - u"Deleted Configuration Groups", - count - ) - - def delete(self, request, obj_id): - api.trove.configuration_delete(request, obj_id) - - -class ConfigurationsTable(tables.DataTable): - name = tables.Column( - 'name', - verbose_name=_('Configuration Group Name'), - link="horizon:project:database_configurations:detail") - description = tables.Column( - lambda obj: getattr(obj, 'description', None), - verbose_name=_('Description')) - datastore = tables.Column( - 'datastore_name', - verbose_name=_('Datastore')) - datastore_version = tables.Column( - 'datastore_version_name', - verbose_name=_('Datastore Version')) - - class Meta(object): - name = "configurations" - verbose_name = _("Configuration Groups") - table_actions = [CreateConfiguration, DeleteConfiguration] - row_actions = [DeleteConfiguration] - - -class AddParameter(tables.LinkAction): - name = "add_parameter" - verbose_name = _("Add Parameter") - url = "horizon:project:database_configurations:add" - classes = ('ajax-modal', ) - icon = "plus" - - def get_link_url(self, datum=None): - configuration_id = self.table.kwargs['configuration_id'] - return urlresolvers.reverse(self.url, args=[configuration_id]) - - -class ApplyChanges(tables.Action): - name = "apply_changes" - verbose_name = _("Apply Changes") - verbose_name_plural = _("Apply Changes") - icon = "pencil" - - def __init__(self, **kwargs): - super(ApplyChanges, self).__init__(**kwargs) - self.requires_input = False - - def handle(self, table, request, obj_ids): - configuration_id = table.kwargs['configuration_id'] - if config_param_manager.get(request, configuration_id).has_changes(): - try: - api.trove.configuration_update( - request, configuration_id, - config_param_manager.get( - request, configuration_id).to_json()) - messages.success(request, _('Applied changes to server')) - except Exception: - messages.error(request, _('Error applying changes')) - finally: - config_param_manager.delete(configuration_id) - - return shortcuts.redirect(request.build_absolute_uri()) - - -class DiscardChanges(tables.Action): - name = "discard_changes" - verbose_name = _("Discard Changes") - verbose_name_plural = _("Discard Changes") - - def __init__(self, **kwargs): - super(DiscardChanges, self).__init__(**kwargs) - self.requires_input = False - - def handle(self, table, request, obj_ids): - configuration_id = table.kwargs['configuration_id'] - if config_param_manager.get(request, configuration_id).has_changes(): - try: - config_param_manager.delete(configuration_id) - messages.success(request, _('Reset Parameters')) - except Exception as ex: - messages.error( - request, - _('Error resetting parameters: %s') % ex.message) - - return shortcuts.redirect(request.build_absolute_uri()) - - -class DeleteParameter(tables.DeleteAction): - data_type_singular = _("Parameter") - data_type_plural = _("Parameters") - - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Delete Parameter", - u"Delete Parameters", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Deleted Parameter", - u"Deleted Parameters", - count - ) - - def delete(self, request, obj_ids): - configuration_id = self.table.kwargs['configuration_id'] - (config_param_manager - .get(request, configuration_id) - .delete_param(obj_ids)) - - -class UpdateRow(tables.Row): - def get_data(self, request, name): - return config_param_manager.get( - request, self.table.kwargs["configuration_id"]).get_param(name) - - -class UpdateCell(tables.UpdateAction): - def update_cell(self, request, datum, name, - cell_name, new_cell_value): - config_param = datum - - config = config_param_manager.get(request, - config_param.configuration_id) - validation_param = config_param_manager.find_parameter( - name, - self.parameters(request, - config.configuration.datastore_name, - config.configuration.datastore_version_name)) - if validation_param: - error_msg = config_param_manager.validate_config_param_value( - validation_param, new_cell_value) - if error_msg: - raise core_exceptions.ValidationError(error_msg) - - if isinstance(config_param.value, types.IntType): - value = int(new_cell_value) - elif isinstance(config_param.value, types.LongType): - value = long(new_cell_value) - else: - value = new_cell_value - - setattr(datum, cell_name, value) - - (config_param_manager - .get(request, config_param.configuration_id) - .update_param(name, value)) - - return True - - @memoized.memoized_method - def parameters(self, request, datastore, datastore_version): - return api.trove.configuration_parameters_list( - request, datastore, datastore_version) - - def _adjust_type(self, data_type, value): - if not value: - return value - if data_type == "float": - new_value = float(value) - elif data_type == "long": - new_value = long(value) - elif data_type == "integer": - new_value = int(value) - else: - new_value = value - return new_value - - -class ValuesTable(tables.DataTable): - name = tables.Column("name", verbose_name=_("Name")) - value = tables.Column("value", verbose_name=_("Value"), - form_field=forms.CharField(required=False), - update_action=UpdateCell) - - class Meta(object): - name = "values" - verbose_name = _("Configuration Group Values") - table_actions = [ApplyChanges, DiscardChanges, - AddParameter, DeleteParameter] - row_class = UpdateRow - row_actions = [DeleteParameter] - - def get_object_id(self, datum): - return datum.name - - -class DetachConfiguration(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Detach Configuration Group", - u"Detach Configuration Groups", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Detached Configuration Group", - u"Detached Configuration Groups", - count - ) - - name = "detach_configuration" - classes = ('btn-danger', 'btn-detach-config') - - def action(self, request, obj_id): - api.trove.instance_detach_configuration(request, obj_id) - - -class InstancesTable(tables.DataTable): - name = tables.Column("name", - link="horizon:project:databases:detail", - verbose_name=_("Name")) - - class Meta(object): - name = "instances" - verbose_name = _("Configuration Group Instances") - multi_select = False - row_actions = [DetachConfiguration] diff --git a/trove_dashboard/content/database_configurations/tabs.py b/trove_dashboard/content/database_configurations/tabs.py deleted file mode 100644 index 7fb0e38..0000000 --- a/trove_dashboard/content/database_configurations/tabs.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright 2015 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import tabs - -from trove_dashboard import api -from trove_dashboard.content.database_configurations \ - import config_param_manager -from trove_dashboard.content.database_configurations \ - import tables - - -class DetailsTab(tabs.Tab): - name = _("Details") - slug = "details_tab" - template_name = "project/database_configurations/_detail_overview.html" - - def get_context_data(self, request): - return {"configuration": self.tab_group.kwargs['configuration']} - - -class ValuesTab(tabs.TableTab): - table_classes = [tables.ValuesTable] - name = _("Values") - slug = "values_tab" - template_name = "project/database_configurations/detail_param.html" - - def get_values_data(self): - values_data = [] - manager = config_param_manager.get( - self.request, self.tab_group.kwargs['configuration_id']) - for k, v in manager.get_configuration().values.items(): - manager.add_param(k, v) - values_data.append(manager.create_config_value(k, v)) - return values_data - - -class InstancesTab(tabs.TableTab): - table_classes = [tables.InstancesTable] - name = _("Instances") - slug = "instances_tab" - template_name = "horizon/common/_detail_table.html" - - def get_instances_data(self): - configuration = self.tab_group.kwargs['configuration'] - try: - data = api.trove.configuration_instances(self.request, - configuration.id) - except Exception: - msg = _('Unable to get configuration data.') - exceptions.handle(self.request, msg) - data = [] - return data - - -class ConfigurationDetailTabs(tabs.TabGroup): - slug = "configuration_details" - tabs = (ValuesTab, InstancesTab, DetailsTab) - sticky = True diff --git a/trove_dashboard/content/database_configurations/templates/database_configurations/_add_parameter.html b/trove_dashboard/content/database_configurations/templates/database_configurations/_add_parameter.html deleted file mode 100644 index e9d5aed..0000000 --- a/trove_dashboard/content/database_configurations/templates/database_configurations/_add_parameter.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block modal-body-right %} -

{% trans "Select a parameter and provide a value for the configuration parameter." %}

-{% endblock %} diff --git a/trove_dashboard/content/database_configurations/templates/database_configurations/_create.html b/trove_dashboard/content/database_configurations/templates/database_configurations/_create.html deleted file mode 100644 index ff286cf..0000000 --- a/trove_dashboard/content/database_configurations/templates/database_configurations/_create.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} - -{% block modal-body %} -
-
- {% include "horizon/common/_form_fields.html" %} -
-
-{% endblock %} \ No newline at end of file diff --git a/trove_dashboard/content/database_configurations/templates/database_configurations/_detail_overview.html b/trove_dashboard/content/database_configurations/templates/database_configurations/_detail_overview.html deleted file mode 100644 index 3884b06..0000000 --- a/trove_dashboard/content/database_configurations/templates/database_configurations/_detail_overview.html +++ /dev/null @@ -1,24 +0,0 @@ -{% load i18n sizeformat %} - -

{% trans "Configuration Group Overview" %}

- -
-

{% trans "Info" %}

-
-
-
{% trans "Name" %}
-
{{ configuration.name }}
-
{% trans "Description" %}
-
{{ configuration.description|linebreaksbr }}
-
{% trans "ID" %}
-
{{ configuration.id }}
-
{% trans "Datastore" %}
-
{{ configuration.datastore_name }}
-
{% trans "Datastore Version" %}
-
{{ configuration.datastore_version_name }}
-
{% trans "Created" %}
-
{{ configuration.created|parse_isotime }}
-
{% trans "Updated" %}
-
{{ configuration.updated|parse_isotime }}
-
-
diff --git a/trove_dashboard/content/database_configurations/templates/database_configurations/add_parameter.html b/trove_dashboard/content/database_configurations/templates/database_configurations/add_parameter.html deleted file mode 100644 index b8036bd..0000000 --- a/trove_dashboard/content/database_configurations/templates/database_configurations/add_parameter.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} - -{% block main %} - {% include "project/database_configurations/_add_parameter.html" %} -{% endblock %} diff --git a/trove_dashboard/content/database_configurations/templates/database_configurations/create.html b/trove_dashboard/content/database_configurations/templates/database_configurations/create.html deleted file mode 100644 index 33a3683..0000000 --- a/trove_dashboard/content/database_configurations/templates/database_configurations/create.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} - -{% block main %} - {% include "project/database_configurations/_create.html" %} -{% endblock %} \ No newline at end of file diff --git a/trove_dashboard/content/database_configurations/templates/database_configurations/detail_param.html b/trove_dashboard/content/database_configurations/templates/database_configurations/detail_param.html deleted file mode 100644 index 5df8d50..0000000 --- a/trove_dashboard/content/database_configurations/templates/database_configurations/detail_param.html +++ /dev/null @@ -1,8 +0,0 @@ -{% load i18n %} - -
-
- {% trans "Add parameters to the configuration group. When all the parameters are added click 'Apply Changes' to persist changes." %} -
-
-{{ table.render }} diff --git a/trove_dashboard/content/database_configurations/templates/database_configurations/details.html b/trove_dashboard/content/database_configurations/templates/database_configurations/details.html deleted file mode 100644 index 1090210..0000000 --- a/trove_dashboard/content/database_configurations/templates/database_configurations/details.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends 'base.html' %} - -{% block main %} -
-
- {{ tab_group.render }} -
-
-{% endblock %} - diff --git a/trove_dashboard/content/database_configurations/templates/database_configurations/index.html b/trove_dashboard/content/database_configurations/templates/database_configurations/index.html deleted file mode 100644 index fbc7378..0000000 --- a/trove_dashboard/content/database_configurations/templates/database_configurations/index.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends 'base.html' %} - -{% block main %} - {{ table.render }} -{% endblock %} diff --git a/trove_dashboard/content/database_configurations/tests.py b/trove_dashboard/content/database_configurations/tests.py deleted file mode 100644 index 20fba8f..0000000 --- a/trove_dashboard/content/database_configurations/tests.py +++ /dev/null @@ -1,548 +0,0 @@ -# Copyright 2015 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import copy -import logging -import six - -import django -from django.conf import settings -from django.core.urlresolvers import reverse -from django import http -from mox3.mox import IsA # noqa - -from trove_dashboard import api -from trove_dashboard.content.database_configurations \ - import config_param_manager -from trove_dashboard.test import helpers as test - - -INDEX_URL = reverse('horizon:project:database_configurations:index') -CREATE_URL = reverse('horizon:project:database_configurations:create') -DETAIL_URL = 'horizon:project:database_configurations:detail' -ADD_URL = 'horizon:project:database_configurations:add' - - -class DatabaseConfigurationsTests(test.TestCase): - @test.create_stubs({api.trove: ('configuration_list',)}) - def test_index(self): - api.trove.configuration_list(IsA(http.HttpRequest)) \ - .AndReturn(self.database_configurations.list()) - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed(res, - 'project/database_configurations/index.html') - - @test.create_stubs({api.trove: ('configuration_list',)}) - def test_index_exception(self): - api.trove.configuration_list(IsA(http.HttpRequest)) \ - .AndRaise(self.exceptions.trove) - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed( - res, 'project/database_configurations/index.html') - self.assertEqual(res.status_code, 200) - self.assertMessageCount(res, error=1) - - @test.create_stubs({ - api.trove: ('datastore_list', 'datastore_version_list')}) - def test_create_configuration(self): - api.trove.datastore_list(IsA(http.HttpRequest)) \ - .AndReturn(self.datastores.list()) - api.trove.datastore_version_list(IsA(http.HttpRequest), IsA(str)) \ - .MultipleTimes().AndReturn(self.datastore_versions.list()) - self.mox.ReplayAll() - res = self.client.get(CREATE_URL) - self.assertTemplateUsed(res, - 'project/database_configurations/create.html') - - @test.create_stubs({api.trove: ('datastore_list',)}) - def test_create_configuration_exception_on_datastore(self): - api.trove.datastore_list(IsA(http.HttpRequest)) \ - .AndRaise(self.exceptions.trove) - self.mox.ReplayAll() - toSuppress = ["trove_dashboard.content." - "database_configurations.forms", ] - - # Suppress expected log messages in the test output - loggers = [] - for cls in toSuppress: - logger = logging.getLogger(cls) - loggers.append((logger, logger.getEffectiveLevel())) - logger.setLevel(logging.CRITICAL) - - try: - res = self.client.get(CREATE_URL) - self.assertEqual(res.status_code, 302) - - finally: - # Restore the previous log levels - for (log, level) in loggers: - log.setLevel(level) - - @test.create_stubs({ - api.trove: ('datastore_list', 'datastore_version_list', - 'configuration_create')}) - def _test_create_test_configuration( - self, config_description=u''): - api.trove.datastore_list(IsA(http.HttpRequest)) \ - .AndReturn(self.datastores.list()) - api.trove.datastore_version_list(IsA(http.HttpRequest), IsA(str)) \ - .MultipleTimes().AndReturn(self.datastore_versions.list()) - - name = u'config1' - values = "{}" - ds = self._get_test_datastore('mysql') - dsv = self._get_test_datastore_version(ds.id, '5.5') - config_datastore = ds.name - config_datastore_version = dsv.name - - api.trove.configuration_create( - IsA(http.HttpRequest), - name, - values, - description=config_description, - datastore=config_datastore, - datastore_version=config_datastore_version) \ - .AndReturn(self.database_configurations.first()) - - self.mox.ReplayAll() - post = { - 'method': 'CreateConfigurationForm', - 'name': name, - 'description': config_description, - 'datastore': (config_datastore + ',' + config_datastore_version)} - - res = self.client.post(CREATE_URL, post) - self.assertNoFormErrors(res) - self.assertMessageCount(success=1) - - def test_create_test_configuration(self): - self._test_create_test_configuration(u'description of config1') - - def test_create_test_configuration_with_no_description(self): - self._test_create_test_configuration() - - @test.create_stubs({ - api.trove: ('datastore_list', 'datastore_version_list', - 'configuration_create')}) - def test_create_test_configuration_exception(self): - api.trove.datastore_list(IsA(http.HttpRequest)) \ - .AndReturn(self.datastores.list()) - api.trove.datastore_version_list(IsA(http.HttpRequest), IsA(str)) \ - .MultipleTimes().AndReturn(self.datastore_versions.list()) - - name = u'config1' - values = "{}" - config_description = u'description of config1' - ds = self._get_test_datastore('mysql') - dsv = self._get_test_datastore_version(ds.id, '5.5') - config_datastore = ds.name - config_datastore_version = dsv.name - - api.trove.configuration_create( - IsA(http.HttpRequest), - name, - values, - description=config_description, - datastore=config_datastore, - datastore_version=config_datastore_version) \ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - post = {'method': 'CreateConfigurationForm', - 'name': name, - 'description': config_description, - 'datastore': config_datastore + ',' + config_datastore_version} - - res = self.client.post(CREATE_URL, post) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({api.trove: ('configuration_get', - 'configuration_instances',)}) - def test_details_tab(self): - config = self.database_configurations.first() - api.trove.configuration_get(IsA(http.HttpRequest), - config.id) \ - .AndReturn(config) - self.mox.ReplayAll() - details_url = self._get_url_with_arg(DETAIL_URL, config.id) - url = details_url + '?tab=configuration_details__details' - res = self.client.get(url) - self.assertTemplateUsed(res, - 'project/database_configurations/details.html') - - @test.create_stubs({api.trove: ('configuration_get',)}) - def test_overview_tab_exception(self): - config = self.database_configurations.first() - api.trove.configuration_get(IsA(http.HttpRequest), - config.id) \ - .AndRaise(self.exceptions.trove) - self.mox.ReplayAll() - details_url = self._get_url_with_arg(DETAIL_URL, config.id) - url = details_url + '?tab=configuration_details__overview' - res = self.client.get(url) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('configuration_get', 'configuration_parameters_list',), - config_param_manager.ConfigParamManager: - ('get_configuration', 'configuration_get',)}) - def test_add_parameter(self): - config = config_param_manager.ConfigParamManager.get_configuration() \ - .AndReturn(self.database_configurations.first()) - - config_param_manager.ConfigParamManager \ - .configuration_get(IsA(http.HttpRequest)) \ - .AndReturn(config) - ds = self._get_test_datastore('mysql') - dsv = self._get_test_datastore_version(ds.id, '5.5') - api.trove.configuration_parameters_list( - IsA(http.HttpRequest), - ds.name, - dsv.name) \ - .AndReturn(self.configuration_parameters.list()) - self.mox.ReplayAll() - res = self.client.get(self._get_url_with_arg(ADD_URL, 'id')) - self.assertTemplateUsed( - res, 'project/database_configurations/add_parameter.html') - - @test.create_stubs({ - api.trove: ('configuration_get', 'configuration_parameters_list',), - config_param_manager.ConfigParamManager: - ('get_configuration', 'configuration_get',)}) - def test_add_parameter_exception_on_parameters(self): - try: - config = (config_param_manager.ConfigParamManager - .get_configuration() - .AndReturn(self.database_configurations.first())) - - config_param_manager.ConfigParamManager \ - .configuration_get(IsA(http.HttpRequest)) \ - .AndReturn(config) - - ds = self._get_test_datastore('mysql') - dsv = self._get_test_datastore_version(ds.id, '5.5') - api.trove.configuration_parameters_list( - IsA(http.HttpRequest), - ds.name, - dsv.name) \ - .AndRaise(self.exceptions.trove) - self.mox.ReplayAll() - toSuppress = ["trove_dashboard.content." - "database_configurations.forms", ] - - # Suppress expected log messages in the test output - loggers = [] - for cls in toSuppress: - logger = logging.getLogger(cls) - loggers.append((logger, logger.getEffectiveLevel())) - logger.setLevel(logging.CRITICAL) - - try: - res = self.client.get( - self._get_url_with_arg(ADD_URL, config.id)) - self.assertEqual(res.status_code, 302) - - finally: - # Restore the previous log levels - for (log, level) in loggers: - log.setLevel(level) - finally: - config_param_manager.delete(config.id) - - @test.create_stubs({ - api.trove: ('configuration_get', 'configuration_parameters_list',), - config_param_manager.ConfigParamManager: - ('get_configuration', 'add_param', 'configuration_get',)}) - def test_add_new_parameter(self): - config = (config_param_manager.ConfigParamManager - .get_configuration() - .AndReturn(self.database_configurations.first())) - try: - config_param_manager.ConfigParamManager \ - .configuration_get(IsA(http.HttpRequest)) \ - .AndReturn(config) - - ds = self._get_test_datastore('mysql') - dsv = self._get_test_datastore_version(ds.id, '5.5') - api.trove.configuration_parameters_list( - IsA(http.HttpRequest), - ds.name, - dsv.name) \ - .AndReturn(self.configuration_parameters.list()) - - name = self.configuration_parameters.first().name - value = 1 - - config_param_manager.ConfigParamManager.add_param(name, value) \ - .AndReturn(value) - - self.mox.ReplayAll() - post = { - 'method': 'AddParameterForm', - 'name': name, - 'value': value} - - res = self.client.post(self._get_url_with_arg(ADD_URL, config.id), - post) - self.assertNoFormErrors(res) - self.assertMessageCount(success=1) - finally: - config_param_manager.delete(config.id) - - @test.create_stubs({ - api.trove: ('configuration_get', 'configuration_parameters_list',), - config_param_manager: ('get',)}) - def test_add_parameter_invalid_value(self): - try: - config = self.database_configurations.first() - - # setup the configuration parameter manager - config_param_mgr = config_param_manager.ConfigParamManager( - config.id) - config_param_mgr.configuration = config - config_param_mgr.original_configuration_values = \ - dict.copy(config.values) - - (config_param_manager.get(IsA(http.HttpRequest), - IsA(six.string_types)) - .MultipleTimes() - .AndReturn(config_param_mgr)) - (api.trove.configuration_parameters_list(IsA(http.HttpRequest), - IsA(six.string_types), - IsA(six.string_types)) - .MultipleTimes() - .AndReturn(self.configuration_parameters.list())) - - name = self.configuration_parameters.first().name - value = "non-numeric" - - self.mox.ReplayAll() - post = { - 'method': 'AddParameterForm', - 'name': name, - 'value': value} - - res = self.client.post(self._get_url_with_arg(ADD_URL, config.id), - post) - self.assertFormError(res, "form", 'value', - ['Value must be a number.']) - finally: - config_param_manager.delete(config.id) - - @test.create_stubs({api.trove: ('configuration_get', - 'configuration_instances',)}) - def test_values_tab_discard_action(self): - config = self.database_configurations.first() - - api.trove.configuration_get(IsA(http.HttpRequest), config.id) \ - .MultipleTimes().AndReturn(config) - self.mox.ReplayAll() - - details_url = self._get_url_with_arg(DETAIL_URL, config.id) - url = details_url + '?tab=configuration_details__value' - - self._test_create_altered_config_params(config, url) - - # get the state of the configuration before discard action - changed_configuration_values = \ - dict.copy(config_param_manager.get(self.request, config.id) - .get_configuration().values) - - res = self.client.post(url, {'action': u"values__discard_changes"}) - if django.VERSION >= (1, 9): - url = settings.TESTSERVER + url - self.assertRedirectsNoFollow(res, url) - - # get the state of the configuration after discard action - restored_configuration_values = \ - dict.copy(config_param_manager.get(self.request, config.id) - .get_configuration().values) - - self.assertTrue(config_param_manager.dict_has_changes( - changed_configuration_values, restored_configuration_values)) - - @test.create_stubs({api.trove: ('configuration_instances', - 'configuration_update',), - config_param_manager: ('get',)}) - def test_values_tab_apply_action(self): - config = copy.deepcopy(self.database_configurations.first()) - - # setup the configuration parameter manager - config_param_mgr = config_param_manager.ConfigParamManager( - config.id) - config_param_mgr.configuration = config - config_param_mgr.original_configuration_values = \ - dict.copy(config.values) - - config_param_manager.get(IsA(http.HttpRequest), config.id) \ - .MultipleTimes().AndReturn(config_param_mgr) - - api.trove.configuration_update( - IsA(http.HttpRequest), - config.id, - config_param_mgr.to_json()) \ - .AndReturn(None) - self.mox.ReplayAll() - - details_url = self._get_url_with_arg(DETAIL_URL, config.id) - url = details_url + '?tab=configuration_details__value' - - self._test_create_altered_config_params(config, url) - - # apply changes - res = self.client.post(url, {'action': u"values__apply_changes"}) - if django.VERSION >= (1, 9): - url = settings.TESTSERVER + url - self.assertRedirectsNoFollow(res, url) - - @test.create_stubs({api.trove: ('configuration_instances', - 'configuration_update',), - config_param_manager: ('get',)}) - def test_values_tab_apply_action_exception(self): - config = copy.deepcopy(self.database_configurations.first()) - - # setup the configuration parameter manager - config_param_mgr = config_param_manager.ConfigParamManager( - config.id) - config_param_mgr.configuration = config - config_param_mgr.original_configuration_values = \ - dict.copy(config.values) - - config_param_manager.get(IsA(http.HttpRequest), config.id) \ - .MultipleTimes().AndReturn(config_param_mgr) - - api.trove.configuration_update( - IsA(http.HttpRequest), - config.id, - config_param_mgr.to_json())\ - .AndRaise(self.exceptions.trove) - self.mox.ReplayAll() - - details_url = self._get_url_with_arg(DETAIL_URL, config.id) - url = details_url + '?tab=configuration_details__value' - - self._test_create_altered_config_params(config, url) - - # apply changes - res = self.client.post(url, {'action': u"values__apply_changes"}) - if django.VERSION >= (1, 9): - url = settings.TESTSERVER + url - self.assertRedirectsNoFollow(res, url) - self.assertEqual(res.status_code, 302) - - def _test_create_altered_config_params(self, config, url): - # determine the number of configuration group parameters in the list - res = self.client.get(url) - - table_data = res.context['table'].data - number_params = len(table_data) - config_param = table_data[0] - - # delete the first parameter - action_string = u"values__delete__%s" % config_param.name - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - # verify the test number of parameters is reduced by 1 - res = self.client.get(url) - table_data = res.context['table'].data - new_number_params = len(table_data) - - self.assertEqual((number_params - 1), new_number_params) - - @test.create_stubs({api.trove: ('configuration_instances',), - config_param_manager: ('get',)}) - def test_instances_tab(self): - try: - config = self.database_configurations.first() - - # setup the configuration parameter manager - config_param_mgr = config_param_manager.ConfigParamManager( - config.id) - config_param_mgr.configuration = config - config_param_mgr.original_configuration_values = \ - dict.copy(config.values) - - config_param_manager.get(IsA(http.HttpRequest), config.id) \ - .MultipleTimes().AndReturn(config_param_mgr) - - api.trove.configuration_instances(IsA(http.HttpRequest), - config.id)\ - .AndReturn(self.configuration_instances.list()) - self.mox.ReplayAll() - - details_url = self._get_url_with_arg(DETAIL_URL, config.id) - url = details_url + '?tab=configuration_details__instance' - - res = self.client.get(url) - table_data = res.context['instances_table'].data - self.assertItemsEqual( - self.configuration_instances.list(), table_data) - self.assertTemplateUsed( - res, 'project/database_configurations/details.html') - finally: - config_param_manager.delete(config.id) - - @test.create_stubs({api.trove: ('configuration_instances',), - config_param_manager: ('get',)}) - def test_instances_tab_exception(self): - try: - config = self.database_configurations.first() - - # setup the configuration parameter manager - config_param_mgr = config_param_manager.ConfigParamManager( - config.id) - config_param_mgr.configuration = config - config_param_mgr.original_configuration_values = \ - dict.copy(config.values) - - config_param_manager.get(IsA(http.HttpRequest), config.id) \ - .MultipleTimes().AndReturn(config_param_mgr) - - api.trove.configuration_instances(IsA(http.HttpRequest), - config.id) \ - .AndRaise(self.exceptions.trove) - self.mox.ReplayAll() - - details_url = self._get_url_with_arg(DETAIL_URL, config.id) - url = details_url + '?tab=configuration_details__instance' - - res = self.client.get(url) - table_data = res.context['instances_table'].data - self.assertNotEqual(len(self.configuration_instances.list()), - len(table_data)) - self.assertTemplateUsed( - res, 'project/database_configurations/details.html') - finally: - config_param_manager.delete(config.id) - - def _get_url_with_arg(self, url, arg): - return reverse(url, args=[arg]) - - def _get_test_datastore(self, datastore_name): - for ds in self.datastores.list(): - if ds.name == datastore_name: - return ds - return None - - def _get_test_datastore_version(self, datastore_id, - datastore_version_name): - for dsv in self.datastore_versions.list(): - if (dsv.datastore == datastore_id and - dsv.name == datastore_version_name): - return dsv - return None diff --git a/trove_dashboard/content/database_configurations/urls.py b/trove_dashboard/content/database_configurations/urls.py deleted file mode 100644 index 71085a5..0000000 --- a/trove_dashboard/content/database_configurations/urls.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright 2015 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.conf.urls import url # noqa - -from trove_dashboard.content.database_configurations \ - import views - - -CONFIGS = r'^(?P[^/]+)/%s$' - - -urlpatterns = [ - url(r'^$', - views.IndexView.as_view(), - name='index'), - url(r'^create$', - views.CreateConfigurationView.as_view(), - name='create'), - url(CONFIGS % '', - views.DetailView.as_view(), - name='detail'), - url(CONFIGS % 'add', - views.AddParameterView.as_view(), - name='add') -] diff --git a/trove_dashboard/content/database_configurations/views.py b/trove_dashboard/content/database_configurations/views.py deleted file mode 100644 index 04ec842..0000000 --- a/trove_dashboard/content/database_configurations/views.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright 2015 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.core.urlresolvers import reverse -from django.core.urlresolvers import reverse_lazy -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import forms as horizon_forms -from horizon import tables as horizon_tables -from horizon import tabs as horizon_tabs -from horizon.utils import memoized - -from trove_dashboard import api -from trove_dashboard.content.database_configurations \ - import config_param_manager -from trove_dashboard.content.database_configurations \ - import forms -from trove_dashboard.content.database_configurations \ - import tables -from trove_dashboard.content.database_configurations \ - import tabs - - -class IndexView(horizon_tables.DataTableView): - table_class = tables.ConfigurationsTable - template_name = 'project/database_configurations/index.html' - page_title = _("Configuration Groups") - - def get_data(self): - try: - configurations = api.trove.configuration_list(self.request) - except Exception: - configurations = [] - msg = _('Error getting configuration group list.') - exceptions.handle(self.request, msg) - return configurations - - -class DetailView(horizon_tabs.TabbedTableView): - tab_group_class = tabs.ConfigurationDetailTabs - template_name = "project/database_configurations/details.html" - page_title = _("Configuration Group Details: {{configuration.name}}") - - def get_context_data(self, **kwargs): - context = super(DetailView, self).get_context_data(**kwargs) - context["configuration"] = self.get_data() - return context - - @memoized.memoized_method - def get_data(self): - try: - configuration_id = self.kwargs['configuration_id'] - return (config_param_manager - .get(self.request, configuration_id) - .configuration_get(self.request)) - except Exception: - redirect = reverse('horizon:project:database_configurations:index') - msg = _('Unable to retrieve details for configuration ' - 'group: %s') % configuration_id - exceptions.handle(self.request, msg, redirect=redirect) - - def get_tabs(self, request, *args, **kwargs): - configuration = self.get_data() - return self.tab_group_class(request, - configuration=configuration, - **kwargs) - - -class CreateConfigurationView(horizon_forms.ModalFormView): - form_class = forms.CreateConfigurationForm - form_id = "create_configuration_form" - modal_header = _("Create Configuration Group") - modal_id = "create_configuration_modal" - template_name = 'project/database_configurations/create.html' - submit_label = "Create Configuration Group" - submit_url = reverse_lazy('horizon:project:database_configurations:create') - success_url = reverse_lazy('horizon:project:database_configurations:index') - - -class AddParameterView(horizon_forms.ModalFormView): - form_class = forms.AddParameterForm - form_id = "add_parameter_form" - modal_header = _("Add Parameter") - modal_id = "add_parameter_modal" - template_name = 'project/database_configurations/add_parameter.html' - submit_label = "Add Parameter" - submit_url = 'horizon:project:database_configurations:add' - success_url = 'horizon:project:database_configurations:detail' - - def get_success_url(self): - return reverse(self.success_url, - args=(self.kwargs['configuration_id'],)) - - def get_context_data(self, **kwargs): - context = super(AddParameterView, self).get_context_data(**kwargs) - context["configuration_id"] = self.kwargs['configuration_id'] - args = (self.kwargs['configuration_id'],) - context['submit_url'] = reverse(self.submit_url, args=args) - return context - - def get_initial(self): - configuration_id = self.kwargs['configuration_id'] - return {'configuration_id': configuration_id} diff --git a/trove_dashboard/content/databases/__init__.py b/trove_dashboard/content/databases/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/content/databases/db_capability.py b/trove_dashboard/content/databases/db_capability.py deleted file mode 100644 index 4d0025b..0000000 --- a/trove_dashboard/content/databases/db_capability.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2015 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -CASSANDRA = "cassandra" -MARIA = "maria" -MONGODB = "mongodb" -MYSQL = "mysql" -PERCONA = "percona" -PERCONA_CLUSTER = "pxc" -REDIS = "redis" -VERTICA = "vertica" - -_mysql_compatible_datastores = (MYSQL, MARIA, PERCONA, PERCONA_CLUSTER) -_cluster_capable_datastores = (CASSANDRA, MARIA, MONGODB, PERCONA_CLUSTER, - REDIS, VERTICA) -_cluster_grow_shrink_capable_datastores = (CASSANDRA, MARIA, MONGODB, - PERCONA_CLUSTER, REDIS) - - -def can_modify_cluster(datastore): - return _is_datastore_in_list(datastore, - _cluster_grow_shrink_capable_datastores) - - -def is_mongodb_datastore(datastore): - return (datastore is not None) and (MONGODB in datastore.lower()) - - -def is_percona_cluster_datastore(datastore): - return (datastore is not None) and (PERCONA_CLUSTER in datastore.lower()) - - -def is_redis_datastore(datastore): - return (datastore is not None) and (REDIS in datastore.lower()) - - -def is_vertica_datastore(datastore): - return (datastore is not None) and (VERTICA in datastore.lower()) - - -def is_mysql_compatible(datastore): - return _is_datastore_in_list(datastore, _mysql_compatible_datastores) - - -def is_cluster_capable_datastore(datastore): - return _is_datastore_in_list(datastore, _cluster_capable_datastores) - - -def _is_datastore_in_list(datastore, datastores): - if datastore is not None: - datastore_lower = datastore.lower() - for ds in datastores: - if ds in datastore_lower: - return True - return False diff --git a/trove_dashboard/content/databases/forms.py b/trove_dashboard/content/databases/forms.py deleted file mode 100644 index 478e407..0000000 --- a/trove_dashboard/content/databases/forms.py +++ /dev/null @@ -1,283 +0,0 @@ -# Copyright 2014 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.core.urlresolvers import reverse -from django.forms import ValidationError # noqa -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import forms -from horizon import messages -from horizon.utils import validators - -from trove_dashboard import api - - -class CreateDatabaseForm(forms.SelfHandlingForm): - instance_id = forms.CharField(widget=forms.HiddenInput()) - name = forms.CharField(label=_("Name")) - character_set = forms.CharField( - label=_("Character Set"), required=False, - help_text=_("Optional character set for the database.")) - collation = forms.CharField( - label=_("Collation"), required=False, - help_text=_("Optional collation type for the database.")) - - def handle(self, request, data): - instance = data.get('instance_id') - try: - api.trove.database_create(request, instance, data['name'], - character_set=data['character_set'], - collation=data['collation']) - - messages.success(request, - _('Created database "%s".') % data['name']) - except Exception as e: - redirect = reverse("horizon:project:databases:detail", - args=(instance,)) - exceptions.handle(request, _('Unable to create database. %s') % - e.message, redirect=redirect) - return True - - -class ResizeVolumeForm(forms.SelfHandlingForm): - instance_id = forms.CharField(widget=forms.HiddenInput()) - orig_size = forms.IntegerField( - label=_("Current Size (GB)"), - widget=forms.TextInput(attrs={'readonly': 'readonly'}), - required=False, - ) - new_size = forms.IntegerField(label=_("New Size (GB)")) - - def __init__(self, request, *args, **kwargs): - super(ResizeVolumeForm, self).__init__(request, *args, **kwargs) - - self.fields['instance_id'].initial = (kwargs.get('initial', {}). - get('instance_id')) - self.fields['orig_size'].initial = (kwargs.get('initial', {}). - get('orig_size')) - - def clean(self): - cleaned_data = super(ResizeVolumeForm, self).clean() - new_size = cleaned_data.get('new_size') - if new_size <= self.initial['orig_size']: - raise ValidationError( - _("New size for volume must be greater than current size.")) - - return cleaned_data - - def handle(self, request, data): - instance = data.get('instance_id') - try: - api.trove.instance_resize_volume(request, - instance, - data['new_size']) - - messages.success(request, _('Resizing volume "%s"') % instance) - except Exception as e: - redirect = reverse("horizon:project:databases:index") - exceptions.handle(request, _('Unable to resize volume. %s') % - e.message, redirect=redirect) - return True - - -class ResizeInstanceForm(forms.SelfHandlingForm): - instance_id = forms.CharField(widget=forms.HiddenInput()) - old_flavor_name = forms.CharField(label=_("Old Flavor"), - required=False, - widget=forms.TextInput( - attrs={'readonly': 'readonly'})) - new_flavor = forms.ChoiceField(label=_("New Flavor"), - help_text=_("Choose a new instance " - "flavor.")) - - def __init__(self, request, *args, **kwargs): - super(ResizeInstanceForm, self).__init__(request, *args, **kwargs) - - old_flavor_id = kwargs.get('initial', {}).get('old_flavor_id') - choices = kwargs.get('initial', {}).get('flavors') - # Remove current flavor from the list of flavor choices - choices = [(flavor_id, name) for (flavor_id, name) in choices - if flavor_id != old_flavor_id] - if choices: - choices.insert(0, ("", _("Select a new flavor"))) - else: - choices.insert(0, ("", _("No flavors available"))) - self.fields['new_flavor'].choices = choices - - def handle(self, request, data): - instance = data.get('instance_id') - flavor = data.get('new_flavor') - try: - api.trove.instance_resize(request, instance, flavor) - - messages.success(request, _('Resizing instance "%s"') % instance) - except Exception as e: - redirect = reverse("horizon:project:databases:index") - exceptions.handle(request, _('Unable to resize instance. %s') % - e.message, redirect=redirect) - return True - - -class PromoteToReplicaSourceForm(forms.SelfHandlingForm): - instance_id = forms.CharField(widget=forms.HiddenInput()) - - def handle(self, request, data): - instance_id = data.get('instance_id') - name = self.initial['replica'].name - try: - api.trove.promote_to_replica_source(request, instance_id) - messages.success( - request, - _('Promoted replica "%s" as the new replica source.') % name) - except Exception as e: - redirect = reverse("horizon:project:databases:index") - exceptions.handle( - request, - _('Unable to promote replica as the new replica source. "%s"') - % e.message, redirect=redirect) - return True - - -class CreateUserForm(forms.SelfHandlingForm): - instance_id = forms.CharField(widget=forms.HiddenInput()) - name = forms.CharField(label=_("Name")) - password = forms.RegexField( - label=_("Password"), - widget=forms.PasswordInput(render_value=False), - regex=validators.password_validator(), - error_messages={'invalid': validators.password_validator_msg()}) - host = forms.CharField( - label=_("Host"), required=False, help_text=_("Optional host of user.")) - databases = forms.CharField( - label=_('Initial Databases'), required=False, - help_text=_('Optional comma separated list of databases user has ' - 'access to.')) - - def handle(self, request, data): - instance = data.get('instance_id') - try: - api.trove.user_create( - request, - instance, - data['name'], - data['password'], - host=data['host'], - databases=self._get_databases(data)) - - messages.success(request, - _('Created user "%s".') % data['name']) - except Exception as e: - redirect = reverse("horizon:project:databases:detail", - args=(instance,)) - exceptions.handle(request, _('Unable to create user. %s') % - e.message, redirect=redirect) - return True - - def _get_databases(self, data): - databases = [] - db_value = data['databases'] - if db_value and db_value != u'': - dbs = data['databases'] - databases = [{'name': d.strip()} for d in dbs.split(',')] - return databases - - -class EditUserForm(forms.SelfHandlingForm): - instance_id = forms.CharField(widget=forms.HiddenInput()) - user_name = forms.CharField( - label=_("Name"), - widget=forms.TextInput(attrs={'readonly': 'readonly'})) - user_host = forms.CharField( - label=_("Host"), required=False, - widget=forms.TextInput(attrs={'readonly': 'readonly'})) - new_name = forms.CharField(label=_("New Name"), required=False) - new_password = forms.RegexField( - label=_("New Password"), required=False, - widget=forms.PasswordInput(render_value=False), - regex=validators.password_validator(), - error_messages={'invalid': validators.password_validator_msg()}) - new_host = forms.CharField(label=_("New Host"), required=False) - - validation_error_message = _('A new name or new password or ' - 'new host must be specified.') - - def handle(self, request, data): - instance = data.get('instance_id') - try: - api.trove.user_update_attributes( - request, - instance, - data['user_name'], - host=data['user_host'], - new_name=data['new_name'], - new_password=data['new_password'], - new_host=data['new_host']) - - messages.success(request, - _('Updated user "%s".') % data['user_name']) - except Exception as e: - redirect = reverse("horizon:project:databases:detail", - args=(instance,)) - exceptions.handle(request, _('Unable to update user. %s') % - e.message, redirect=redirect) - return True - - def clean(self): - cleaned_data = super(EditUserForm, self).clean() - - if (not (cleaned_data['new_name'] or - cleaned_data['new_password'] or - cleaned_data['new_host'])): - raise ValidationError(self.validation_error_message) - - return cleaned_data - - -class AttachConfigurationForm(forms.SelfHandlingForm): - instance_id = forms.CharField(widget=forms.HiddenInput()) - configuration = forms.ChoiceField(label=_("Configuration Group")) - - def __init__(self, request, *args, **kwargs): - super(AttachConfigurationForm, self).__init__(request, *args, **kwargs) - instance_id = kwargs.get('initial', {}).get('instance_id') - datastore = kwargs.get('initial', {}).get('datastore') - datastore_version = kwargs.get('initial', {}).get('datastore_version') - self.fields['instance_id'].initial = instance_id - - configurations = api.trove.configuration_list(request) - choices = [(c.id, c.name) for c in configurations - if (c.datastore_name == datastore and - c.datastore_version_name == datastore_version)] - if choices: - choices.insert(0, ("", _("Select configuration group"))) - else: - choices.insert(0, ("", _("No configuration groups available"))) - self.fields['configuration'].choices = choices - - def handle(self, request, data): - instance_id = data.get('instance_id') - try: - api.trove.instance_attach_configuration(request, - instance_id, - data['configuration']) - - messages.success(request, _('Attaching Configuration group "%s"') - % instance_id) - except Exception as e: - redirect = reverse("horizon:project:databases:index") - exceptions.handle(request, _('Unable to attach configuration ' - 'group. %s') - % e.message, redirect=redirect) - return True diff --git a/trove_dashboard/content/databases/logs/__init__.py b/trove_dashboard/content/databases/logs/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/content/databases/logs/tables.py b/trove_dashboard/content/databases/logs/tables.py deleted file mode 100644 index 7decdd0..0000000 --- a/trove_dashboard/content/databases/logs/tables.py +++ /dev/null @@ -1,156 +0,0 @@ -# Copyright 2016 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.core import urlresolvers -from django.utils.translation import ugettext_lazy as _ -from django.utils.translation import ungettext_lazy - -from horizon import tables - -from trove_dashboard import api - - -class PublishLog(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Publish Log", - u"Publish Logs", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Published Log", - u"Published Logs", - count - ) - - name = "publish_log" - - def action(self, request, obj_id): - instance_id = self.table.kwargs['instance_id'] - api.trove.log_publish(request, instance_id, obj_id) - - -class DiscardLog(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Discard Log", - u"Discard Logs", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Discarded Log", - u"Discarded Logs", - count - ) - - name = "discard_log" - - def action(self, request, obj_id): - instance_id = self.table.kwargs['instance_id'] - api.trove.log_discard(request, instance_id, obj_id) - - -class EnableLog(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Enable Log", - u"Enable Logs", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Enabled Log", - u"Enabled Logs", - count - ) - - name = "enable_log" - - def action(self, request, obj_id): - instance_id = self.table.kwargs['instance_id'] - api.trove.log_enable(request, instance_id, obj_id) - - -class DisableLog(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Disable Log", - u"Disable Logs", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Disabled Log", - u"Disabled Logs", - count - ) - - name = "disable_log" - - def action(self, request, obj_id): - instance_id = self.table.kwargs['instance_id'] - api.trove.log_disable(request, instance_id, obj_id) - - def allowed(self, request, datum=None): - if datum: - return datum.type != "SYS" - return False - - -class ViewLog(tables.LinkAction): - name = "view_log" - verbose_name = _("View Log") - url = "horizon:project:databases:logs:log_contents" - - def get_link_url(self, datum): - instance_id = self.table.kwargs['instance_id'] - return urlresolvers.reverse(self.url, - args=(instance_id, - datum.name)) - - def allowed(self, request, datum=None): - if datum: - return datum.published > 0 - return False - - -class LogsTable(tables.DataTable): - name = tables.Column('name', verbose_name=_('Name')) - type = tables.Column('type', verbose_name=_("Type")) - status = tables.Column('status', verbose_name=_("Status")) - published = tables.Column('published', verbose_name=_('Published (bytes)')) - pending = tables.Column('pending', verbose_name=_('Publishable (bytes)')) - container = tables.Column('container', verbose_name=_('Container')) - - class Meta(object): - name = "logs" - verbose_name = _("Logs") - row_actions = (ViewLog, PublishLog, EnableLog, DisableLog, DiscardLog) - - def get_object_id(self, datum): - return datum.name diff --git a/trove_dashboard/content/databases/logs/tests.py b/trove_dashboard/content/databases/logs/tests.py deleted file mode 100644 index cb8a03d..0000000 --- a/trove_dashboard/content/databases/logs/tests.py +++ /dev/null @@ -1,361 +0,0 @@ -# Copyright 2016 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -from django.core.urlresolvers import reverse -from django import http - -from mox3 import mox -from mox3.mox import IsA # noqa -import six - -from trove_dashboard import api -from trove_dashboard.test import helpers as test - -from swiftclient import client as swift_client - -LINES = 50 - - -class LogsTests(test.TestCase): - def stub_swiftclient(self, expected_calls=1): - if not hasattr(self, "swiftclient"): - self.mox.StubOutWithMock(swift_client, 'Connection') - self.swiftclient = self.mox.CreateMock(swift_client.Connection) - while expected_calls: - (swift_client.Connection(None, - mox.IgnoreArg(), - None, - preauthtoken=mox.IgnoreArg(), - preauthurl=mox.IgnoreArg(), - cacert=None, - insecure=False, - auth_version="2.0") - .AndReturn(self.swiftclient)) - expected_calls -= 1 - return self.swiftclient - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'root_show')}) - def test_log_tab(self): - database = self.databases.first() - database_id = database.id - - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndReturn(self.logs.list())) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.root_show(IsA(http.HttpRequest), database.id) - .AndReturn(self.database_user_roots.first())) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - res = self.client.get(url) - table_data = res.context['logs_table'].data - self.assertItemsEqual(self.logs.list(), table_data) - self.assertTemplateUsed( - res, 'horizon/common/_detail_table.html') - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'root_show')}) - def test_log_tab_exception(self): - database = self.databases.first() - database_id = database.id - - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndRaise(self.exceptions.trove)) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.root_show(IsA(http.HttpRequest), database.id) - .AndReturn(self.database_user_roots.first())) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - - toSuppress = ["trove_dashboard.content.databases.tabs"] - - loggers = [] - for cls in toSuppress: - logger = logging.getLogger(cls) - loggers.append((logger, logger.getEffectiveLevel())) - logger.setLevel(logging.CRITICAL) - - try: - res = self.client.get(url) - table_data = res.context['logs_table'].data - self.assertNotEqual(len(self.logs.list()), len(table_data)) - self.assertTemplateUsed( - res, 'horizon/common/_detail_table.html') - finally: - # Restore the previous log levels - for (log, level) in loggers: - log.setLevel(level) - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'log_publish',) - }) - def test_log_publish(self): - database = self.databases.first() - database_id = database.id - log = self.logs.first() - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndReturn(self.logs.list())) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.log_publish(IsA(http.HttpRequest), database_id, log.name) - .AndReturn(None)) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - action_string = u"logs__%s_log__%s" % ('publish', log.name) - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'log_publish',) - }) - def test_log_publish_exception(self): - database = self.databases.first() - database_id = database.id - log = self.logs.first() - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndReturn(self.logs.list())) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.log_publish(IsA(http.HttpRequest), database_id, log.name) - .AndRaise(self.exceptions.trove)) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - action_string = u"logs__%s_log__%s" % ('publish', log.name) - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'log_enable',) - }) - def test_log_enable(self): - database = self.databases.first() - database_id = database.id - log = self.logs.first() - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndReturn(self.logs.list())) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.log_enable(IsA(http.HttpRequest), database_id, log.name) - .AndReturn(None)) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - action_string = u"logs__%s_log__%s" % ('enable', log.name) - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'log_enable',) - }) - def test_log_enable_exception(self): - database = self.databases.first() - database_id = database.id - log = self.logs.first() - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndReturn(self.logs.list())) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.log_enable(IsA(http.HttpRequest), database_id, log.name) - .AndRaise(self.exceptions.trove)) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - action_string = u"logs__%s_log__%s" % ('enable', log.name) - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'log_discard',) - }) - def test_log_discard(self): - database = self.databases.first() - database_id = database.id - log = self.logs.first() - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndReturn(self.logs.list())) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.log_discard(IsA(http.HttpRequest), database_id, log.name) - .AndReturn(None)) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - action_string = u"logs__%s_log__%s" % ('discard', log.name) - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'log_discard',) - }) - def test_log_discard_exception(self): - database = self.databases.first() - database_id = database.id - log = self.logs.first() - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndReturn(self.logs.list())) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.log_discard(IsA(http.HttpRequest), database_id, log.name) - .AndRaise(self.exceptions.trove)) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - action_string = u"logs__%s_log__%s" % ('discard', log.name) - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'log_disable',) - }) - def test_log_disable(self): - database = self.databases.first() - database_id = database.id - log = self.logs.list()[3] - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndReturn(self.logs.list())) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.log_disable(IsA(http.HttpRequest), database_id, log.name) - .AndReturn(None)) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - action_string = u"logs__%s_log__%s" % ('disable', log.name) - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - @test.create_stubs({ - api.trove: ('flavor_get', 'instance_get', 'log_list', 'log_disable',) - }) - def test_log_disable_exception(self): - database = self.databases.first() - database_id = database.id - log = self.logs.list()[3] - (api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type)) - .AndReturn(database)) - (api.trove.log_list(IsA(http.HttpRequest), database_id) - .AndReturn(self.logs.list())) - (api.trove.flavor_get(IsA(http.HttpRequest), database.flavor["id"]) - .AndReturn(self.flavors.first())) - (api.trove.log_disable(IsA(http.HttpRequest), database_id, log.name) - .AndRaise(self.exceptions.trove)) - - self.mox.ReplayAll() - - detail_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = detail_url + '?tab=instance_details__logs_tab' - action_string = u"logs__%s_log__%s" % ('disable', log.name) - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - @test.create_stubs({api.trove: ('log_tail',)}) - def test_view_log(self): - CONSOLE_OUTPUT = 'superspecialuniquetext' - (api.trove.log_tail(IsA(http.HttpRequest), - IsA(six.string_types), - 'guest.log', - False, - LINES, - self.stub_swiftclient()) - .AndReturn(lambda: [CONSOLE_OUTPUT])) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:logs:log_contents', - args=('id', 'guest.log')) - res = self.client.get(url) - - self.assertNoMessages() - self.assertIsInstance(res, http.HttpResponse) - self.assertContains(res, CONSOLE_OUTPUT) - - @test.create_stubs({api.trove: ('log_tail',)}) - def test_view_log_exception(self): - (api.trove.log_tail(IsA(http.HttpRequest), - IsA(six.string_types), - 'guest.log', - False, - LINES, - self.stub_swiftclient()) - .AndRaise(self.exceptions.trove)) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:logs:log_contents', - args=('id', 'guest.log')) - res = self.client.get(url) - - self.assertContains(res, "Unable to load") diff --git a/trove_dashboard/content/databases/logs/urls.py b/trove_dashboard/content/databases/logs/urls.py deleted file mode 100644 index 4326e7b..0000000 --- a/trove_dashboard/content/databases/logs/urls.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2016 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.conf.urls import url - -from trove_dashboard.content.databases.logs import views - -LOGS = r'^(?P[^/]+)/%s$' - -urlpatterns = [ - url(LOGS % 'console', views.console, name='console'), - url(LOGS % 'download_log', views.download_log, name='download_log'), - url(LOGS % 'full_log', views.full_log, name='full_log'), - url(LOGS % 'log_contents', - views.LogContentsView.as_view(), name='log_contents'), -] diff --git a/trove_dashboard/content/databases/logs/views.py b/trove_dashboard/content/databases/logs/views.py deleted file mode 100644 index c1aec92..0000000 --- a/trove_dashboard/content/databases/logs/views.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright 2016 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django import http -from django import shortcuts -from django.utils.translation import ugettext_lazy as _ -from django.views import generic - -from horizon import exceptions -from horizon import messages - -from openstack_dashboard import api as dash_api -from trove_dashboard import api - -FULL_LOG_VALUE = 0 -DEFAULT_LINES = 50 - - -class LogContentsView(generic.TemplateView): - template_name = 'project/databases/logs/view_log.html' - preload = False - - def get_context_data(self, **kwargs): - context = super(LogContentsView, self).get_context_data(**kwargs) - context["instance_id"] = kwargs['instance_id'] - context["filename"] = kwargs['filename'] - context["publish"] = '' - - try: - log_length = int(kwargs['lines']) - except Exception: - log_length = DEFAULT_LINES - - context["log_length"] = log_length - context["log_contents"] = get_contents(self.request, - kwargs['instance_id'], - kwargs['filename'], - False, - log_length) - return context - - -def get_contents(request, instance_id, filename, publish, lines): - try: - log_generator = api.trove.log_tail(request, - instance_id, - filename, - publish, - lines, - dash_api.swift.swift_api(request)) - data = "" - for log_part in log_generator(): - data += log_part - except Exception as e: - data = _('Unable to load {0} log\n{1}').format(filename, e.message) - return data - - -def build_response(request, instance_id, filename, tail): - data = (_('Unable to load {0} log for instance "{1}".') - .format(filename, instance_id)) - - if request.GET.get('publish'): - publish = True - else: - publish = False - - try: - data = get_contents(request, - instance_id, - filename, - publish, - int(tail)) - except Exception: - exceptions.handle(request, ignore=True) - return http.HttpResponse(data.encode('utf-8'), content_type='text/plain') - - -def console(request, instance_id, filename): - tail = request.GET.get('length') - if not tail or (tail and not tail.isdigit()): - msg = _('Log length must be a nonnegative integer.') - messages.warning(request, msg) - data = (_('Unable to load {0} log for instance "{1}".') - .format(filename, instance_id)) - return http.HttpResponse(data.encode('utf-8'), - content_type='text/plain') - - return build_response(request, instance_id, filename, tail) - - -def full_log(request, instance_id, filename): - return build_response(request, instance_id, filename, FULL_LOG_VALUE) - - -def download_log(request, instance_id, filename): - try: - publish_value = request.GET.get('publish') - if publish_value: - publish = True - else: - publish = False - - data = get_contents(request, - instance_id, - filename, - publish, - FULL_LOG_VALUE) - response = http.HttpResponse() - response.write(data) - response['Content-Disposition'] = ('attachment; ' - 'filename="%s.log"' % filename) - response['Content-Length'] = str(len(response.content)) - return response - - except Exception as e: - messages.error(request, _('Error downloading log file: %s') % e) - return shortcuts.redirect(request.build_absolute_uri()) diff --git a/trove_dashboard/content/databases/panel.py b/trove_dashboard/content/databases/panel.py deleted file mode 100644 index 16cf6c0..0000000 --- a/trove_dashboard/content/databases/panel.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.utils.translation import ugettext_lazy as _ - -import horizon -from openstack_dashboard.dashboards.project import dashboard - - -class Databases(horizon.Panel): - name = _("Instances") - slug = 'databases' - permissions = ('openstack.services.database',) - - -dashboard.Project.register(Databases) diff --git a/trove_dashboard/content/databases/tables.py b/trove_dashboard/content/databases/tables.py deleted file mode 100644 index f1e3039..0000000 --- a/trove_dashboard/content/databases/tables.py +++ /dev/null @@ -1,753 +0,0 @@ -# Copyright 2012 Nebula, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import six.moves.urllib.parse as urlparse - -from django.conf import settings -from django.core import urlresolvers -from django.template import defaultfilters as d_filters - -from django.utils.translation import pgettext_lazy -from django.utils.translation import ugettext_lazy as _ -from django.utils.translation import ungettext_lazy - -from horizon import exceptions -from horizon import messages -from horizon import tables -from horizon.templatetags import sizeformat -from horizon.utils import filters - -from trove_dashboard import api -from trove_dashboard.content.database_backups \ - import tables as backup_tables - - -ACTIVE_STATES = ("ACTIVE",) - - -class DeleteInstance(tables.DeleteAction): - help_text = _("Deleted instances are not recoverable.") - - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Delete Instance", - u"Delete Instances", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Scheduled deletion of Instance", - u"Scheduled deletion of Instances", - count - ) - - name = "delete" - classes = ("btn-danger", ) - icon = "remove" - - def delete(self, request, obj_id): - api.trove.instance_delete(request, obj_id) - - -class RestartInstance(tables.BatchAction): - help_text = _("Restarted instances will lose any data not" - " saved in persistent storage.") - - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Restart Instance", - u"Restart Instances", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Restarted Instance", - u"Restarted Instances", - count - ) - - name = "restart" - classes = ('btn-danger', 'btn-reboot') - - def allowed(self, request, instance=None): - return ((instance.status in ACTIVE_STATES - or instance.status == 'SHUTDOWN' - or instance.status == 'RESTART_REQUIRED')) - - def action(self, request, obj_id): - api.trove.instance_restart(request, obj_id) - - -class DetachReplica(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Detach Replica", - u"Detach Replicas", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Replica Detached", - u"Replicas Detached", - count - ) - - name = "detach_replica" - classes = ('btn-danger', 'btn-detach-replica') - - def allowed(self, request, instance=None): - return (instance.status in ACTIVE_STATES - and hasattr(instance, 'replica_of')) - - def action(self, request, obj_id): - api.trove.instance_detach_replica(request, obj_id) - - -class PromoteToReplicaSource(tables.LinkAction): - name = "promote_to_replica_source" - verbose_name = _("Promote to Replica Source") - url = "horizon:project:databases:promote_to_replica_source" - classes = ("ajax-modal", "btn-promote-to-replica-source") - - def allowed(self, request, instance=None): - return (instance.status in ACTIVE_STATES - and hasattr(instance, 'replica_of')) - - def get_link_url(self, datum): - instance_id = self.table.get_object_id(datum) - return urlresolvers.reverse(self.url, args=[instance_id]) - - -class EjectReplicaSource(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Eject Replica Source", - u"Eject Replica Sources", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Ejected Replica Source", - u"Ejected Replica Sources", - count - ) - - name = "eject_replica_source" - classes = ('btn-danger', 'btn-eject-replica-source') - - def _allowed(self, request, instance=None): - return (instance.status != 'PROMOTE' - and hasattr(instance, 'replicas')) - - def action(self, request, obj_id): - api.trove.eject_replica_source(request, obj_id) - - -class GrantAccess(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Grant Access", - u"Grant Access", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Granted Access to", - u"Granted Access to", - count - ) - - name = "grant_access" - classes = ('btn-grant-access') - - def allowed(self, request, instance=None): - if instance: - return not instance.access - return False - - def action(self, request, obj_id): - api.trove.user_grant_access( - request, - self.table.kwargs['instance_id'], - self.table.kwargs['user_name'], - [obj_id], - host=self.table.kwargs['user_host']) - - -class RevokeAccess(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Revoke Access", - u"Revoke Access", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Access Revoked to", - u"Access Revoked to", - count - ) - - name = "revoke_access" - classes = ('btn-revoke-access') - - def allowed(self, request, instance=None): - if instance: - return instance.access - return False - - def action(self, request, obj_id): - api.trove.user_revoke_access( - request, - self.table.kwargs['instance_id'], - self.table.kwargs['user_name'], - obj_id, - host=self.table.kwargs['user_host']) - - -def parse_host_param(request): - host = None - if request.META.get('QUERY_STRING', ''): - param = urlparse.parse_qs(request.META.get('QUERY_STRING')) - values = param.get('host') - if values: - host = next(iter(values), None) - return host - - -class AccessTable(tables.DataTable): - dbname = tables.Column("name", verbose_name=_("Name")) - access = tables.Column( - "access", - verbose_name=_("Accessible"), - filters=(d_filters.yesno, d_filters.capfirst)) - - class Meta(object): - name = "access" - verbose_name = _("Database Access") - row_actions = (GrantAccess, RevokeAccess) - - def get_object_id(self, datum): - return datum.name - - -class ManageAccess(tables.LinkAction): - name = "manage_access" - verbose_name = _("Manage Access") - url = "horizon:project:databases:access_detail" - icon = "pencil" - - def allowed(self, request, instance=None): - instance = self.table.kwargs['instance'] - return (instance.status in ACTIVE_STATES and - has_user_add_perm(request)) - - def get_link_url(self, datum): - user = datum - return urlresolvers.reverse(self.url, args=[user.instance.id, - user.name, - user.host]) - - -class CreateUser(tables.LinkAction): - name = "create_user" - verbose_name = _("Create User") - url = "horizon:project:databases:create_user" - classes = ("ajax-modal",) - icon = "plus" - - def allowed(self, request, instance=None): - instance = self.table.kwargs['instance'] - return (instance.status in ACTIVE_STATES and - has_user_add_perm(request)) - - def get_link_url(self, datum=None): - instance_id = self.table.kwargs['instance_id'] - return urlresolvers.reverse(self.url, args=[instance_id]) - - -class EditUser(tables.LinkAction): - name = "edit_user" - verbose_name = _("Edit User") - url = "horizon:project:databases:edit_user" - classes = ("ajax-modal",) - icon = "pencil" - - def allowed(self, request, instance=None): - instance = self.table.kwargs['instance'] - return (instance.status in ACTIVE_STATES and - has_user_add_perm(request)) - - def get_link_url(self, datum): - user = datum - return urlresolvers.reverse(self.url, args=[user.instance.id, - user.name, - user.host]) - - -def has_user_add_perm(request): - perms = getattr(settings, 'TROVE_ADD_USER_PERMS', []) - if perms: - return request.user.has_perms(perms) - return True - - -class DeleteUser(tables.DeleteAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Delete User", - u"Delete Users", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Deleted User", - u"Deleted Users", - count - ) - - def delete(self, request, obj_id): - user = self.table.get_object_by_id(obj_id) - api.trove.user_delete(request, user.instance.id, user.name, - host=user.host) - - -class CreateDatabase(tables.LinkAction): - name = "create_database" - verbose_name = _("Create Database") - url = "horizon:project:databases:create_database" - classes = ("ajax-modal",) - icon = "plus" - - def allowed(self, request, database=None): - instance = self.table.kwargs['instance'] - return (instance.status in ACTIVE_STATES and - has_database_add_perm(request)) - - def get_link_url(self, datum=None): - instance_id = self.table.kwargs['instance_id'] - return urlresolvers.reverse(self.url, args=[instance_id]) - - -def has_database_add_perm(request): - perms = getattr(settings, 'TROVE_ADD_DATABASE_PERMS', []) - if perms: - return request.user.has_perms(perms) - return True - - -class DeleteDatabase(tables.DeleteAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Delete Database", - u"Delete Databases", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Deleted Database", - u"Deleted Databases", - count - ) - - def delete(self, request, obj_id): - datum = self.table.get_object_by_id(obj_id) - try: - api.trove.database_delete(request, datum.instance.id, datum.name) - except Exception: - msg = _('Error deleting database on instance.') - exceptions.handle(request, msg) - - -class LaunchLink(tables.LinkAction): - name = "launch" - verbose_name = _("Launch Instance") - url = "horizon:project:databases:launch" - classes = ("ajax-modal", "btn-launch") - icon = "cloud-upload" - - -class CreateBackup(tables.LinkAction): - name = "backup" - verbose_name = _("Create Backup") - url = "horizon:project:database_backups:create" - classes = ("ajax-modal",) - icon = "camera" - - def allowed(self, request, instance=None): - return (instance.status in ACTIVE_STATES and - request.user.has_perm('openstack.services.object-store')) - - def get_link_url(self, datam): - url = urlresolvers.reverse(self.url) - return url + "?instance=%s" % datam.id - - -class ResizeVolume(tables.LinkAction): - name = "resize_volume" - verbose_name = _("Resize Volume") - url = "horizon:project:databases:resize_volume" - classes = ("ajax-modal", "btn-resize") - - def allowed(self, request, instance=None): - return instance.status in ACTIVE_STATES - - def get_link_url(self, datum): - instance_id = self.table.get_object_id(datum) - return urlresolvers.reverse(self.url, args=[instance_id]) - - -class ResizeInstance(tables.LinkAction): - name = "resize_instance" - verbose_name = _("Resize Instance") - url = "horizon:project:databases:resize_instance" - classes = ("ajax-modal", "btn-resize") - - def allowed(self, request, instance=None): - return ((instance.status in ACTIVE_STATES - or instance.status == 'SHUTOFF')) - - def get_link_url(self, datum): - instance_id = self.table.get_object_id(datum) - return urlresolvers.reverse(self.url, args=[instance_id]) - - -class AttachConfiguration(tables.LinkAction): - name = "attach_configuration" - verbose_name = _("Attach Configuration Group") - url = "horizon:project:databases:attach_config" - classes = ("btn-attach-config", "ajax-modal") - - def allowed(self, request, instance=None): - return (instance.status in ACTIVE_STATES - and not hasattr(instance, 'configuration')) - - -class DetachConfiguration(tables.BatchAction): - @staticmethod - def action_present(count): - return ungettext_lazy( - u"Detach Configuration Group", - u"Detach Configuration Groups", - count - ) - - @staticmethod - def action_past(count): - return ungettext_lazy( - u"Detached Configuration Group", - u"Detached Configuration Groups", - count - ) - - name = "detach_configuration" - classes = ('btn-danger', 'btn-detach-config') - - def allowed(self, request, instance=None): - return (instance.status in ACTIVE_STATES and - hasattr(instance, 'configuration')) - - def action(self, request, obj_id): - api.trove.instance_detach_configuration(request, obj_id) - - -class EnableRootAction(tables.Action): - name = "enable_root_action" - verbose_name = _("Enable Root") - - def handle(self, table, request, obj_ids): - try: - username, password = api.trove.root_enable(request, obj_ids) - table.data[0].enabled = True - table.data[0].password = password - except Exception: - messages.error(request, _('There was a problem enabling root.')) - - -class DisableRootAction(tables.Action): - name = "disable_root_action" - verbose_name = _("Disable Root") - - def allowed(self, request, instance): - enabled = api.trove.root_show(request, instance.id) - return enabled.rootEnabled - - def single(self, table, request, object_id): - try: - api.trove.root_disable(request, object_id) - table.data[0].password = None - messages.success(request, _("Successfully disabled root access.")) - except Exception as e: - messages.warning(request, - _("Cannot disable root access: %s") % e.message) - - -class ManageRoot(tables.LinkAction): - name = "manage_root_action" - verbose_name = _("Manage Root Access") - url = "horizon:project:databases:manage_root" - - def allowed(self, request, instance): - return instance.status in ACTIVE_STATES - - def get_link_url(self, datum=None): - instance_id = self.table.get_object_id(datum) - return urlresolvers.reverse(self.url, args=[instance_id]) - - -class ManageRootTable(tables.DataTable): - name = tables.Column('name', verbose_name=_('Instance Name')) - enabled = tables.Column('enabled', - verbose_name=_('Has Root Ever Been Enabled'), - filters=(d_filters.yesno, d_filters.capfirst), - help_text=_("Status if root was ever enabled " - "for an instance.")) - password = tables.Column('password', verbose_name=_('Password'), - help_text=_("Password is only visible " - "immediately after the root is " - "enabled or reset.")) - - class Meta(object): - name = "manage_root" - verbose_name = _("Manage Root") - row_actions = (EnableRootAction, DisableRootAction,) - - -class UpdateRow(tables.Row): - ajax = True - - def get_data(self, request, instance_id): - instance = api.trove.instance_get(request, instance_id) - try: - flavor_id = instance.flavor['id'] - instance.full_flavor = api.trove.flavor_get(request, flavor_id) - except Exception: - pass - instance.host = get_host(instance) - return instance - - -def get_datastore(instance): - if hasattr(instance, "datastore"): - return instance.datastore["type"] - return _("Not available") - - -def get_datastore_version(instance): - if hasattr(instance, "datastore"): - return instance.datastore["version"] - return _("Not available") - - -def get_host(instance): - if hasattr(instance, "hostname"): - return instance.hostname - elif hasattr(instance, "ip") and instance.ip: - return instance.ip[0] - return _("Not Assigned") - - -def get_size(instance): - if hasattr(instance, "full_flavor"): - size_string = _("%(name)s | %(RAM)s RAM") - vals = {'name': instance.full_flavor.name, - 'RAM': sizeformat.mb_float_format(instance.full_flavor.ram)} - return size_string % vals - return _("Not available") - - -def get_volume_size(instance): - if hasattr(instance, "volume"): - return sizeformat.diskgbformat(instance.volume.get("size")) - return _("Not available") - - -def get_databases(user): - if hasattr(user, "access"): - databases = [db.name for db in user.access] - databases.sort() - return ', '.join(databases) - return _("-") - - -class InstancesTable(tables.DataTable): - STATUS_CHOICES = ( - ("ACTIVE", True), - ("BLOCKED", True), - ("BUILD", None), - ("FAILED", False), - ("REBOOT", None), - ("RESIZE", None), - ("BACKUP", None), - ("SHUTDOWN", False), - ("ERROR", False), - ("RESTART_REQUIRED", None), - ) - STATUS_DISPLAY_CHOICES = ( - ("ACTIVE", pgettext_lazy("Current status of a Database Instance", - u"Active")), - ("BLOCKED", pgettext_lazy("Current status of a Database Instance", - u"Blocked")), - ("BUILD", pgettext_lazy("Current status of a Database Instance", - u"Building")), - ("FAILED", pgettext_lazy("Current status of a Database Instance", - u"Failed")), - ("REBOOT", pgettext_lazy("Current status of a Database Instance", - u"Rebooting")), - ("RESIZE", pgettext_lazy("Current status of a Database Instance", - u"Resizing")), - ("BACKUP", pgettext_lazy("Current status of a Database Instance", - u"Backup")), - ("SHUTDOWN", pgettext_lazy("Current status of a Database Instance", - u"Shutdown")), - ("ERROR", pgettext_lazy("Current status of a Database Instance", - u"Error")), - ("RESTART_REQUIRED", - pgettext_lazy("Current status of a Database Instance", - u"Restart Required")), - ) - name = tables.Column("name", - link="horizon:project:databases:detail", - verbose_name=_("Instance Name")) - datastore = tables.Column(get_datastore, - verbose_name=_("Datastore")) - datastore_version = tables.Column(get_datastore_version, - verbose_name=_("Datastore Version")) - host = tables.Column(get_host, verbose_name=_("Host")) - size = tables.Column(get_size, - verbose_name=_("Size"), - attrs={'data-type': 'size'}) - volume = tables.Column(get_volume_size, - verbose_name=_("Volume Size"), - attrs={'data-type': 'size'}) - status = tables.Column("status", - verbose_name=_("Status"), - status=True, - status_choices=STATUS_CHOICES, - display_choices=STATUS_DISPLAY_CHOICES) - - class Meta(object): - name = "databases" - verbose_name = _("Instances") - status_columns = ["status"] - row_class = UpdateRow - table_actions = (LaunchLink, DeleteInstance) - row_actions = (CreateBackup, - ResizeVolume, - ResizeInstance, - PromoteToReplicaSource, - AttachConfiguration, - DetachConfiguration, - ManageRoot, - EjectReplicaSource, - DetachReplica, - RestartInstance, - DeleteInstance) - - -class UsersTable(tables.DataTable): - name = tables.Column("name", verbose_name=_("User Name")) - host = tables.Column("host", verbose_name=_("Allowed Host")) - databases = tables.Column(get_databases, verbose_name=_("Databases")) - - class Meta(object): - name = "users" - verbose_name = _("Users") - table_actions = [CreateUser, DeleteUser] - row_actions = [EditUser, ManageAccess, DeleteUser] - - def get_object_id(self, datum): - return datum.name - - -class DatabaseTable(tables.DataTable): - name = tables.Column("name", verbose_name=_("Database Name")) - - class Meta(object): - name = "databases" - verbose_name = _("Databases") - table_actions = [CreateDatabase, DeleteDatabase] - row_actions = [DeleteDatabase] - - def get_object_id(self, datum): - return datum.name - - -def is_incremental(obj): - return hasattr(obj, 'parent_id') and obj.parent_id is not None - - -class InstanceBackupsTable(tables.DataTable): - name = tables.Column("name", - link="horizon:project:database_backups:detail", - verbose_name=_("Name")) - created = tables.Column("created", verbose_name=_("Created"), - filters=[filters.parse_isotime]) - location = tables.Column(lambda obj: _("Download"), - link=lambda obj: obj.locationRef, - verbose_name=_("Backup File")) - incremental = tables.Column(is_incremental, - verbose_name=_("Incremental"), - filters=(d_filters.yesno, - d_filters.capfirst)) - status = tables.Column( - "status", - verbose_name=_("Status"), - status=True, - status_choices=backup_tables.STATUS_CHOICES, - display_choices=backup_tables.STATUS_DISPLAY_CHOICES) - - class Meta(object): - name = "backups" - verbose_name = _("Backups") - status_columns = ["status"] - row_class = UpdateRow - table_actions = (backup_tables.LaunchLink, backup_tables.DeleteBackup) - row_actions = (backup_tables.RestoreLink, backup_tables.DeleteBackup) - - -class ConfigDefaultsTable(tables.DataTable): - name = tables.Column('name', verbose_name=_('Property')) - value = tables.Column('value', verbose_name=_('Value')) - - class Meta(object): - name = 'config_defaults' - verbose_name = _('Configuration Defaults') - - def get_object_id(self, datum): - return datum.name diff --git a/trove_dashboard/content/databases/tabs.py b/trove_dashboard/content/databases/tabs.py deleted file mode 100644 index 7acabb7..0000000 --- a/trove_dashboard/content/databases/tabs.py +++ /dev/null @@ -1,190 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -import logging - -from django import template -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import tabs -from trove_dashboard import api -from trove_dashboard.content.database_configurations import ( - config_param_manager) -from trove_dashboard.content.databases import db_capability -from trove_dashboard.content.databases.logs import tables as log_tables -from trove_dashboard.content.databases import tables - - -LOG = logging.getLogger(__name__) - - -class OverviewTab(tabs.Tab): - name = _("Overview") - slug = "overview" - - def get_context_data(self, request): - instance = self.tab_group.kwargs['instance'] - context = {"instance": instance} - try: - root_show = api.trove.root_show(request, instance.id) - context["root_enabled"] = template.defaultfilters.yesno( - root_show.rootEnabled) - except Exception: - context["root_enabled"] = _('Unable to obtain information on ' - 'root user') - return context - - def get_template_name(self, request): - instance = self.tab_group.kwargs['instance'] - template_file = ('project/databases/_detail_overview_%s.html' % - self._get_template_type(instance.datastore['type'])) - try: - template.loader.get_template(template_file) - return template_file - except template.TemplateDoesNotExist: - # This datastore type does not have a template file - # Just use the base template file - return ('project/databases/_detail_overview.html') - - def _get_template_type(self, datastore): - if db_capability.is_mysql_compatible(datastore): - return 'mysql' - - return datastore - - -class UserTab(tabs.TableTab): - table_classes = [tables.UsersTable] - name = _("Users") - slug = "users_tab" - instance = None - template_name = "horizon/common/_detail_table.html" - preload = False - - def get_users_data(self): - instance = self.tab_group.kwargs['instance'] - try: - data = api.trove.users_list(self.request, instance.id) - for user in data: - user.instance = instance - try: - user.access = api.trove.user_list_access(self.request, - instance.id, - user.name, - host=user.host) - except exceptions.NOT_FOUND: - pass - except Exception: - msg = _('Unable to get user access data.') - exceptions.handle(self.request, msg) - except Exception: - msg = _('Unable to get user data.') - exceptions.handle(self.request, msg) - data = [] - return data - - def allowed(self, request): - return tables.has_user_add_perm(request) - - -class DatabaseTab(tabs.TableTab): - table_classes = [tables.DatabaseTable] - name = _("Databases") - slug = "database_tab" - instance = None - template_name = "horizon/common/_detail_table.html" - preload = False - - def get_databases_data(self): - instance = self.tab_group.kwargs['instance'] - try: - data = api.trove.database_list(self.request, instance.id) - add_instance = lambda d: setattr(d, 'instance', instance) - map(add_instance, data) - except Exception: - msg = _('Unable to get databases data.') - exceptions.handle(self.request, msg) - data = [] - return data - - def allowed(self, request): - return tables.has_database_add_perm(request) - - -class ConfigDefaultsTab(tabs.TableTab): - table_classes = [tables.ConfigDefaultsTable] - name = _("Defaults") - slug = "config_defaults" - instance = None - template_name = "horizon/common/_detail_table.html" - preload = False - - def get_config_defaults_data(self): - instance = self.tab_group.kwargs['instance'] - values_data = [] - data = api.trove.configuration_default(self.request, instance.id) - if data is not None: - for k, v in data.configuration.items(): - values_data.append( - config_param_manager.ConfigParam(None, k, v)) - return sorted(values_data, key=lambda config: config.name) - - -class BackupsTab(tabs.TableTab): - table_classes = [tables.InstanceBackupsTable] - name = _("Backups") - slug = "backups_tab" - instance = None - template_name = "horizon/common/_detail_table.html" - preload = False - - def get_backups_data(self): - instance = self.tab_group.kwargs['instance'] - try: - data = api.trove.instance_backups(self.request, instance.id) - except Exception: - msg = _('Unable to get database backup data.') - exceptions.handle(self.request, msg) - data = [] - return data - - def allowed(self, request): - return request.user.has_perm('openstack.services.object-store') - - -class LogsTab(tabs.TableTab): - table_classes = [log_tables.LogsTable] - name = _("Logs") - slug = "logs_tab" - template_name = "horizon/common/_detail_table.html" - preload = False - - def get_logs_data(self): - instance = self.tab_group.kwargs['instance'] - try: - logs = api.trove.log_list(self.request, instance.id) - return logs - except Exception as e: - LOG.exception( - _('Unable to retrieve list of logs.\n%s') % e.message) - logs = [] - return logs - - -class InstanceDetailTabs(tabs.TabGroup): - slug = "instance_details" - tabs = (OverviewTab, UserTab, DatabaseTab, BackupsTab, LogsTab, - ConfigDefaultsTab) - sticky = True diff --git a/trove_dashboard/content/databases/templates/databases/_attach_config.html b/trove_dashboard/content/databases/templates/databases/_attach_config.html deleted file mode 100644 index c2671e8..0000000 --- a/trove_dashboard/content/databases/templates/databases/_attach_config.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block modal-body-right %} -

{% trans "Select a configuration group to attach to the database instance." %}

-

{% trans "Please note: It may be necessary to reboot the database instance for this new configuration group to take effect." %}

-{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_create_database.html b/trove_dashboard/content/databases/templates/databases/_create_database.html deleted file mode 100644 index 4d609d4..0000000 --- a/trove_dashboard/content/databases/templates/databases/_create_database.html +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block modal-body-right %} -

{% trans "Specify the name of the new database." %}

-

{% trans "Optionally provide a character set and collation for the database." %}

-{% endblock %} - diff --git a/trove_dashboard/content/databases/templates/databases/_create_user.html b/trove_dashboard/content/databases/templates/databases/_create_user.html deleted file mode 100644 index 9fa8566..0000000 --- a/trove_dashboard/content/databases/templates/databases/_create_user.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block modal-body-right %} -

{% trans "Specify the name of the new user and password." %}

-

{% trans "Optionally provide the host of the user and a list of databases the user is granted access to." %}

-{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_detail_overview.html b/trove_dashboard/content/databases/templates/databases/_detail_overview.html deleted file mode 100644 index 8f2d764..0000000 --- a/trove_dashboard/content/databases/templates/databases/_detail_overview.html +++ /dev/null @@ -1,89 +0,0 @@ -{% load i18n sizeformat %} - -
-
-
{% trans "Name" %}
-
{{ instance.name }}
-
{% trans "ID" %}
-
{{ instance.id }}
-
{% trans "Datastore" %}
-
{{ instance.datastore.type }}
-
{% trans "Datastore Version" %}
-
{{ instance.datastore.version }}
-
{% trans "Status" %}
-
{{ instance.status|title }}
- {% if instance.configuration %} -
{% trans "Configuration Group" %}
-
- - {{ instance.configuration.id }} - -
- {% endif %} -
{% trans "Root Enabled" %}
-
{{ root_enabled|capfirst }}
- {% if instance.locality %} -
{% trans "Locality" %}
-
{{ instance.locality }}
- {% endif %} -
- - {% if instance.fault %} -

{% trans "Fault" %}

-
-
-
{% trans "Message" %}
-
{{ instance.fault.message }}
- {% if instance.fault.details %} -
{% trans "Details" %}
-
{{ instance.fault.details }}
- {% endif %} -
{% trans "Created" %}
-
{{ instance.fault.created|parse_isotime }}
-
- {% endif %} - -

{% trans "Specs" %}

-
-
-
{% trans "Flavor" %}
-
{{ instance.full_flavor.name }}
-
{% trans "RAM" %}
-
{{ instance.full_flavor.ram|mb_float_format }}
- {% if instance.volume %} -
{% trans "Volume Size" %}
-
{{ instance.volume.size|diskgbformat }}
- {% endif %} -
{% trans "Created" %}
-
{{ instance.created|parse_isotime }}
-
{% trans "Updated" %}
-
{{ instance.updated|parse_isotime }}
-
- -{% block connection_info %} -{% endblock %} - -{% if instance.replica_of or instance.replicas %} -

{% trans "Replication" %}

-
-
- {% if instance.replica_of %} -
{% trans "Is a Replica Of" %}
-
- {% url 'horizon:project:databases:detail' instance.replica_of.id as instance_url %} - {{ instance.replica_of.id }} -
- {% endif %} - - {% if instance.replicas %} -
{% trans "Replicas" %}
- {% for replica in instance.replicas %} -
- {% url 'horizon:project:databases:detail' replica.id as instance_url %} - {{ replica.id }} -
- {% endfor %} - {% endif %} -
-{% endif %} -
diff --git a/trove_dashboard/content/databases/templates/databases/_detail_overview_cassandra.html b/trove_dashboard/content/databases/templates/databases/_detail_overview_cassandra.html deleted file mode 100644 index dedf2ee..0000000 --- a/trove_dashboard/content/databases/templates/databases/_detail_overview_cassandra.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "project/databases/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% with instance.host as host %} -
{% trans "Host" %}
- {% if not host %} -
{% trans "Not Assigned" %}
- {% else %} -
{{ host }}
-
{% trans "Database Port" %}
-
9042
-
{% trans "Connection Examples" %}
-
cqlsh {{ host }} 9042
- {% endif %} - {% endwith %} -
-{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_detail_overview_couchbase.html b/trove_dashboard/content/databases/templates/databases/_detail_overview_couchbase.html deleted file mode 100644 index 2deefb4..0000000 --- a/trove_dashboard/content/databases/templates/databases/_detail_overview_couchbase.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "project/databases/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% with instance.host as host %} -
{% trans "Host" %}
- {% if not host %} -
{% trans "Not Assigned" %}
- {% else %} -
{{ host }}
-
{% trans "Connection Examples" %}
-
http://{{ host }}:8091
- {% endif %} - {% endwith %} -
-{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_detail_overview_mongodb.html b/trove_dashboard/content/databases/templates/databases/_detail_overview_mongodb.html deleted file mode 100644 index 1d4fba1..0000000 --- a/trove_dashboard/content/databases/templates/databases/_detail_overview_mongodb.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends "project/databases/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% if instance.cluster_id %} - Link to Cluster Details for Connection Information - {% else %} -
- {% with instance.host as host %} -
{% trans "Host" %}
-
- {% if not host %} - {% trans "Not Assigned" %} -
- {% else %} - {{ host }} - -
{% trans "Database Port" %}
-
27017
-
{% trans "Connection Examples" %}
-
mongo --host {{ host }}
-
mongodb://[{% trans "USERNAME" %}:{% trans "PASSWORD" %}@]{{ host }}:27017/{% trans "DATABASE" %}
- {% endif %} - {% endwith %} -
- {% endif %} -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_detail_overview_mysql.html b/trove_dashboard/content/databases/templates/databases/_detail_overview_mysql.html deleted file mode 100644 index 01de289..0000000 --- a/trove_dashboard/content/databases/templates/databases/_detail_overview_mysql.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "project/databases/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% with instance.host as host %} -
{% trans "Host" %}
- {% if not host %} -
{% trans "Not Assigned" %}
- {% else %} -
{{ host }}
-
{% trans "Database Port" %}
-
3306
-
{% trans "Connection Examples" %}
-
mysql -h {{ host }} -u {% trans "USERNAME" %} -p
-
mysql://{% trans "USERNAME" %}:{% trans "PASSWORD" %}@{{ host }}:3306/{% trans "DATABASE"%}
- {% endif %} - {% endwith %} -
-{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_detail_overview_postgresql.html b/trove_dashboard/content/databases/templates/databases/_detail_overview_postgresql.html deleted file mode 100644 index 954c926..0000000 --- a/trove_dashboard/content/databases/templates/databases/_detail_overview_postgresql.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "project/databases/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% with instance.host as host %} -
{% trans "Host" %}
- {% if not host %} -
{% trans "Not Assigned" %}
- {% else %} -
{{ host }}
-
{% trans "Database Port" %}
-
5432
-
{% trans "Connection Examples" %}
-
psql -h {{ host }} -p 5432 -U {% trans "USERNAME" %}
-
postgresql://{% trans "USERNAME" %}:{% trans "PASSWORD" %}@{{ host }}:5432/{% trans "DATABASE"%}
- {% endif %} - {% endwith %} -
-{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_detail_overview_redis.html b/trove_dashboard/content/databases/templates/databases/_detail_overview_redis.html deleted file mode 100644 index f53528a..0000000 --- a/trove_dashboard/content/databases/templates/databases/_detail_overview_redis.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends "project/databases/_detail_overview.html" %} -{% load i18n sizeformat %} - -{% block connection_info %} -

{% trans "Connection Information" %}

-
-
- {% with instance.host as host %} -
{% trans "Host" %}
- {% if not host %} -
{% trans "Not Assigned" %}
- {% else %} -
{{ host }}
-
{% trans "Connection Examples" %}
-
redis-cli -c -h {{ host }}
- {% endif %} - {% endwith %} -
-{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_edit_user.html b/trove_dashboard/content/databases/templates/databases/_edit_user.html deleted file mode 100644 index d8346ec..0000000 --- a/trove_dashboard/content/databases/templates/databases/_edit_user.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block modal-body-right %} -

{% trans "Specify a new name, new password or new host name for the user." %}

-

{% trans "At least one of the new fields must be changed." %}

-{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_launch_advanced_help.html b/trove_dashboard/content/databases/templates/databases/_launch_advanced_help.html deleted file mode 100644 index 46915d2..0000000 --- a/trove_dashboard/content/databases/templates/databases/_launch_advanced_help.html +++ /dev/null @@ -1,3 +0,0 @@ -{% load i18n %} - -

{% blocktrans trimmed %}Optionally choose to create this database using a previous backup, or as a replica of another database instance.{% endblocktrans %}

diff --git a/trove_dashboard/content/databases/templates/databases/_launch_details_help.html b/trove_dashboard/content/databases/templates/databases/_launch_details_help.html deleted file mode 100644 index 37aeb33..0000000 --- a/trove_dashboard/content/databases/templates/databases/_launch_details_help.html +++ /dev/null @@ -1,4 +0,0 @@ -{% load i18n %} - -

{% blocktrans trimmed %}Specify the details for launching an instance.{% endblocktrans %}

-

{% blocktrans trimmed %}Please note: The value specified in the Volume Size field should be greater than 0, however, some configurations do not support specifying volume size. If specifying the volume size results in an error stating volume support is not enabled, enter 0.{% endblocktrans %}

diff --git a/trove_dashboard/content/databases/templates/databases/_launch_initialize_help.html b/trove_dashboard/content/databases/templates/databases/_launch_initialize_help.html deleted file mode 100644 index 408b62c..0000000 --- a/trove_dashboard/content/databases/templates/databases/_launch_initialize_help.html +++ /dev/null @@ -1,18 +0,0 @@ -{% load i18n %} - -

{% trans "Initial Databases" %}

-

{% trans "Optionally provide a comma separated list of databases to create:" %}

-
database1, database2, database3
- -

{% trans "Initial Admin User" %}

-

{% blocktrans trimmed %}Create an optional initial user. - This user will have access to all databases you create.{% endblocktrans %}

- -
    -
  • {% trans "Username (required)" %}
  • -
  • {% trans "Password (required)" %}
  • -
  • {% trans "Allowed Host (optional)" %} - {% blocktrans trimmed %}Allow the user to connect from this host - only. If not provided this user will be allowed to connect from anywhere. - {% endblocktrans %}
  • -
diff --git a/trove_dashboard/content/databases/templates/databases/_launch_network_help.html b/trove_dashboard/content/databases/templates/databases/_launch_network_help.html deleted file mode 100644 index 18a9aac..0000000 --- a/trove_dashboard/content/databases/templates/databases/_launch_network_help.html +++ /dev/null @@ -1,9 +0,0 @@ -{% load i18n %} - -

- {% blocktrans trimmed %} - Move networks from 'Available Networks' to 'Selected Networks' by - clicking the button, or dragging and dropping. You can change the - NIC order by dragging and dropping as well. - {% endblocktrans %} -

diff --git a/trove_dashboard/content/databases/templates/databases/_launch_networks.html b/trove_dashboard/content/databases/templates/databases/_launch_networks.html deleted file mode 100644 index 28f8109..0000000 --- a/trove_dashboard/content/databases/templates/databases/_launch_networks.html +++ /dev/null @@ -1,36 +0,0 @@ -{% load i18n %} - - -
-
- -
    - -
      -
      -
      - {% include "project/databases/_launch_network_help.html" %} -
      -
      - -
      -
      -
      - {% include "horizon/common/_form_fields.html" %} -
      -
      -
      - {{ step.get_help_text }} -
      -
      - - - diff --git a/trove_dashboard/content/databases/templates/databases/_promote_to_replica_source.html b/trove_dashboard/content/databases/templates/databases/_promote_to_replica_source.html deleted file mode 100644 index 5905404..0000000 --- a/trove_dashboard/content/databases/templates/databases/_promote_to_replica_source.html +++ /dev/null @@ -1,34 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block modal-body %} -
      -

      {% trans 'Confirm the current replica is to be promoted as the new replica source.' %}

      -

      {% trans 'This action cannot be undone.' %}

      -
      - {% include "horizon/common/_form_fields.html" %} -
      -
      -
      -
      -
      -

      {% trans "Current Replica" %}

      - - - - -
      {% trans 'Name' %}{{ replica.name|default:_("None") }}
      {% trans 'Host' %}{{ replica.ip|default:_("Unknown") }}
      {% trans 'Status' %}{{ replica.status|default:_("Unknown") }}
      -
      -
      -
      -
      -

      {% trans "Current Replica Source" %}

      - - - - -
      {% trans 'Name' %}{{ replica_source.name|default:_("None") }}
      {% trans 'Host' %}{{ replica_source.ip|default:_("Unknown") }}
      {% trans 'Status' %}{{ replica_source.status|default:_("Unknown") }}
      -
      -
      -
      -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_resize_instance.html b/trove_dashboard/content/databases/templates/databases/_resize_instance.html deleted file mode 100644 index 5cbf264..0000000 --- a/trove_dashboard/content/databases/templates/databases/_resize_instance.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block modal-body-right %} -

      {% trans "Specify a new flavor for the database instance." %}

      -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/_resize_volume.html b/trove_dashboard/content/databases/templates/databases/_resize_volume.html deleted file mode 100644 index 86dae43..0000000 --- a/trove_dashboard/content/databases/templates/databases/_resize_volume.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} - -{% block modal-body-right %} -

      {% trans "Specify the new volume size for the database instance." %}

      -

      {% trans "Please note: The new value must be greater than the existing volume size." %}

      -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/access_detail.html b/trove_dashboard/content/databases/templates/databases/access_detail.html deleted file mode 100644 index 43e3475..0000000 --- a/trove_dashboard/content/databases/templates/databases/access_detail.html +++ /dev/null @@ -1,10 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} - -{% block main %} -
      -
      - {{ table.render }} -
      -
      -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/attach_config.html b/trove_dashboard/content/databases/templates/databases/attach_config.html deleted file mode 100644 index c98416a..0000000 --- a/trove_dashboard/content/databases/templates/databases/attach_config.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} - -{% block main %} - {% include "project/databases/_attach_config.html" %} -{% endblock %} \ No newline at end of file diff --git a/trove_dashboard/content/databases/templates/databases/create_database.html b/trove_dashboard/content/databases/templates/databases/create_database.html deleted file mode 100644 index eda34c6..0000000 --- a/trove_dashboard/content/databases/templates/databases/create_database.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends 'base.html' %} - -{% block main %} - {% include "project/databases/_create_database.html" %} -{% endblock %} - diff --git a/trove_dashboard/content/databases/templates/databases/create_user.html b/trove_dashboard/content/databases/templates/databases/create_user.html deleted file mode 100644 index b251136..0000000 --- a/trove_dashboard/content/databases/templates/databases/create_user.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends 'base.html' %} - -{% block main %} - {% include "project/databases/_create_user.html" %} -{% endblock %} \ No newline at end of file diff --git a/trove_dashboard/content/databases/templates/databases/edit_user.html b/trove_dashboard/content/databases/templates/databases/edit_user.html deleted file mode 100644 index 2b9394b..0000000 --- a/trove_dashboard/content/databases/templates/databases/edit_user.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends 'base.html' %} - -{% block main %} - {% include "project/databases/_edit_user.html" %} -{% endblock %} \ No newline at end of file diff --git a/trove_dashboard/content/databases/templates/databases/index.html b/trove_dashboard/content/databases/templates/databases/index.html deleted file mode 100644 index bec1e9b..0000000 --- a/trove_dashboard/content/databases/templates/databases/index.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{% trans "Instances" %}{% endblock %} - -{% block main %} - {{ table.render }} -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/launch.html b/trove_dashboard/content/databases/templates/databases/launch.html deleted file mode 100644 index 07c3aec..0000000 --- a/trove_dashboard/content/databases/templates/databases/launch.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{% trans "Launch Instance" %}{% endblock %} - -{% block main %} - {% include 'horizon/common/_workflow.html' %} -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/logs/_detail_log.html b/trove_dashboard/content/databases/templates/databases/logs/_detail_log.html deleted file mode 100644 index 99e2c0e..0000000 --- a/trove_dashboard/content/databases/templates/databases/logs/_detail_log.html +++ /dev/null @@ -1,21 +0,0 @@ -{% load i18n %} - -
      -
      -
      - - - - - - {% trans "Return to Log List" %} - {% trans "Download" %} - {% trans "View Full Log" %} -
      -
      -
      - -
      -    {{ log_contents }}
      -  
      -
      diff --git a/trove_dashboard/content/databases/templates/databases/logs/_log_contents.html b/trove_dashboard/content/databases/templates/databases/logs/_log_contents.html deleted file mode 100644 index 9083adc..0000000 --- a/trove_dashboard/content/databases/templates/databases/logs/_log_contents.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "horizon/common/_modal.html" %} -{% load i18n %} - -{% block modal-header %}{% trans "Log Contents" %}{% endblock %} - -{% block modal-body %} -
      -  {{ log.data }}
      -
      -{% endblock %} - -{% block modal-footer %} - {% trans "Close" %} -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/logs/log_contents.html b/trove_dashboard/content/databases/templates/databases/logs/log_contents.html deleted file mode 100644 index 91d8f74..0000000 --- a/trove_dashboard/content/databases/templates/databases/logs/log_contents.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{% trans "Log Contents" %}{% endblock %} - -{% block main %} -
      -
      - {% include "project/databases/logs/_log_contents.html" %} -
      -
      -{% endblock %} \ No newline at end of file diff --git a/trove_dashboard/content/databases/templates/databases/logs/view_log.html b/trove_dashboard/content/databases/templates/databases/logs/view_log.html deleted file mode 100644 index 9036c57..0000000 --- a/trove_dashboard/content/databases/templates/databases/logs/view_log.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{% trans "Log" %}{% endblock %} - -{% block page_header %} - {% include "horizon/common/_page_header.html" with title=_("Log: ")|add:filename %} -{% endblock page_header %} - -{% block main %} - {% include "project/databases/logs/_detail_log.html" %} -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/manage_root.html b/trove_dashboard/content/databases/templates/databases/manage_root.html deleted file mode 100644 index 41c1611..0000000 --- a/trove_dashboard/content/databases/templates/databases/manage_root.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} - -{% block main %} -
      -
      - {% trans "Note: Enable root access on an instance. If the root user is already enabled then a new password is generated." %} -
      -
      -
      - {{ table.render }} -
      -
      -{% endblock %} \ No newline at end of file diff --git a/trove_dashboard/content/databases/templates/databases/promote_to_replica_source.html b/trove_dashboard/content/databases/templates/databases/promote_to_replica_source.html deleted file mode 100644 index 3ccb411..0000000 --- a/trove_dashboard/content/databases/templates/databases/promote_to_replica_source.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} - -{% block main %} - {% include "project/databases/_promote_to_replica_source.html" %} -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/resize_instance.html b/trove_dashboard/content/databases/templates/databases/resize_instance.html deleted file mode 100644 index 49a3825..0000000 --- a/trove_dashboard/content/databases/templates/databases/resize_instance.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} - -{% block main %} - {% include "project/databases/_resize_instance.html" %} -{% endblock %} diff --git a/trove_dashboard/content/databases/templates/databases/resize_volume.html b/trove_dashboard/content/databases/templates/databases/resize_volume.html deleted file mode 100644 index 432ba5c..0000000 --- a/trove_dashboard/content/databases/templates/databases/resize_volume.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "base.html" %} - -{% block main %} - {% include "project/databases/_resize_volume.html" %} -{% endblock %} diff --git a/trove_dashboard/content/databases/tests.py b/trove_dashboard/content/databases/tests.py deleted file mode 100644 index cdde3a5..0000000 --- a/trove_dashboard/content/databases/tests.py +++ /dev/null @@ -1,1372 +0,0 @@ -# Copyright 2013 Mirantis Inc. -# Copyright 2013 Rackspace Hosting. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 binascii -import logging - -import django -from django.core.urlresolvers import reverse -from django import http -import unittest - -from mox3.mox import IsA # noqa -import six - -from horizon import exceptions -from openstack_auth import policy -from openstack_dashboard import api as dash_api -from troveclient import common - -from trove_dashboard import api -from trove_dashboard.content.databases import forms -from trove_dashboard.content.databases import tables -from trove_dashboard.content.databases import views -from trove_dashboard.content.databases.workflows import create_instance -from trove_dashboard.test import helpers as test - -INDEX_URL = reverse('horizon:project:databases:index') -LAUNCH_URL = reverse('horizon:project:databases:launch') -DETAILS_URL = reverse('horizon:project:databases:detail', args=['id']) - - -class DatabaseTests(test.TestCase): - @test.create_stubs( - {api.trove: ('instance_list', 'flavor_list')}) - def test_index(self): - # Mock database instances - databases = common.Paginated(self.databases.list()) - api.trove.instance_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(databases) - # Mock flavors - api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndReturn(self.flavors.list()) - - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed(res, 'project/databases/index.html') - # Check the Host column displaying ip or hostname - self.assertContains(res, '10.0.0.3') - self.assertContains(res, 'trove.instance-2.com') - - @test.create_stubs( - {api.trove: ('instance_list', 'flavor_list')}) - def test_index_flavor_exception(self): - # Mock database instances - databases = common.Paginated(self.databases.list()) - api.trove.instance_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(databases) - # Mock flavors - api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed(res, 'project/databases/index.html') - self.assertMessageCount(res, error=1) - - @test.create_stubs( - {api.trove: ('instance_list',)}) - def test_index_list_exception(self): - # Mock database instances - api.trove.instance_list(IsA(http.HttpRequest), marker=None)\ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed(res, 'project/databases/index.html') - self.assertMessageCount(res, error=1) - - @test.create_stubs( - {api.trove: ('instance_list', 'flavor_list')}) - def test_index_pagination(self): - # Mock database instances - databases = self.databases.list() - last_record = databases[-1] - databases = common.Paginated(databases, next_marker="foo") - api.trove.instance_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(databases) - # Mock flavors - api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndReturn(self.flavors.list()) - - self.mox.ReplayAll() - res = self.client.get(INDEX_URL) - self.assertTemplateUsed(res, 'project/databases/index.html') - self.assertContains( - res, 'marker=' + last_record.id) - - @test.create_stubs( - {api.trove: ('instance_list', 'flavor_list')}) - def test_index_flavor_list_exception(self): - # Mocking instances. - databases = common.Paginated(self.databases.list()) - api.trove.instance_list( - IsA(http.HttpRequest), - marker=None, - ).AndReturn(databases) - # Mocking flavor list with raising an exception. - api.trove.flavor_list( - IsA(http.HttpRequest), - ).AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - res = self.client.get(INDEX_URL) - - self.assertTemplateUsed(res, 'project/databases/index.html') - self.assertMessageCount(res, error=1) - - @test.create_stubs({ - api.trove: ('backup_list', 'configuration_list', 'datastore_flavors', - 'datastore_list', 'datastore_version_list', 'flavor_list', - 'instance_list'), - dash_api.cinder: ('volume_type_list',), - dash_api.neutron: ('network_list',), - dash_api.nova: ('availability_zone_list',), - policy: ('check',), - }) - def test_launch_instance(self): - policy.check((), IsA(http.HttpRequest)).MultipleTimes().AndReturn(True) - api.trove.datastore_flavors(IsA(http.HttpRequest), - IsA(six.string_types), - IsA(six.string_types)).\ - MultipleTimes().AndReturn(self.flavors.list()) - api.trove.backup_list(IsA(http.HttpRequest)).AndReturn( - self.database_backups.list()) - api.trove.configuration_list(IsA(http.HttpRequest)).AndReturn([]) - api.trove.instance_list(IsA(http.HttpRequest)).AndReturn( - self.databases.list()) - # Mock datastores - api.trove.datastore_list(IsA(http.HttpRequest)).AndReturn( - self.datastores.list()) - # Mock datastore versions - api.trove.datastore_version_list(IsA(http.HttpRequest), IsA(str)).\ - MultipleTimes().AndReturn(self.datastore_versions.list()) - - dash_api.cinder.volume_type_list(IsA(http.HttpRequest)).AndReturn([]) - - dash_api.neutron.network_list(IsA(http.HttpRequest), - tenant_id=self.tenant.id, - shared=False).AndReturn( - self.networks.list()[:1]) - - dash_api.neutron.network_list(IsA(http.HttpRequest), - shared=True).AndReturn( - self.networks.list()[1:]) - - dash_api.nova.availability_zone_list(IsA(http.HttpRequest)) \ - .AndReturn(self.availability_zones.list()) - - self.mox.ReplayAll() - res = self.client.get(LAUNCH_URL) - self.assertTemplateUsed(res, 'project/databases/launch.html') - - # django 1.7 and later does not handle the thrown Http302 - # exception well enough. - # TODO(mrunge): re-check when django-1.8 is stable - @unittest.skipIf(django.VERSION >= (1, 7, 0), - 'Currently skipped with Django >= 1.7') - @test.create_stubs({api.trove: ('flavor_list',)}) - def test_launch_instance_exception_on_flavors(self): - trove_exception = self.exceptions.nova - api.trove.flavor_list(IsA(http.HttpRequest)).AndRaise(trove_exception) - self.mox.ReplayAll() - - toSuppress = ["trove_dashboard.content.databases." - "workflows.create_instance", - "horizon.workflows.base"] - - # Suppress expected log messages in the test output - loggers = [] - for cls in toSuppress: - logger = logging.getLogger(cls) - loggers.append((logger, logger.getEffectiveLevel())) - logger.setLevel(logging.CRITICAL) - - try: - with self.assertRaises(exceptions.Http302): - self.client.get(LAUNCH_URL) - - finally: - # Restore the previous log levels - for (log, level) in loggers: - log.setLevel(level) - - @test.create_stubs({ - api.trove: ('backup_list', 'configuration_list', 'datastore_flavors', - 'datastore_list', 'datastore_version_list', 'flavor_list', - 'instance_create', 'instance_list'), - dash_api.cinder: ('volume_type_list',), - dash_api.neutron: ('network_list',), - dash_api.nova: ('availability_zone_list',), - policy: ('check',), - }) - def test_create_simple_instance(self): - policy.check((), IsA(http.HttpRequest)).MultipleTimes().AndReturn(True) - api.trove.datastore_flavors(IsA(http.HttpRequest), - IsA(six.string_types), - IsA(six.string_types)).\ - MultipleTimes().AndReturn(self.flavors.list()) - - api.trove.backup_list(IsA(http.HttpRequest)).AndReturn( - self.database_backups.list()) - - api.trove.instance_list(IsA(http.HttpRequest)).AndReturn( - self.databases.list()) - - # Mock datastores - api.trove.datastore_list(IsA(http.HttpRequest))\ - .AndReturn(self.datastores.list()) - - # Mock datastore versions - api.trove.datastore_version_list(IsA(http.HttpRequest), IsA(str))\ - .MultipleTimes().AndReturn(self.datastore_versions.list()) - - dash_api.cinder.volume_type_list(IsA(http.HttpRequest)).AndReturn([]) - - dash_api.neutron.network_list(IsA(http.HttpRequest), - tenant_id=self.tenant.id, - shared=False).AndReturn( - self.networks.list()[:1]) - - dash_api.neutron.network_list(IsA(http.HttpRequest), - shared=True).AndReturn( - self.networks.list()[1:]) - - nics = [{"net-id": self.networks.first().id, "v4-fixed-ip": ''}] - - datastore = 'mysql' - datastore_version = '5.5' - field_name = self._build_flavor_widget_name(datastore, - datastore_version) - dash_api.nova.availability_zone_list(IsA(http.HttpRequest)) \ - .AndReturn(self.availability_zones.list()) - - # Actual create database call - api.trove.instance_create( - IsA(http.HttpRequest), - IsA(six.text_type), - IsA(int), - IsA(six.text_type), - databases=None, - datastore=datastore, - datastore_version=datastore_version, - restore_point=None, - replica_of=None, - configuration=None, - users=None, - nics=nics, - replica_count=None, - volume_type=None, - locality=None, - availability_zone=IsA(six.text_type) - ).AndReturn(self.databases.first()) - - self.mox.ReplayAll() - post = { - 'name': "MyDB", - 'volume': '1', - 'flavor': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - 'datastore': field_name, - field_name: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - 'network': self.networks.first().id, - 'volume_type': 'no_type' - } - - res = self.client.post(LAUNCH_URL, post) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('backup_list', 'configuration_list', 'datastore_flavors', - 'datastore_list', 'datastore_version_list', 'flavor_list', - 'instance_create', 'instance_list'), - dash_api.cinder: ('volume_type_list',), - dash_api.neutron: ('network_list',), - dash_api.nova: ('availability_zone_list',), - policy: ('check',), - }) - def test_create_simple_instance_exception(self): - policy.check((), IsA(http.HttpRequest)).MultipleTimes().AndReturn(True) - trove_exception = self.exceptions.nova - api.trove.datastore_flavors(IsA(http.HttpRequest), - IsA(six.string_types), - IsA(six.string_types)).\ - MultipleTimes().AndReturn(self.flavors.list()) - - api.trove.backup_list(IsA(http.HttpRequest)).AndReturn( - self.database_backups.list()) - - api.trove.instance_list(IsA(http.HttpRequest)).AndReturn( - self.databases.list()) - - # Mock datastores - api.trove.datastore_list(IsA(http.HttpRequest))\ - .AndReturn(self.datastores.list()) - - # Mock datastore versions - api.trove.datastore_version_list(IsA(http.HttpRequest), IsA(str))\ - .MultipleTimes().AndReturn(self.datastore_versions.list()) - - dash_api.cinder.volume_type_list(IsA(http.HttpRequest)).AndReturn([]) - - dash_api.neutron.network_list(IsA(http.HttpRequest), - tenant_id=self.tenant.id, - shared=False).AndReturn( - self.networks.list()[:1]) - - dash_api.neutron.network_list(IsA(http.HttpRequest), - shared=True).AndReturn( - self.networks.list()[1:]) - - nics = [{"net-id": self.networks.first().id, "v4-fixed-ip": ''}] - - datastore = 'mysql' - datastore_version = '5.5' - field_name = self._build_flavor_widget_name(datastore, - datastore_version) - dash_api.nova.availability_zone_list(IsA(http.HttpRequest)) \ - .AndReturn(self.availability_zones.list()) - - # Actual create database call - api.trove.instance_create( - IsA(http.HttpRequest), - IsA(six.text_type), - IsA(int), - IsA(six.text_type), - databases=None, - datastore=datastore, - datastore_version=datastore_version, - restore_point=None, - replica_of=None, - configuration=None, - users=None, - nics=nics, - replica_count=None, - volume_type=None, - locality=None, - availability_zone=IsA(six.text_type) - ).AndRaise(trove_exception) - - self.mox.ReplayAll() - post = { - 'name': "MyDB", - 'volume': '1', - 'flavor': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - 'datastore': field_name, - field_name: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - 'network': self.networks.first().id, - 'volume_type': 'no_type' - } - - res = self.client.post(LAUNCH_URL, post) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('instance_get', 'flavor_get', 'root_show') - }) - def _test_details(self, database, test_text, assert_contains=True): - api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type))\ - .AndReturn(database) - api.trove.flavor_get(IsA(http.HttpRequest), IsA(str))\ - .AndReturn(self.flavors.first()) - api.trove.root_show(IsA(http.HttpRequest), IsA(str)) \ - .AndReturn(self.database_user_roots.first()) - - self.mox.ReplayAll() - - # Suppress expected log messages in the test output - loggers = [] - toSuppress = ["trove_dashboard.content.databases.tabs", - "horizon.tables"] - for cls in toSuppress: - logger = logging.getLogger(cls) - loggers.append((logger, logger.getEffectiveLevel())) - logger.setLevel(logging.CRITICAL) - try: - res = self.client.get(DETAILS_URL) - self.assertTemplateUsed(res, 'project/databases/' - '_detail_overview.html') - if assert_contains: - self.assertContains(res, test_text) - else: - self.assertNotContains(res, test_text) - finally: - # Restore the previous log levels - for (log, level) in loggers: - log.setLevel(level) - - def test_details_with_ip(self): - database = self.databases.first() - self._test_details(database, database.ip[0]) - - def test_details_with_hostname(self): - database = self.databases.list()[1] - self._test_details(database, database.hostname) - - def test_details_without_locality(self): - database = self.databases.list()[1] - self._test_details(database, "Locality", assert_contains=False) - - def test_details_with_locality(self): - database = self.databases.first() - self._test_details(database, "Locality") - - def test_create_database(self): - database = self.databases.first() - - url = reverse('horizon:project:databases:create_database', - args=[database.id]) - res = self.client.get(url) - self.assertTemplateUsed(res, 'project/databases/create_database.html') - - @test.create_stubs({api.trove: ('database_create',)}) - def test_create_new_database(self): - new_database = { - "status": "ACTIVE", - "updated": "2013-08-12T22:00:09", - "name": "NewDB", - "links": [], - "created": "2013-08-12T22:00:03", - "ip": [ - "10.0.0.3", - ], - "volume": { - "used": 0.13, - "size": 1, - }, - "flavor": { - "id": "1", - "links": [], - }, - "datastore": { - "type": "mysql", - "version": "5.5" - }, - "id": "12345678-73db-4e23-b52e-368937d72719", - } - - api.trove.database_create( - IsA(http.HttpRequest), u'id', u'NewDB', character_set=u'', - collation=u'').AndReturn(new_database) - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:create_database', - args=['id']) - post = { - 'method': 'CreateDatabaseForm', - 'instance_id': 'id', - 'name': 'NewDB'} - - res = self.client.post(url, post) - self.assertNoFormErrors(res) - self.assertMessageCount(success=1) - - @test.create_stubs({api.trove: ('database_create',)}) - def test_create_new_database_exception(self): - api.trove.database_create( - IsA(http.HttpRequest), u'id', u'NewDB', character_set=u'', - collation=u'').AndRaise(self.exceptions.trove) - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:create_database', - args=['id']) - post = { - 'method': 'CreateDatabaseForm', - 'instance_id': 'id', - 'name': 'NewDB'} - - res = self.client.post(url, post) - self.assertEqual(res.status_code, 302) - - @test.create_stubs({api.trove: ('instance_get', 'root_show')}) - def test_show_root(self): - database = self.databases.first() - database.id = u'id' - user = self.database_user_roots.first() - - api.trove.instance_get(IsA(http.HttpRequest), IsA(unicode))\ - .AndReturn(database) - - api.trove.root_show(IsA(http.HttpRequest), database.id) \ - .MultipleTimes().AndReturn(user) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:manage_root', - args=['id']) - res = self.client.get(url) - self.assertTemplateUsed( - res, 'project/databases/manage_root.html') - - @test.create_stubs({api.trove: ('instance_get', 'root_show')}) - def test_show_root_exception(self): - database = self.databases.first() - - api.trove.instance_get(IsA(http.HttpRequest), IsA(unicode))\ - .AndReturn(database) - - api.trove.root_show(IsA(http.HttpRequest), u'id') \ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:manage_root', - args=['id']) - res = self.client.get(url) - self.assertRedirectsNoFollow(res, DETAILS_URL) - - @test.create_stubs({api.trove: ('root_enable',)}) - def test_enable_root(self): - api.trove.root_enable(IsA(http.HttpRequest), [u'id']) \ - .AndReturn(("root", "password")) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:manage_root', - args=['id']) - form_data = {"action": "manage_root__enable_root_action__%s" % 'id'} - req = self.factory.post(url, form_data) - - kwargs = {'instance_id': 'id'} - - enable_root_info_list = [] - enable_root_info = views.EnableRootInfo('id', 'inst1', False, '') - enable_root_info_list.append(enable_root_info) - - table = tables.ManageRootTable(req, enable_root_info_list, **kwargs) - table.maybe_handle() - - self.assertEqual(table.data[0].enabled, True) - self.assertEqual(table.data[0].password, "password") - - @test.create_stubs({api.trove: ('root_enable',)}) - def test_enable_root_exception(self): - api.trove.root_enable(IsA(http.HttpRequest), [u'id']) \ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:manage_root', - args=['id']) - form_data = {"action": "manage_root__enable_root_action__%s" % 'id'} - req = self.factory.post(url, form_data) - - kwargs = {'instance_id': 'id'} - - enable_root_info_list = [] - enable_root_info = views.EnableRootInfo('id', 'inst1', False, '') - enable_root_info_list.append(enable_root_info) - - table = tables.ManageRootTable(req, enable_root_info_list, **kwargs) - table.maybe_handle() - - self.assertNotEqual(table.data[0].enabled, True) - self.assertNotEqual(table.data[0].password, "password") - - @test.create_stubs({api.trove: ('root_disable',)}) - def test_disable_root(self): - api.trove.root_disable(IsA(http.HttpRequest), u'id') - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:manage_root', - args=['id']) - form_data = {"action": "manage_root__disable_root_action__%s" % 'id'} - req = self.factory.post(url, form_data) - - kwargs = {'instance_id': 'id'} - - enable_root_info_list = [] - enable_root_info = views.EnableRootInfo( - 'id', 'inst1', True, 'password') - enable_root_info_list.append(enable_root_info) - - table = tables.ManageRootTable(req, enable_root_info_list, **kwargs) - table.maybe_handle() - - self.assertEqual(table.data[0].enabled, True) - self.assertEqual(table.data[0].password, None) - - @test.create_stubs({api.trove: ('root_disable',)}) - def test_disable_root_exception(self): - api.trove.root_disable(IsA(http.HttpRequest), u'id') \ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:manage_root', - args=['id']) - form_data = {"action": "manage_root__disable_root_action__%s" % 'id'} - req = self.factory.post(url, form_data) - - kwargs = {'instance_id': 'id'} - - enable_root_info_list = [] - enable_root_info = views.EnableRootInfo( - 'id', 'inst1', True, 'password') - enable_root_info_list.append(enable_root_info) - - table = tables.ManageRootTable(req, enable_root_info_list, **kwargs) - table.maybe_handle() - - self.assertEqual(table.data[0].enabled, True) - self.assertEqual(table.data[0].password, "password") - - @test.create_stubs({ - api.trove: ('instance_get', 'flavor_get', 'user_delete', 'users_list', - 'user_list_access') - }) - def test_user_delete(self): - database = self.databases.first() - user = self.database_users.first() - user_db = self.database_user_dbs.first() - - database_id = database.id - # Instead of using the user's ID, the api uses the user's name. BOOO! - user_id = user.name - - # views.py: DetailView.get_data - api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type))\ - .AndReturn(database) - api.trove.flavor_get(IsA(http.HttpRequest), IsA(str))\ - .AndReturn(self.flavors.first()) - - # tabs.py: UserTab.get_user_data - api.trove.users_list(IsA(http.HttpRequest), - IsA(str)).AndReturn([user]) - api.trove.user_list_access(IsA(http.HttpRequest), - IsA(str), - IsA(str), - host=IsA(str)).AndReturn([user_db]) - - # tables.py: DeleteUser.delete - api.trove.user_delete(IsA(http.HttpRequest), - IsA(six.text_type), - IsA(six.text_type)).AndReturn(None) - - self.mox.ReplayAll() - - details_url = reverse('horizon:project:databases:detail', - args=[database_id]) - url = details_url + '?tab=instance_details__users_tab' - action_string = u"users__delete__%s" % user_id - form_data = {'action': action_string} - res = self.client.post(url, form_data) - self.assertRedirectsNoFollow(res, url) - - def test_create_user(self): - user = self.users.first() - - url = reverse('horizon:project:databases:create_user', - args=[user.id]) - res = self.client.get(url) - self.assertTemplateUsed(res, 'project/databases/create_user.html') - - @test.create_stubs({api.trove: ('user_create',)}) - def test_create_new_user(self): - database = self.databases.first() - user = self.users.first() - - new_user = { - "name": "Test_User2", - "host": "%", - "databases": ["TestDB"], - } - - api.trove.user_create( - IsA(http.HttpRequest), database.id, user.name, u'password', - host=u'', databases=[]).AndReturn(new_user) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:create_user', - args=[database.id]) - post = { - 'method': 'CreateUserForm', - 'instance_id': database.id, - 'name': user.name, - 'password': 'password'} - - res = self.client.post(url, post) - self.assertNoFormErrors(res) - self.assertMessageCount(success=1) - - @test.create_stubs({api.trove: ('user_create',)}) - def test_create_new_user_exception(self): - api.trove.user_create( - IsA(http.HttpRequest), u'id', u'name', u'password', - host=u'', databases=[]).AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:create_user', - args=['id']) - post = { - 'method': 'CreateUserForm', - 'instance_id': 'id', - 'name': 'name', - 'password': 'password'} - - res = self.client.post(url, post) - self.assertEqual(res.status_code, 302) - - @test.create_stubs({api.trove: ('user_update_attributes',)}) - def test_edit_user(self): - database = self.databases.first() - user = self.users.first() - - api.trove.user_update_attributes( - IsA(http.HttpRequest), IsA(six.text_type), IsA(six.text_type), - host=IsA(six.text_type), new_name=IsA(six.text_type), - new_password=IsA(six.text_type), new_host=IsA(six.text_type)) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:edit_user', - args=[database.id, user.name, '%']) - post = { - 'method': 'EditUserForm', - 'instance_id': database.id, - 'user_name': user.name, - 'user_host': '%', - 'new_name': 'new_name', - 'new_password': 'new_password', - 'new_host': '127.0.0.1'} - - res = self.client.post(url, post) - self.assertNoFormErrors(res) - self.assertMessageCount(success=1) - - @test.create_stubs({api.trove: ('user_update_attributes',)}) - def test_edit_user_exception(self): - database = self.databases.first() - user = self.users.first() - - api.trove.user_update_attributes( - IsA(http.HttpRequest), IsA(six.text_type), IsA(six.text_type), - host=IsA(six.text_type), new_name=IsA(six.text_type), - new_password=IsA(six.text_type), new_host=IsA(six.text_type)) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:edit_user', - args=[database.id, user.name, '%']) - post = { - 'method': 'EditUserForm', - 'instance_id': database.id, - 'user_name': user.name, - 'new_name': 'new_name', - 'user_host': '%', - 'new_password': 'new_password', - 'new_host': '127.0.0.1'} - - res = self.client.post(url, post) - self.assertEqual(res.status_code, 302) - - def test_edit_user_no_values(self): - database = self.databases.first() - user = self.users.first() - - url = reverse('horizon:project:databases:edit_user', - args=[database.id, user.name, '%']) - post = { - 'method': 'EditUserForm', - 'instance_id': database.id, - 'user_name': user.name, - 'user_host': '%'} - res = self.client.post(url, post) - - msg = forms.EditUserForm.validation_error_message - self.assertFormError(res, "form", None, [msg]) - - @test.create_stubs({api.trove: ('database_list', 'user_show_access')}) - def test_access_detail_get(self): - api.trove.database_list(IsA(http.HttpRequest), IsA(six.text_type)) \ - .AndReturn(self.databases.list()) - - api.trove.user_show_access(IsA(http.HttpRequest), IsA(six.text_type), - IsA(six.text_type), - host=IsA(six.text_type)) \ - .AndReturn(self.databases.list()) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:access_detail', - args=['id', 'name', 'host']) - res = self.client.get(url) - self.assertTemplateUsed( - res, 'project/databases/access_detail.html') - - @test.create_stubs({api.trove: ('database_list', 'user_show_access')}) - def test_access_detail_get_exception(self): - api.trove.database_list(IsA(http.HttpRequest), IsA(six.text_type)) \ - .AndReturn(self.databases.list()) - - api.trove.user_show_access(IsA(http.HttpRequest), IsA(six.text_type), - IsA(six.text_type), - host=IsA(six.text_type)) \ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:access_detail', - args=['id', 'name', 'host']) - res = self.client.get(url) - self.assertRedirectsNoFollow(res, DETAILS_URL) - - @test.create_stubs({api.trove: ('user_grant_access',)}) - def test_detail_grant_access(self): - api.trove.user_grant_access( - IsA(http.HttpRequest), IsA(six.text_type), IsA(six.text_type), - [IsA(six.text_type)], host=IsA(six.text_type)) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:access_detail', - args=['id', 'name', 'host']) - form_data = {"action": "access__grant_access__%s" % 'db1'} - req = self.factory.post(url, form_data) - - kwargs = {'instance_id': 'id', 'user_name': 'name', 'user_host': '%'} - - db_access_list = [] - db_access = views.DBAccess('db1', False) - db_access_list.append(db_access) - - table = tables.AccessTable(req, db_access_list, **kwargs) - handled = table.maybe_handle() - - handled_url = handled['location'] - self.assertEqual(handled_url, url) - - @test.create_stubs({api.trove: ('user_grant_access',)}) - def test_detail_grant_access_exception(self): - api.trove.user_grant_access( - IsA(http.HttpRequest), IsA(six.text_type), IsA(six.text_type), - [IsA(six.text_type)], host=IsA(six.text_type)) \ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:access_detail', - args=['id', 'name', 'host']) - form_data = {"action": "access__grant_access__%s" % 'db1'} - req = self.factory.post(url, form_data) - - kwargs = {'instance_id': 'id', 'user_name': 'name', 'user_host': '%'} - - db_access_list = [] - db_access = views.DBAccess('db1', False) - db_access_list.append(db_access) - - table = tables.AccessTable(req, db_access_list, **kwargs) - handled = table.maybe_handle() - - handled_url = handled['location'] - self.assertEqual(handled_url, url) - - @test.create_stubs({api.trove: ('user_revoke_access',)}) - def test_detail_revoke_access(self): - - api.trove.user_revoke_access( - IsA(http.HttpRequest), IsA(six.text_type), IsA(six.text_type), - [IsA(six.text_type)], host=IsA(six.text_type)) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:access_detail', - args=['id', 'name', 'host']) - form_data = {"action": "access__revoke_access__%s" % 'db1'} - req = self.factory.post(url, form_data) - - kwargs = {'instance_id': 'id', 'user_name': 'name', 'user_host': '%'} - - db_access_list = [] - db_access = views.DBAccess('db1', True) - db_access_list.append(db_access) - - table = tables.AccessTable(req, db_access_list, **kwargs) - handled = table.maybe_handle() - - handled_url = handled['location'] - self.assertEqual(handled_url, url) - - @test.create_stubs({api.trove: ('user_revoke_access',)}) - def test_detail_revoke_access_exception(self): - - api.trove.user_revoke_access( - IsA(http.HttpRequest), IsA(six.text_type), IsA(six.text_type), - [IsA(six.text_type)], host=IsA(six.text_type)) \ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - url = reverse('horizon:project:databases:access_detail', - args=['id', 'name', 'host']) - form_data = {"action": "access__revoke_access__%s" % 'db1'} - req = self.factory.post(url, form_data) - - kwargs = {'instance_id': 'id', 'user_name': 'name', 'user_host': '%'} - - db_access_list = [] - db_access = views.DBAccess('db1', True) - db_access_list.append(db_access) - - table = tables.AccessTable(req, db_access_list, **kwargs) - handled = table.maybe_handle() - - handled_url = handled['location'] - self.assertEqual(handled_url, url) - - @test.create_stubs({ - api.trove: ('instance_get', 'instance_resize_volume')}) - def test_resize_volume(self): - database = self.databases.first() - database_id = database.id - database_size = database.volume.get('size') - - # views.py: DetailView.get_data - api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type))\ - .AndReturn(database) - - # forms.py: ResizeVolumeForm.handle - api.trove.instance_resize_volume(IsA(http.HttpRequest), - database_id, - IsA(int)).AndReturn(None) - - self.mox.ReplayAll() - url = reverse('horizon:project:databases:resize_volume', - args=[database_id]) - post = { - 'instance_id': database_id, - 'orig_size': database_size, - 'new_size': database_size + 1, - } - res = self.client.post(url, post) - self.assertNoFormErrors(res) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({api.trove: ('instance_get', )}) - def test_resize_volume_bad_value(self): - database = self.databases.first() - database_id = database.id - database_size = database.volume.get('size') - - # views.py: DetailView.get_data - api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type))\ - .AndReturn(database) - - self.mox.ReplayAll() - url = reverse('horizon:project:databases:resize_volume', - args=[database_id]) - post = { - 'instance_id': database_id, - 'orig_size': database_size, - 'new_size': database_size, - } - res = self.client.post(url, post) - self.assertContains( - res, "New size for volume must be greater than current size.") - - @test.create_stubs( - {api.trove: ('instance_get', - 'flavor_list')}) - def test_resize_instance_get(self): - database = self.databases.first() - - # views.py: DetailView.get_data - api.trove.instance_get(IsA(http.HttpRequest), database.id)\ - .AndReturn(database) - api.trove.flavor_list(IsA(http.HttpRequest)).\ - AndReturn(self.database_flavors.list()) - - self.mox.ReplayAll() - url = reverse('horizon:project:databases:resize_instance', - args=[database.id]) - - res = self.client.get(url) - self.assertTemplateUsed(res, 'project/databases/resize_instance.html') - option = '' - for flavor in self.database_flavors.list(): - if flavor.id == database.flavor['id']: - self.assertNotContains(res, option % (flavor.id, flavor.name)) - else: - self.assertContains(res, option % (flavor.id, flavor.name)) - - @test.create_stubs( - {api.trove: ('instance_get', - 'flavor_list', - 'instance_resize')}) - def test_resize_instance(self): - database = self.databases.first() - - # views.py: DetailView.get_data - api.trove.instance_get(IsA(http.HttpRequest), database.id)\ - .AndReturn(database) - api.trove.flavor_list(IsA(http.HttpRequest)).\ - AndReturn(self.database_flavors.list()) - - old_flavor = self.database_flavors.list()[0] - new_flavor = self.database_flavors.list()[1] - - api.trove.instance_resize(IsA(http.HttpRequest), - database.id, - new_flavor.id).AndReturn(None) - - self.mox.ReplayAll() - url = reverse('horizon:project:databases:resize_instance', - args=[database.id]) - post = { - 'instance_id': database.id, - 'old_flavor_name': old_flavor.name, - 'old_flavor_id': old_flavor.id, - 'new_flavor': new_flavor.id - } - res = self.client.post(url, post) - self.assertNoFormErrors(res) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('backup_list', 'configuration_list', 'datastore_flavors', - 'datastore_list', 'datastore_version_list', 'flavor_list', - 'instance_create', 'instance_get', 'instance_list_all'), - dash_api.cinder: ('volume_type_list',), - dash_api.neutron: ('network_list',), - dash_api.nova: ('availability_zone_list',), - policy: ('check',), - }) - def test_create_replica_instance(self): - policy.check((), IsA(http.HttpRequest)).MultipleTimes().AndReturn(True) - api.trove.datastore_flavors(IsA(http.HttpRequest), - IsA(six.string_types), - IsA(six.string_types)).\ - MultipleTimes().AndReturn(self.flavors.list()) - - api.trove.backup_list(IsA(http.HttpRequest)).AndReturn( - self.database_backups.list()) - - api.trove.instance_list_all(IsA(http.HttpRequest)).AndReturn( - self.databases.list()) - - api.trove.datastore_list(IsA(http.HttpRequest))\ - .AndReturn(self.datastores.list()) - - api.trove.datastore_version_list(IsA(http.HttpRequest), - IsA(str))\ - .MultipleTimes().AndReturn(self.datastore_versions.list()) - - dash_api.cinder.volume_type_list(IsA(http.HttpRequest)).AndReturn([]) - - dash_api.neutron.network_list(IsA(http.HttpRequest), - tenant_id=self.tenant.id, - shared=False).\ - AndReturn(self.networks.list()[:1]) - - dash_api.neutron.network_list(IsA(http.HttpRequest), - shared=True).\ - AndReturn(self.networks.list()[1:]) - - nics = [{"net-id": self.networks.first().id, "v4-fixed-ip": ''}] - - dash_api.nova.availability_zone_list(IsA(http.HttpRequest)) \ - .AndReturn(self.availability_zones.list()) - - api.trove.instance_get(IsA(http.HttpRequest), IsA(six.text_type))\ - .AndReturn(self.databases.first()) - - datastore = 'mysql' - datastore_version = '5.5' - field_name = self._build_flavor_widget_name(datastore, - datastore_version) - # Actual create database call - api.trove.instance_create( - IsA(http.HttpRequest), - IsA(six.text_type), - IsA(int), - IsA(six.text_type), - databases=None, - datastore=datastore, - datastore_version=datastore_version, - restore_point=None, - replica_of=self.databases.first().id, - configuration=None, - users=None, - nics=nics, - replica_count=2, - volume_type=None, - locality=None, - availability_zone=IsA(six.text_type) - ).AndReturn(self.databases.first()) - - self.mox.ReplayAll() - post = { - 'name': "MyDB", - 'volume': '1', - 'flavor': 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - 'datastore': field_name, - field_name: 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', - 'network': self.networks.first().id, - 'initial_state': 'master', - 'master': self.databases.first().id, - 'replica_count': 2, - 'volume_type': 'no_type' - } - - res = self.client.post(LAUNCH_URL, post) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('promote_to_replica_source',), - views.PromoteToReplicaSourceView: ('get_initial',)}) - def test_promote_replica_instance(self): - replica_source = self.databases.first() - replica = self.databases.list()[1] - - initial = {'instance_id': replica_source.id, - 'replica': replica, - 'replica_source': replica_source} - views.PromoteToReplicaSourceView.get_initial().AndReturn(initial) - - api.trove.promote_to_replica_source( - IsA(http.HttpRequest), replica_source.id) - - self.mox.ReplayAll() - url = reverse('horizon:project:databases:promote_to_replica_source', - args=[replica_source.id]) - form = { - 'instance_id': replica_source.id - } - res = self.client.post(url, form) - self.assertNoFormErrors(res) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('promote_to_replica_source',), - views.PromoteToReplicaSourceView: ('get_initial',)}) - def test_promote_replica_instance_exception(self): - replica_source = self.databases.first() - replica = self.databases.list()[1] - - initial = {'instance_id': replica_source.id, - 'replica': replica, - 'replica_source': replica_source} - views.PromoteToReplicaSourceView.get_initial().AndReturn(initial) - - api.trove.promote_to_replica_source( - IsA(http.HttpRequest), replica_source.id).\ - AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - url = reverse('horizon:project:databases:promote_to_replica_source', - args=[replica_source.id]) - form = { - 'instance_id': replica_source.id - } - res = self.client.post(url, form) - self.assertEqual(res.status_code, 302) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('flavor_list', 'instance_list', - 'eject_replica_source',), - }) - def test_eject_replica_source(self): - databases = common.Paginated(self.databases.list()) - database = databases[2] - - api.trove.eject_replica_source( - IsA(http.HttpRequest), database.id) - - databases = common.Paginated(self.databases.list()) - api.trove.instance_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(databases) - api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndReturn(self.flavors.list()) - - self.mox.ReplayAll() - - res = self.client.post( - INDEX_URL, - {'action': 'databases__eject_replica_source__%s' % database.id}) - - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('flavor_list', 'instance_list', - 'eject_replica_source',), - }) - def test_eject_replica_source_exception(self): - databases = common.Paginated(self.databases.list()) - database = databases[2] - - api.trove.eject_replica_source( - IsA(http.HttpRequest), database.id)\ - .AndRaise(self.exceptions.trove) - - databases = common.Paginated(self.databases.list()) - api.trove.instance_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(databases) - api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndReturn(self.flavors.list()) - - self.mox.ReplayAll() - - res = self.client.post( - INDEX_URL, - {'action': 'databases__eject_replica_source__%s' % database.id}) - - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('instance_list',) - }) - def test_master_list_pagination(self): - request = http.HttpRequest() - - first_part = common.Paginated(items=self.databases.list()[:1], - next_marker='marker') - second_part = common.Paginated(items=self.databases.list()[1:]) - - api.trove.instance_list(request).AndReturn(first_part) - (api.trove.instance_list(request, marker='marker') - .AndReturn(second_part)) - api.trove.instance_list(request).AndReturn(first_part) - - self.mox.ReplayAll() - - advanced_page = create_instance.AdvancedAction(request, None) - choices = advanced_page.populate_master_choices(request, None) - self.assertTrue(len(choices) == len(self.databases.list()) + 1) - - def _build_datastore_display_text(self, datastore, datastore_version): - return datastore + ' - ' + datastore_version - - def _build_flavor_widget_name(self, datastore, datastore_version): - return binascii.hexlify(self._build_datastore_display_text( - datastore, datastore_version)) - - @test.create_stubs({ - api.trove: ('instance_get', - 'configuration_list', - 'instance_attach_configuration'), - }) - def test_attach_configuration(self): - database = self.databases.first() - configuration = self.database_configurations.first() - - api.trove.instance_get(IsA(http.HttpRequest), IsA(unicode))\ - .AndReturn(database) - - api.trove.configuration_list(IsA(http.HttpRequest))\ - .AndReturn(self.database_configurations.list()) - - api.trove.instance_attach_configuration( - IsA(http.HttpRequest), database.id, configuration.id)\ - .AndReturn(None) - - self.mox.ReplayAll() - url = reverse('horizon:project:databases:attach_config', - args=[database.id]) - form = { - 'instance_id': database.id, - 'configuration': configuration.id, - } - res = self.client.post(url, form) - self.assertNoFormErrors(res) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('instance_get', - 'configuration_list', - 'instance_attach_configuration'), - }) - def test_attach_configuration_exception(self): - database = self.databases.first() - configuration = self.database_configurations.first() - - api.trove.instance_get(IsA(http.HttpRequest), IsA(unicode))\ - .AndReturn(database) - - api.trove.configuration_list(IsA(http.HttpRequest))\ - .AndReturn(self.database_configurations.list()) - - api.trove.instance_attach_configuration( - IsA(http.HttpRequest), database.id, configuration.id)\ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - url = reverse('horizon:project:databases:attach_config', - args=[database.id]) - form = { - 'instance_id': database.id, - 'configuration': configuration.id, - } - res = self.client.post(url, form) - self.assertEqual(res.status_code, 302) - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('instance_list', - 'flavor_list', - 'instance_detach_configuration',), - }) - def test_detach_configuration(self): - databases = common.Paginated(self.databases.list()) - database = databases[2] - - api.trove.instance_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(databases) - - api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndReturn(self.flavors.list()) - - api.trove.instance_detach_configuration( - IsA(http.HttpRequest), database.id)\ - .AndReturn(None) - - self.mox.ReplayAll() - - res = self.client.post( - INDEX_URL, - {'action': 'databases__detach_configuration__%s' % database.id}) - - self.assertRedirectsNoFollow(res, INDEX_URL) - - @test.create_stubs({ - api.trove: ('instance_list', - 'flavor_list', - 'instance_detach_configuration',), - }) - def test_detach_configuration_exception(self): - databases = common.Paginated(self.databases.list()) - database = databases[2] - - api.trove.instance_list(IsA(http.HttpRequest), marker=None)\ - .AndReturn(databases) - - api.trove.flavor_list(IsA(http.HttpRequest))\ - .AndReturn(self.flavors.list()) - - api.trove.instance_detach_configuration( - IsA(http.HttpRequest), database.id)\ - .AndRaise(self.exceptions.trove) - - self.mox.ReplayAll() - - res = self.client.post( - INDEX_URL, - {'action': 'databases__detach_configuration__%s' % database.id}) - - self.assertRedirectsNoFollow(res, INDEX_URL) diff --git a/trove_dashboard/content/databases/urls.py b/trove_dashboard/content/databases/urls.py deleted file mode 100644 index 1cd548b..0000000 --- a/trove_dashboard/content/databases/urls.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.conf.urls import include -from django.conf.urls import url - -from trove_dashboard.content.databases.logs import urls as logs_urls -from trove_dashboard.content.databases import views - -BASEINSTANCES = r'^(?P[^/]+)/%s' -INSTANCES = BASEINSTANCES + '$' -USERS = r'^(?P[^/]+)/(?P[^/]+)/' \ - r'(?P[^/]+)/%s$' - - -urlpatterns = [ - url(r'^$', views.IndexView.as_view(), name='index'), - url(r'^launch$', views.LaunchInstanceView.as_view(), name='launch'), - url(INSTANCES % '', views.DetailView.as_view(), name='detail'), - url(INSTANCES % 'resize_volume', views.ResizeVolumeView.as_view(), - name='resize_volume'), - url(INSTANCES % 'resize_instance', views.ResizeInstanceView.as_view(), - name='resize_instance'), - url(INSTANCES % 'create_user', views.CreateUserView.as_view(), - name='create_user'), - url(USERS % 'edit_user', views.EditUserView.as_view(), - name='edit_user'), - url(USERS % 'access_detail', views.AccessDetailView.as_view(), - name='access_detail'), - url(INSTANCES % 'create_database', views.CreateDatabaseView.as_view(), - name='create_database'), - url(INSTANCES % 'promote_to_replica_source', - views.PromoteToReplicaSourceView.as_view(), - name='promote_to_replica_source'), - url(INSTANCES % 'attach_config', views.AttachConfigurationView.as_view(), - name='attach_config'), - url(INSTANCES % 'manage_root', views.ManageRootView.as_view(), - name='manage_root'), - url(BASEINSTANCES % 'logs/', include(logs_urls, namespace='logs')), -] diff --git a/trove_dashboard/content/databases/views.py b/trove_dashboard/content/databases/views.py deleted file mode 100644 index 348dc7b..0000000 --- a/trove_dashboard/content/databases/views.py +++ /dev/null @@ -1,502 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -Views for managing database instances. -""" -from collections import OrderedDict -import logging - -from django.core.urlresolvers import reverse -from django.core.urlresolvers import reverse_lazy -from django.utils.translation import ugettext_lazy as _ - -import six - -from horizon import exceptions -from horizon import forms as horizon_forms -from horizon import tables as horizon_tables -from horizon import tabs as horizon_tabs -from horizon.utils import memoized -from horizon import workflows as horizon_workflows -from openstack_dashboard.dashboards.project.instances \ - import utils as instance_utils - -from trove_dashboard import api -from trove_dashboard.content.databases import forms -from trove_dashboard.content.databases import tables -from trove_dashboard.content.databases import tabs -from trove_dashboard.content.databases import workflows - -LOG = logging.getLogger(__name__) - - -class IndexView(horizon_tables.DataTableView): - table_class = tables.InstancesTable - template_name = 'project/databases/index.html' - page_title = _("Instances") - - def has_more_data(self, table): - return self._more - - @memoized.memoized_method - def get_flavors(self): - try: - flavors = api.trove.flavor_list(self.request) - except Exception: - flavors = [] - msg = _('Unable to retrieve database size information.') - exceptions.handle(self.request, msg) - return OrderedDict((six.text_type(flavor.id), flavor) - for flavor in flavors) - - def _extra_data(self, instance): - flavor = self.get_flavors().get(instance.flavor["id"]) - if flavor is not None: - instance.full_flavor = flavor - instance.host = tables.get_host(instance) - return instance - - def get_data(self): - marker = self.request.GET.get( - tables.InstancesTable._meta.pagination_param) - # Gather our instances - try: - instances = api.trove.instance_list(self.request, marker=marker) - self._more = instances.next or False - except Exception: - self._more = False - instances = [] - msg = _('Unable to retrieve database instances.') - exceptions.handle(self.request, msg) - map(self._extra_data, instances) - return instances - - -class LaunchInstanceView(horizon_workflows.WorkflowView): - workflow_class = workflows.LaunchInstance - template_name = "project/databases/launch.html" - page_title = _("Launch Database") - - def get_initial(self): - initial = super(LaunchInstanceView, self).get_initial() - initial['project_id'] = self.request.user.project_id - initial['user_id'] = self.request.user.id - return initial - - -class DBAccess(object): - def __init__(self, name, access): - self.name = name - self.access = access - - -class CreateUserView(horizon_forms.ModalFormView): - form_class = forms.CreateUserForm - form_id = "create_user_form" - modal_header = _("Create User") - modal_id = "create_user_modal" - template_name = 'project/databases/create_user.html' - submit_label = "Create User" - submit_url = 'horizon:project:databases:create_user' - success_url = 'horizon:project:databases:detail' - - def get_success_url(self): - return reverse(self.success_url, - args=(self.kwargs['instance_id'],)) - - def get_context_data(self, **kwargs): - context = super(CreateUserView, self).get_context_data(**kwargs) - context['instance_id'] = self.kwargs['instance_id'] - args = (self.kwargs['instance_id'],) - context['submit_url'] = reverse(self.submit_url, args=args) - return context - - def get_initial(self): - instance_id = self.kwargs['instance_id'] - return {'instance_id': instance_id} - - -class EditUserView(horizon_forms.ModalFormView): - form_class = forms.EditUserForm - form_id = "edit_user_form" - modal_header = _("Edit User") - modal_id = "edit_user_modal" - template_name = 'project/databases/edit_user.html' - submit_label = "Apply Changes" - submit_url = 'horizon:project:databases:edit_user' - success_url = 'horizon:project:databases:detail' - - def get_success_url(self): - return reverse(self.success_url, - args=(self.kwargs['instance_id'],)) - - def get_context_data(self, **kwargs): - context = super(EditUserView, self).get_context_data(**kwargs) - context['instance_id'] = self.kwargs['instance_id'] - context['user_name'] = self.kwargs['user_name'] - context['user_host'] = self.kwargs['user_host'] - args = (self.kwargs['instance_id'], self.kwargs['user_name'], - self.kwargs['user_host']) - context['submit_url'] = reverse(self.submit_url, args=args) - return context - - def get_initial(self): - instance_id = self.kwargs['instance_id'] - user_name = self.kwargs['user_name'] - user_host = self.kwargs['user_host'] - return {'instance_id': instance_id, 'user_name': user_name, - 'user_host': user_host} - - -class AccessDetailView(horizon_tables.DataTableView): - table_class = tables.AccessTable - template_name = 'project/databases/access_detail.html' - page_title = _("Database Access for: {{ user_name }}") - - @memoized.memoized_method - def get_data(self): - instance_id = self.kwargs['instance_id'] - user_name = self.kwargs['user_name'] - user_host = self.kwargs['user_host'] - try: - databases = api.trove.database_list(self.request, instance_id) - except Exception: - databases = [] - redirect = reverse('horizon:project:databases:detail', - args=[instance_id]) - exceptions.handle(self.request, - _('Unable to retrieve databases.'), - redirect=redirect) - try: - granted = api.trove.user_show_access( - self.request, instance_id, user_name, host=user_host) - except Exception: - granted = [] - redirect = reverse('horizon:project:databases:detail', - args=[instance_id]) - exceptions.handle(self.request, - _('Unable to retrieve accessible databases.'), - redirect=redirect) - - db_access_list = [] - for database in databases: - if database in granted: - access = True - else: - access = False - - db_access = DBAccess(database.name, access) - db_access_list.append(db_access) - - return sorted(db_access_list, key=lambda data: (data.name)) - - def get_context_data(self, **kwargs): - context = super(AccessDetailView, self).get_context_data(**kwargs) - context["db_access"] = self.get_data() - return context - - -class AttachConfigurationView(horizon_forms.ModalFormView): - form_class = forms.AttachConfigurationForm - form_id = "attach_config_form" - modal_header = _("Attach Configuration Group") - modal_id = "attach_config_modal" - template_name = "project/databases/attach_config.html" - submit_label = "Attach Configuration" - submit_url = 'horizon:project:databases:attach_config' - success_url = reverse_lazy('horizon:project:databases:index') - - @memoized.memoized_method - def get_object(self, *args, **kwargs): - instance_id = self.kwargs['instance_id'] - try: - return api.trove.instance_get(self.request, instance_id) - except Exception: - msg = _('Unable to retrieve instance details.') - redirect = reverse('horizon:project:databases:index') - exceptions.handle(self.request, msg, redirect=redirect) - - def get_context_data(self, **kwargs): - context = (super(AttachConfigurationView, self) - .get_context_data(**kwargs)) - context['instance_id'] = self.kwargs['instance_id'] - args = (self.kwargs['instance_id'],) - context['submit_url'] = reverse(self.submit_url, args=args) - return context - - def get_initial(self): - instance = self.get_object() - return {'instance_id': self.kwargs['instance_id'], - 'datastore': instance.datastore.get('type', ''), - 'datastore_version': instance.datastore.get('version', '')} - - -class DetailView(horizon_tabs.TabbedTableView): - tab_group_class = tabs.InstanceDetailTabs - template_name = 'horizon/common/_detail.html' - page_title = "{{ instance.name }}" - - def get_context_data(self, **kwargs): - context = super(DetailView, self).get_context_data(**kwargs) - instance = self.get_data() - table = tables.InstancesTable(self.request) - context["instance"] = instance - context["url"] = self.get_redirect_url() - context["actions"] = table.render_row_actions(instance) - return context - - @memoized.memoized_method - def get_data(self): - try: - LOG.info("Obtaining instance for detailed view ") - instance_id = self.kwargs['instance_id'] - instance = api.trove.instance_get(self.request, instance_id) - instance.host = tables.get_host(instance) - except Exception: - msg = _('Unable to retrieve details ' - 'for database instance: %s') % instance_id - exceptions.handle(self.request, msg, - redirect=self.get_redirect_url()) - try: - instance.full_flavor = api.trove.flavor_get( - self.request, instance.flavor["id"]) - except Exception: - LOG.error('Unable to retrieve flavor details' - ' for database instance: %s' % instance_id) - return instance - - def get_tabs(self, request, *args, **kwargs): - instance = self.get_data() - return self.tab_group_class(request, instance=instance, **kwargs) - - @staticmethod - def get_redirect_url(): - return reverse('horizon:project:databases:index') - - -class CreateDatabaseView(horizon_forms.ModalFormView): - form_class = forms.CreateDatabaseForm - form_id = "create_database_form" - modal_header = _("Create Database") - modal_id = "create_database_modal" - template_name = 'project/databases/create_database.html' - submit_label = _("Create Database") - submit_url = 'horizon:project:databases:create_database' - success_url = 'horizon:project:databases:detail' - - def get_success_url(self): - return reverse(self.success_url, - args=(self.kwargs['instance_id'],)) - - def get_context_data(self, **kwargs): - context = super(CreateDatabaseView, self).get_context_data(**kwargs) - context['instance_id'] = self.kwargs['instance_id'] - args = (self.kwargs['instance_id'],) - context['submit_url'] = reverse(self.submit_url, args=args) - return context - - def get_initial(self): - instance_id = self.kwargs['instance_id'] - return {'instance_id': instance_id} - - -class ResizeVolumeView(horizon_forms.ModalFormView): - form_class = forms.ResizeVolumeForm - form_id = "resize_volume_form" - modal_header = _("Resize Database Volume") - modal_id = "resize_volume_modal" - template_name = 'project/databases/resize_volume.html' - submit_label = "Resize Database Volume" - submit_url = 'horizon:project:databases:resize_volume' - success_url = reverse_lazy('horizon:project:databases:index') - page_title = _("Resize Database Volume") - - @memoized.memoized_method - def get_object(self, *args, **kwargs): - instance_id = self.kwargs['instance_id'] - try: - return api.trove.instance_get(self.request, instance_id) - except Exception: - msg = _('Unable to retrieve instance details.') - redirect = reverse('horizon:project:databases:index') - exceptions.handle(self.request, msg, redirect=redirect) - - def get_context_data(self, **kwargs): - context = super(ResizeVolumeView, self).get_context_data(**kwargs) - context['instance_id'] = self.kwargs['instance_id'] - args = (self.kwargs['instance_id'],) - context['submit_url'] = reverse(self.submit_url, args=args) - return context - - def get_initial(self): - instance = self.get_object() - return {'instance_id': self.kwargs['instance_id'], - 'orig_size': instance.volume.get('size', 0)} - - -class ResizeInstanceView(horizon_forms.ModalFormView): - form_class = forms.ResizeInstanceForm - form_id = "resize_instance_form" - modal_header = _("Resize Database Instance") - modal_id = "resize_instance_modal" - template_name = 'project/databases/resize_instance.html' - submit_label = "Resize Database Instance" - submit_url = 'horizon:project:databases:resize_instance' - success_url = reverse_lazy('horizon:project:databases:index') - page_title = _("Resize Database Instance") - - @memoized.memoized_method - def get_object(self, *args, **kwargs): - instance_id = self.kwargs['instance_id'] - - try: - instance = api.trove.instance_get(self.request, instance_id) - flavor_id = instance.flavor['id'] - flavors = {} - for i, j in self.get_flavors(): - flavors[str(i)] = j - - if flavor_id in flavors: - instance.flavor_name = flavors[flavor_id] - else: - flavor = api.trove.flavor_get(self.request, flavor_id) - instance.flavor_name = flavor.name - return instance - except Exception: - redirect = reverse('horizon:project:databases:index') - msg = _('Unable to retrieve instance details.') - exceptions.handle(self.request, msg, redirect=redirect) - - def get_context_data(self, **kwargs): - context = super(ResizeInstanceView, self).get_context_data(**kwargs) - context['instance_id'] = self.kwargs['instance_id'] - args = (self.kwargs['instance_id'],) - context['submit_url'] = reverse(self.submit_url, args=args) - return context - - @memoized.memoized_method - def get_flavors(self, *args, **kwargs): - try: - flavors = api.trove.flavor_list(self.request) - return instance_utils.sort_flavor_list(self.request, flavors) - except Exception: - redirect = reverse("horizon:project:databases:index") - exceptions.handle(self.request, - _('Unable to retrieve flavors.'), - redirect=redirect) - - def get_initial(self): - initial = super(ResizeInstanceView, self).get_initial() - obj = self.get_object() - if obj: - initial.update({'instance_id': self.kwargs['instance_id'], - 'old_flavor_id': obj.flavor['id'], - 'old_flavor_name': getattr(obj, - 'flavor_name', ''), - 'flavors': self.get_flavors()}) - return initial - - -class PromoteToReplicaSourceView(horizon_forms.ModalFormView): - form_class = forms.PromoteToReplicaSourceForm - form_id = "promote_to_replica_source_form" - modal_header = _("Promote to Replica Source") - modal_id = "promote_to_replica_source_modal" - template_name = 'project/databases/promote_to_replica_source.html' - submit_lable = _("Promote") - submit_url = 'horizon:project:databases:promote_to_replica_source' - success_url = reverse_lazy('horizon:project:databases:index') - - @memoized.memoized_method - def get_object(self, *args, **kwargs): - instance_id = self.kwargs['instance_id'] - try: - replica = api.trove.instance_get(self.request, instance_id) - replica_source = api.trove.instance_get(self.request, - replica.replica_of['id']) - instances = {'replica': replica, - 'replica_source': replica_source} - return instances - except Exception: - msg = _('Unable to retrieve instance details.') - redirect = reverse('horizon:project:databases:index') - exceptions.handle(self.request, msg, redirect=redirect) - - def get_context_data(self, **kwargs): - context = \ - super(PromoteToReplicaSourceView, self).get_context_data(**kwargs) - context['instance_id'] = self.kwargs['instance_id'] - context['replica'] = self.get_initial().get('replica') - context['replica'].ip = \ - self.get_initial().get('replica').ip[0] - context['replica_source'] = self.get_initial().get('replica_source') - context['replica_source'].ip = \ - self.get_initial().get('replica_source').ip[0] - args = (self.kwargs['instance_id'],) - context['submit_url'] = reverse(self.submit_url, args=args) - return context - - def get_initial(self): - instances = self.get_object() - return {'instance_id': self.kwargs['instance_id'], - 'replica': instances['replica'], - 'replica_source': instances['replica_source']} - - -class EnableRootInfo(object): - def __init__(self, instance_id, instance_name, enabled, password=None): - self.id = instance_id - self.name = instance_name - self.enabled = enabled - self.password = password - - -class ManageRootView(horizon_tables.DataTableView): - table_class = tables.ManageRootTable - template_name = 'project/databases/manage_root.html' - page_title = _("Manage Root Access") - - @memoized.memoized_method - def get_data(self): - instance_id = self.kwargs['instance_id'] - try: - instance = api.trove.instance_get(self.request, instance_id) - except Exception: - redirect = reverse('horizon:project:databases:detail', - args=[instance_id]) - exceptions.handle(self.request, - _('Unable to retrieve instance details.'), - redirect=redirect) - try: - enabled = api.trove.root_show(self.request, instance_id) - except Exception: - redirect = reverse('horizon:project:databases:detail', - args=[instance_id]) - exceptions.handle(self.request, - _('Unable to determine if instance root ' - 'is enabled.'), - redirect=redirect) - - root_enabled_list = [] - root_enabled_info = EnableRootInfo(instance.id, - instance.name, - enabled.rootEnabled) - root_enabled_list.append(root_enabled_info) - return root_enabled_list - - def get_context_data(self, **kwargs): - context = super(ManageRootView, self).get_context_data(**kwargs) - context['instance_id'] = self.kwargs['instance_id'] - return context diff --git a/trove_dashboard/content/databases/workflows/__init__.py b/trove_dashboard/content/databases/workflows/__init__.py deleted file mode 100644 index 5e43664..0000000 --- a/trove_dashboard/content/databases/workflows/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# Importing non-modules that are not used explicitly - -from .create_instance import LaunchInstance # noqa diff --git a/trove_dashboard/content/databases/workflows/create_instance.py b/trove_dashboard/content/databases/workflows/create_instance.py deleted file mode 100644 index 513d57a..0000000 --- a/trove_dashboard/content/databases/workflows/create_instance.py +++ /dev/null @@ -1,584 +0,0 @@ -# Copyright 2013 Rackspace Hosting -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 binascii -import logging - -from django.conf import settings -from django.core.urlresolvers import reverse -from django.utils.translation import ugettext_lazy as _ - -from horizon import exceptions -from horizon import forms -from horizon.utils import memoized -from horizon import workflows -from openstack_dashboard import api as dash_api -from openstack_dashboard.dashboards.project.instances \ - import utils as instance_utils -from openstack_dashboard.dashboards.project.instances.workflows \ - import create_instance as dash_create_instance - - -from trove_dashboard import api - -LOG = logging.getLogger(__name__) - - -def parse_datastore_and_version_text(datastore_and_version): - if datastore_and_version: - datastore, datastore_version = datastore_and_version.split('-', 1) - return datastore.strip(), datastore_version.strip() - return None, None - - -class SetInstanceDetailsAction(workflows.Action): - availability_zone = forms.ChoiceField( - label=_("Availability Zone"), - required=False) - name = forms.CharField(max_length=80, label=_("Instance Name")) - volume = forms.IntegerField(label=_("Volume Size"), - min_value=0, - initial=1, - help_text=_("Size of the volume in GB.")) - volume_type = forms.ChoiceField( - label=_("Volume Type"), - required=False, - help_text=_("Applicable only if the volume size is specified.")) - datastore = forms.ChoiceField( - label=_("Datastore"), - help_text=_("Type and version of datastore."), - widget=forms.Select(attrs={ - 'class': 'switchable', - 'data-slug': 'datastore' - })) - - def __init__(self, request, *args, **kwargs): - super(SetInstanceDetailsAction, self).__init__(request, - *args, - **kwargs) - # Add this field to the end after the dynamic fields - self.fields['locality'] = forms.ChoiceField( - label=_("Locality"), - choices=[("", "None"), - ("affinity", "affinity"), - ("anti-affinity", "anti-affinity")], - required=False, - help_text=_("Specify whether future replicated instances will " - "be created on the same hypervisor (affinity) or on " - "different hypervisors (anti-affinity). " - "This value is ignored if the instance to be " - "launched is a replica.") - ) - - class Meta(object): - name = _("Details") - help_text_template = "project/databases/_launch_details_help.html" - - def clean(self): - datastore_and_version = self.data.get("datastore", None) - if not datastore_and_version: - msg = _("You must select a datastore type and version.") - self._errors["datastore"] = self.error_class([msg]) - else: - datastore, datastore_version = parse_datastore_and_version_text( - binascii.unhexlify(datastore_and_version)) - field_name = self._build_flavor_field_name(datastore, - datastore_version) - flavor = self.data.get(field_name, None) - if not flavor: - msg = _("You must select a flavor.") - self._errors[field_name] = self.error_class([msg]) - - if not self.data.get("locality", None): - self.cleaned_data["locality"] = None - - return self.cleaned_data - - def handle(self, request, context): - datastore_and_version = context["datastore"] - if datastore_and_version: - datastore, datastore_version = parse_datastore_and_version_text( - binascii.unhexlify(context["datastore"])) - field_name = self._build_flavor_field_name(datastore, - datastore_version) - flavor = self.data[field_name] - if flavor: - context["flavor"] = flavor - return context - return None - - @memoized.memoized_method - def availability_zones(self, request): - try: - return dash_api.nova.availability_zone_list(request) - except Exception: - LOG.exception("Exception while obtaining availablity zones") - self._availability_zones = [] - - def populate_availability_zone_choices(self, request, context): - try: - zones = self.availability_zones(request) - except Exception: - zones = [] - redirect = reverse('horizon:project:databases:index') - exceptions.handle(request, - _('Unable to retrieve availability zones.'), - redirect=redirect) - - zone_list = [(zone.zoneName, zone.zoneName) - for zone in zones if zone.zoneState['available']] - zone_list.sort() - if not zone_list: - zone_list.insert(0, ("", _("No availability zones found"))) - elif len(zone_list) > 1: - zone_list.insert(0, ("", _("Any Availability Zone"))) - return zone_list - - @memoized.memoized_method - def datastore_flavors(self, request, datastore_name, datastore_version): - try: - return api.trove.datastore_flavors( - request, datastore_name, datastore_version) - except Exception: - LOG.exception("Exception while obtaining flavors list") - redirect = reverse("horizon:project:databases:index") - exceptions.handle(request, - _('Unable to obtain flavors.'), - redirect=redirect) - - @memoized.memoized_method - def populate_volume_type_choices(self, request, context): - try: - volume_types = dash_api.cinder.volume_type_list(request) - return ([("no_type", _("No volume type"))] + - [(type.name, type.name) - for type in volume_types]) - except Exception: - LOG.exception("Exception while obtaining volume types list") - self._volume_types = [] - - @memoized.memoized_method - def datastores(self, request): - try: - return api.trove.datastore_list(request) - except Exception: - LOG.exception("Exception while obtaining datastores list") - self._datastores = [] - - @memoized.memoized_method - def datastore_versions(self, request, datastore): - try: - return api.trove.datastore_version_list(request, datastore) - except Exception: - LOG.exception("Exception while obtaining datastore version list") - self._datastore_versions = [] - - def populate_datastore_choices(self, request, context): - choices = () - datastores = self.datastores(request) - if datastores is not None: - for ds in datastores: - versions = self.datastore_versions(request, ds.name) - if versions: - # only add to choices if datastore has at least one version - version_choices = () - for v in versions: - if hasattr(v, 'active') and not v.active: - continue - selection_text = self._build_datastore_display_text( - ds.name, v.name) - widget_text = self._build_widget_field_name( - ds.name, v.name) - version_choices = (version_choices + - ((widget_text, selection_text),)) - self._add_datastore_flavor_field(request, - ds.name, - v.name) - choices = choices + version_choices - return choices - - def _add_datastore_flavor_field(self, - request, - datastore, - datastore_version): - name = self._build_widget_field_name(datastore, datastore_version) - attr_key = 'data-datastore-' + name - field_name = self._build_flavor_field_name(datastore, - datastore_version) - self.fields[field_name] = forms.ChoiceField( - label=_("Flavor"), - help_text=_("Size of image to launch."), - required=False, - widget=forms.Select(attrs={ - 'class': 'switched', - 'data-switch-on': 'datastore', - attr_key: _("Flavor") - })) - valid_flavors = self.datastore_flavors(request, - datastore, - datastore_version) - if valid_flavors: - self.fields[field_name].choices = instance_utils.sort_flavor_list( - request, valid_flavors) - - def _build_datastore_display_text(self, datastore, datastore_version): - return datastore + ' - ' + datastore_version - - def _build_widget_field_name(self, datastore, datastore_version): - # Since the fieldnames cannot contain an uppercase character - # we generate a hex encoded string representation of the - # datastore and version as the fieldname - return binascii.hexlify( - self._build_datastore_display_text(datastore, datastore_version)) - - def _build_flavor_field_name(self, datastore, datastore_version): - return self._build_widget_field_name(datastore, - datastore_version) - - -TROVE_ADD_USER_PERMS = getattr(settings, 'TROVE_ADD_USER_PERMS', []) -TROVE_ADD_DATABASE_PERMS = getattr(settings, 'TROVE_ADD_DATABASE_PERMS', []) -TROVE_ADD_PERMS = TROVE_ADD_USER_PERMS + TROVE_ADD_DATABASE_PERMS - - -class SetInstanceDetails(workflows.Step): - action_class = SetInstanceDetailsAction - contributes = ("name", "volume", "volume_type", "flavor", "datastore", - "locality", "availability_zone") - - -class AddDatabasesAction(workflows.Action): - """Initialize the database with users/databases. This tab will honor - the settings which should be a list of permissions required: - - * TROVE_ADD_USER_PERMS = [] - * TROVE_ADD_DATABASE_PERMS = [] - """ - databases = forms.CharField(label=_('Initial Databases'), - required=False, - help_text=_('Comma separated list of ' - 'databases to create')) - user = forms.CharField(label=_('Initial Admin User'), - required=False, - help_text=_("Initial admin user to add")) - password = forms.CharField(widget=forms.PasswordInput(), - label=_("Password"), - required=False) - host = forms.CharField(label=_("Allowed Host (optional)"), - required=False, - help_text=_("Host or IP that the user is allowed " - "to connect through.")) - - class Meta(object): - name = _("Initialize Databases") - permissions = TROVE_ADD_PERMS - help_text_template = "project/databases/_launch_initialize_help.html" - - def clean(self): - cleaned_data = super(AddDatabasesAction, self).clean() - if cleaned_data.get('user'): - if not cleaned_data.get('password'): - msg = _('You must specify a password if you create a user.') - self._errors["password"] = self.error_class([msg]) - if not cleaned_data.get('databases'): - msg = _('You must specify at least one database if ' - 'you create a user.') - self._errors["databases"] = self.error_class([msg]) - return cleaned_data - - -class InitializeDatabase(workflows.Step): - action_class = AddDatabasesAction - contributes = ["databases", 'user', 'password', 'host'] - - -class AdvancedAction(workflows.Action): - config = forms.ChoiceField( - label=_("Configuration Group"), - required=False, - help_text=_('Select a configuration group')) - initial_state = forms.ChoiceField( - label=_('Source for Initial State'), - required=False, - help_text=_("Choose initial state."), - choices=[ - ('', _('None')), - ('backup', _('Restore from Backup')), - ('master', _('Replicate from Instance'))], - widget=forms.Select(attrs={ - 'class': 'switchable', - 'data-slug': 'initial_state' - })) - backup = forms.ChoiceField( - label=_('Backup Name'), - required=False, - help_text=_('Select a backup to restore'), - widget=forms.Select(attrs={ - 'class': 'switched', - 'data-switch-on': 'initial_state', - 'data-initial_state-backup': _('Backup Name') - })) - master = forms.ChoiceField( - label=_('Master Instance Name'), - required=False, - help_text=_('Select a master instance'), - widget=forms.Select(attrs={ - 'class': 'switched', - 'data-switch-on': 'initial_state', - 'data-initial_state-master': _('Master Instance Name') - })) - replica_count = forms.IntegerField( - label=_('Replica Count'), - required=False, - min_value=1, - initial=1, - help_text=_('Specify the number of replicas to be created'), - widget=forms.TextInput(attrs={ - 'class': 'switched', - 'data-switch-on': 'initial_state', - 'data-initial_state-master': _('Replica Count') - })) - - class Meta(object): - name = _("Advanced") - help_text_template = "project/databases/_launch_advanced_help.html" - - def populate_config_choices(self, request, context): - try: - configs = api.trove.configuration_list(request) - config_name = "%(name)s (%(datastore)s - %(version)s)" - choices = [(c.id, - config_name % {'name': c.name, - 'datastore': c.datastore_name, - 'version': c.datastore_version_name}) - for c in configs] - except Exception: - choices = [] - - if choices: - choices.insert(0, ("", _("Select configuration"))) - else: - choices.insert(0, ("", _("No configurations available"))) - return choices - - def populate_backup_choices(self, request, context): - try: - backups = api.trove.backup_list(request) - choices = [(b.id, b.name) for b in backups - if b.status == 'COMPLETED'] - except Exception: - choices = [] - - if choices: - choices.insert(0, ("", _("Select backup"))) - else: - choices.insert(0, ("", _("No backups available"))) - return choices - - def _get_instances(self): - instances = [] - try: - instances = api.trove.instance_list_all(self.request) - except Exception: - msg = _('Unable to retrieve database instances.') - exceptions.handle(self.request, msg) - return instances - - def populate_master_choices(self, request, context): - try: - instances = self._get_instances() - choices = sorted([(i.id, i.name) for i in - instances if i.status == 'ACTIVE'], - key=lambda i: i[1]) - except Exception: - choices = [] - - if choices: - choices.insert(0, ("", _("Select instance"))) - else: - choices.insert(0, ("", _("No instances available"))) - return choices - - def clean(self): - cleaned_data = super(AdvancedAction, self).clean() - - config = self.cleaned_data['config'] - if config: - try: - # Make sure the user is not "hacking" the form - # and that they have access to this configuration - cfg = api.trove.configuration_get(self.request, config) - self.cleaned_data['config'] = cfg.id - except Exception: - raise forms.ValidationError(_("Unable to find configuration " - "group!")) - else: - self.cleaned_data['config'] = None - - initial_state = cleaned_data.get("initial_state") - - if initial_state == 'backup': - cleaned_data['replica_count'] = None - backup = self.cleaned_data['backup'] - if backup: - try: - bkup = api.trove.backup_get(self.request, backup) - self.cleaned_data['backup'] = bkup.id - except Exception: - raise forms.ValidationError(_("Unable to find backup!")) - else: - raise forms.ValidationError(_("A backup must be selected!")) - - cleaned_data['master'] = None - elif initial_state == 'master': - master = self.cleaned_data['master'] - if master: - try: - api.trove.instance_get(self.request, master) - except Exception: - raise forms.ValidationError( - _("Unable to find master instance!")) - else: - raise forms.ValidationError( - _("A master instance must be selected!")) - - cleaned_data['backup'] = None - else: - cleaned_data['master'] = None - cleaned_data['backup'] = None - cleaned_data['replica_count'] = None - - return cleaned_data - - -class Advanced(workflows.Step): - action_class = AdvancedAction - contributes = ['config', 'backup', 'master', 'replica_count'] - - -class LaunchInstance(workflows.Workflow): - slug = "launch_instance" - name = _("Launch Instance") - finalize_button_name = _("Launch") - success_message = _('Launched %(count)s named "%(name)s".') - failure_message = _('Unable to launch %(count)s named "%(name)s".') - success_url = "horizon:project:databases:index" - default_steps = (SetInstanceDetails, - dash_create_instance.SetNetwork, - InitializeDatabase, - Advanced) - - def __init__(self, request=None, context_seed=None, entry_point=None, - *args, **kwargs): - super(LaunchInstance, self).__init__(request, context_seed, - entry_point, *args, **kwargs) - self.attrs['autocomplete'] = ( - settings.HORIZON_CONFIG.get('password_autocomplete')) - - def format_status_message(self, message): - name = self.context.get('name', 'unknown instance') - return message % {"count": _("instance"), "name": name} - - def _get_databases(self, context): - """Returns the initial databases for this instance.""" - databases = None - if context.get('databases'): - dbs = context['databases'] - databases = [{'name': d.strip()} for d in dbs.split(',')] - return databases - - def _get_users(self, context): - users = None - if context.get('user'): - user = { - 'name': context['user'], - 'password': context['password'], - 'databases': self._get_databases(context), - } - if context['host']: - user['host'] = context['host'] - users = [user] - return users - - def _get_backup(self, context): - backup = None - if context.get('backup'): - backup = {'backupRef': context['backup']} - return backup - - def _get_nics(self, context): - netids = context.get('network_id', None) - if netids: - return [{"net-id": netid, "v4-fixed-ip": ""} - for netid in netids] - else: - return None - - def _get_volume_type(self, context): - volume_type = None - if context.get('volume_type') != 'no_type': - volume_type = context['volume_type'] - return volume_type - - def _get_locality(self, context): - # If creating a replica from a master then always set to None - if context.get('master'): - return None - - locality = None - if context.get('locality'): - locality = context['locality'] - return locality - - def handle(self, request, context): - try: - datastore, datastore_version = parse_datastore_and_version_text( - binascii.unhexlify(self.context['datastore'])) - avail_zone = context.get('availability_zone', None) - LOG.info("Launching database instance with parameters " - "{name=%s, volume=%s, volume_type=%s, flavor=%s, " - "datastore=%s, datastore_version=%s, " - "dbs=%s, users=%s, " - "backups=%s, nics=%s, replica_of=%s replica_count=%s, " - "configuration=%s, locality=%s, " - "availability_zone=%s}", - context['name'], context['volume'], - self._get_volume_type(context), context['flavor'], - datastore, datastore_version, - self._get_databases(context), self._get_users(context), - self._get_backup(context), self._get_nics(context), - context.get('master'), context['replica_count'], - context.get('config'), self._get_locality(context), - avail_zone) - api.trove.instance_create(request, - context['name'], - context['volume'], - context['flavor'], - datastore=datastore, - datastore_version=datastore_version, - databases=self._get_databases(context), - users=self._get_users(context), - restore_point=self._get_backup(context), - nics=self._get_nics(context), - replica_of=context.get('master'), - replica_count=context['replica_count'], - volume_type=self._get_volume_type( - context), - configuration=context.get('config'), - locality=self._get_locality(context), - availability_zone=avail_zone) - return True - except Exception: - exceptions.handle(request) - return False diff --git a/trove_dashboard/content/ng_database_backups/__init__.py b/trove_dashboard/content/ng_database_backups/__init__.py deleted file mode 100644 index a7e6dcf..0000000 --- a/trove_dashboard/content/ng_database_backups/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# 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 trove_dashboard.api.rest # noqa diff --git a/trove_dashboard/content/ng_database_backups/panel.py b/trove_dashboard/content/ng_database_backups/panel.py deleted file mode 100644 index 8a9c9b1..0000000 --- a/trove_dashboard/content/ng_database_backups/panel.py +++ /dev/null @@ -1,24 +0,0 @@ -# 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. - -from django.utils.translation import ugettext_lazy as _ - -import horizon - - -class NGBackups(horizon.Panel): - name = _("Backups") - slug = 'ng_database_backups' - policy_rules = ('openstack.services.database', - 'openstack.services.object-store',) diff --git a/trove_dashboard/content/ng_database_backups/templates/ng_database_backups/index.html b/trove_dashboard/content/ng_database_backups/templates/ng_database_backups/index.html deleted file mode 100644 index a6f0f97..0000000 --- a/trove_dashboard/content/ng_database_backups/templates/ng_database_backups/index.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'base.html' %} -{% load i18n %} -{% block title %}{% trans "Backups" %}{% endblock %} - -{% block page_header %} - -{% endblock page_header %} - -{% block main %} - -{% endblock %} diff --git a/trove_dashboard/content/ng_database_backups/urls.py b/trove_dashboard/content/ng_database_backups/urls.py deleted file mode 100644 index f7d9180..0000000 --- a/trove_dashboard/content/ng_database_backups/urls.py +++ /dev/null @@ -1,21 +0,0 @@ -# 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.conf import urls - -from trove_dashboard.content.ng_database_backups import views - -urlpatterns = [ - urls.url(r'^$', views.IndexView.as_view(), name='index'), -] diff --git a/trove_dashboard/content/ng_database_backups/views.py b/trove_dashboard/content/ng_database_backups/views.py deleted file mode 100644 index 30cc03d..0000000 --- a/trove_dashboard/content/ng_database_backups/views.py +++ /dev/null @@ -1,19 +0,0 @@ -# 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. - -from django.views import generic - - -class IndexView(generic.TemplateView): - template_name = 'project/ng_database_backups/index.html' diff --git a/trove_dashboard/enabled/_1710_database_panel_group.py b/trove_dashboard/enabled/_1710_database_panel_group.py deleted file mode 100644 index 3409b8f..0000000 --- a/trove_dashboard/enabled/_1710_database_panel_group.py +++ /dev/null @@ -1,20 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.utils.translation import ugettext_lazy as _ - -# The slug of the panel group to be added to HORIZON_CONFIG. Required. -PANEL_GROUP = 'database' -# The display name of the PANEL_GROUP. Required. -PANEL_GROUP_NAME = _('Database') -# The slug of the dashboard the PANEL_GROUP associated with. Required. -PANEL_GROUP_DASHBOARD = 'project' diff --git a/trove_dashboard/enabled/_1720_project_databases_panel.py b/trove_dashboard/enabled/_1720_project_databases_panel.py deleted file mode 100644 index 0c61385..0000000 --- a/trove_dashboard/enabled/_1720_project_databases_panel.py +++ /dev/null @@ -1,31 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 trove_dashboard import exceptions - -# The slug of the panel to be added to HORIZON_CONFIG. Required. -PANEL = 'databases' -# The slug of the dashboard the PANEL associated with. Required. -PANEL_DASHBOARD = 'project' -# The slug of the panel group the PANEL is associated with. -PANEL_GROUP = 'database' - -# Python panel class of the PANEL to be added. -ADD_PANEL = ('trove_dashboard.content.databases.panel.Databases') - -ADD_INSTALLED_APPS = ["trove_dashboard", ] - -ADD_EXCEPTIONS = { - 'not_found': exceptions.NOT_FOUND, - 'recoverable': exceptions.RECOVERABLE, - 'unauthorized': exceptions.UNAUTHORIZED -} diff --git a/trove_dashboard/enabled/_1730_project_database_backups_panel.py b/trove_dashboard/enabled/_1730_project_database_backups_panel.py deleted file mode 100644 index 2f5de85..0000000 --- a/trove_dashboard/enabled/_1730_project_database_backups_panel.py +++ /dev/null @@ -1,29 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 trove_dashboard import exceptions - -# The slug of the panel to be added to HORIZON_CONFIG. Required. -PANEL = 'database_backups' -# The slug of the dashboard the PANEL associated with. Required. -PANEL_DASHBOARD = 'project' -# The slug of the panel group the PANEL is associated with. -PANEL_GROUP = 'database' - -# Python panel class of the PANEL to be added. -ADD_PANEL = ('trove_dashboard.content.database_backups.panel.Backups') - -ADD_EXCEPTIONS = { - 'not_found': exceptions.NOT_FOUND, - 'recoverable': exceptions.RECOVERABLE, - 'unauthorized': exceptions.UNAUTHORIZED, -} diff --git a/trove_dashboard/enabled/_1731_project_database_backups_panel.py b/trove_dashboard/enabled/_1731_project_database_backups_panel.py deleted file mode 100644 index bc82107..0000000 --- a/trove_dashboard/enabled/_1731_project_database_backups_panel.py +++ /dev/null @@ -1,42 +0,0 @@ -# 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. - - -# The slug of the panel to be added to HORIZON_CONFIG. Required. -PANEL = 'ng_database_backups' -# The slug of the dashboard the PANEL associated with. Required. -PANEL_DASHBOARD = 'project' -# The slug of the panel group the PANEL is associated with. -PANEL_GROUP = 'database' - -# If set to True, this settings file will not be added to the settings. -DISABLED = True - -# Python panel class of the PANEL to be added. -ADD_PANEL = ('trove_dashboard.content.ng_database_backups.panel.NGBackups') -ADD_ANGULAR_MODULES = ['horizon.dashboard.project.backups'] - -ADD_SCSS_FILES = ['dashboard/project/ngbackups/backups.scss'] - -ADD_JS_FILES = [ - 'dashboard/project/ngbackups/backups.module.js', - 'dashboard/project/ngbackups/table/table.controller.js', - 'dashboard/project/ngbackups/table/table.config.js', - 'app/core/openstack-service-api/trove.service.js' -] - -ADD_JS_SPEC_FILES = [ - 'dashboard/project/ngbackups/backups.module.spec.js', - 'dashboard/project/ngbackups/table/table.controller.spec.js' -] diff --git a/trove_dashboard/enabled/_1740_project_database_clusters_panel.py b/trove_dashboard/enabled/_1740_project_database_clusters_panel.py deleted file mode 100644 index e18d994..0000000 --- a/trove_dashboard/enabled/_1740_project_database_clusters_panel.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright [2015] Hewlett-Packard Development Company, L.P. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from trove_dashboard import exceptions - -# The slug of the panel to be added to HORIZON_CONFIG. Required. -PANEL = 'database_clusters' -# The slug of the dashboard the PANEL associated with. Required. -PANEL_DASHBOARD = 'project' -# The slug of the panel group the PANEL is associated with. -PANEL_GROUP = 'database' - -# Python panel class of the PANEL to be added. -ADD_PANEL = ('trove_dashboard.content.database_clusters.panel.Clusters') - -ADD_EXCEPTIONS = { - 'not_found': exceptions.NOT_FOUND, - 'recoverable': exceptions.RECOVERABLE, - 'unauthorized': exceptions.UNAUTHORIZED -} diff --git a/trove_dashboard/enabled/_1760_project_database_configurations_panel.py b/trove_dashboard/enabled/_1760_project_database_configurations_panel.py deleted file mode 100644 index 9aa2cdf..0000000 --- a/trove_dashboard/enabled/_1760_project_database_configurations_panel.py +++ /dev/null @@ -1,30 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 trove_dashboard import exceptions - -# The slug of the panel to be added to HORIZON_CONFIG. Required. -PANEL = 'database_configurations' -# The slug of the dashboard the PANEL associated with. Required. -PANEL_DASHBOARD = 'project' -# The slug of the panel group the PANEL is associated with. -PANEL_GROUP = 'database' - -# Python panel class of the PANEL to be added. -ADD_PANEL = ('trove_dashboard.content.database_configurations.panel.' - 'Configurations') - -ADD_EXCEPTIONS = { - 'not_found': exceptions.NOT_FOUND, - 'recoverable': exceptions.RECOVERABLE, - 'unauthorized': exceptions.UNAUTHORIZED, -} diff --git a/trove_dashboard/enabled/__init__.py b/trove_dashboard/enabled/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/exceptions.py b/trove_dashboard/exceptions.py deleted file mode 100644 index e5ea809..0000000 --- a/trove_dashboard/exceptions.py +++ /dev/null @@ -1,29 +0,0 @@ -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 troveclient import exceptions as troveclient - - -UNAUTHORIZED = ( - troveclient.Unauthorized, -) - - -NOT_FOUND = ( - troveclient.NotFound, -) - - -RECOVERABLE = ( - troveclient.ClientException, -) diff --git a/trove_dashboard/locale/cs/LC_MESSAGES/django.po b/trove_dashboard/locale/cs/LC_MESSAGES/django.po deleted file mode 100644 index 354e4d9..0000000 --- a/trove_dashboard/locale/cs/LC_MESSAGES/django.po +++ /dev/null @@ -1,1244 +0,0 @@ -# Lenka Husáková , 2016. #zanata -# Stanislav Ulrych , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 8.0.0.0b3.dev9\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-01-10 19:59+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-06-14 12:02+0000\n" -"Last-Translator: Stanislav Ulrych \n" -"Language-Team: Czech\n" -"Language: cs\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s RAM | %(instances)s instancí" - -msgid "-" -msgstr "-" - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -"Nezapomeňte prosím: Hodnota zadaná v poli Velikost svazku " -"by měla být větší než 0. Některé konfigurace ale neodporují zadání velikosti " -"svazku. Pokud zadání velikosti má za následek chybu uvádějící, že podpora " -"velikosti svazku není povolena, pak zadejte 0." - -msgid "A backup must be selected!" -msgstr "Musíte vybrat zálohu." - -msgid "A master instance must be selected!" -msgstr "Musíte vybrat hlavní instanci." - -msgid "A new name or new password or new host must be specified." -msgstr "Musí být zvolen nový název, nové heslo nebo nový hostitel." - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "Přístup zrušen do" -msgstr[1] "Přístupy zrušeny do" -msgstr[2] "Přístupy zrušeno do" - -msgid "Accessible" -msgstr "Přístupné" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "Aktivní" - -msgid "Add" -msgstr "Přidat" - -msgid "Add Instance" -msgstr "Přidat instanci" - -msgid "Advanced" -msgstr "Pokročilé" - -msgid "Allowed Host" -msgstr "Povolený hostitel" - -msgid "Allowed Host (optional)" -msgstr "Povolený hostitel (nepovinné)" - -msgid "Applicable only if the volume size is specified." -msgstr "Aplikovatelný pouze pokud velikost svazku je zadána." - -msgid "At least one of the new fields must be changed." -msgstr "Alespoň jedno z nových polí musí být změněno." - -msgid "Available networks" -msgstr "Dostupné sítě" - -msgid "Backup" -msgstr "Záloha" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "Záloha" - -msgid "Backup Database" -msgstr "Zálohovat databázi" - -msgid "Backup Details" -msgstr "Podrobnosti zálohy" - -msgid "Backup Details: {{ backup.name }}" -msgstr "Podrobnosti zálohy: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "Životnost zálohy" - -msgid "Backup File" -msgstr "Zálohovat soubor" - -msgid "Backup File Location" -msgstr "Umístění souboru zálohy" - -msgid "Backup Name" -msgstr "Název zálohy" - -msgid "Backup Overview" -msgstr "Přehled záloh" - -msgid "Backups" -msgstr "Zálohy" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "Blokováno" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "Sestavování" - -msgctxt "Current status of a Database Instance" -msgid "Building" -msgstr "Sestavování" - -msgid "Cancel" -msgstr "Zrušit" - -#, python-format -msgid "Cannot disable root access: %s" -msgstr "Nelze zakázat root přístup: %s" - -msgid "Cannot grow cluster. No instances specified." -msgstr "Nelze zvětšit cluster. Instance nebyly zadány." - -msgid "Character Set" -msgstr "Znaková sada" - -msgid "Choose a new instance flavor." -msgstr "Zvolte nový typ instance." - -msgid "Choose initial state." -msgstr "Zvolte výchozí stav." - -msgid "Close" -msgstr "Zavřít" - -msgid "Cluster Name" -msgstr "Název clusteru" - -msgid "Cluster Size" -msgstr "Velikost clusteru" - -msgid "Clusters" -msgstr "Clustery" - -msgid "Collation" -msgstr "Collation" - -msgid "Comma separated list of databases to create" -msgstr "Čárkami oddělený seznam databází pro vytvoření" - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "Dokončené" - -msgid "" -"Confirm the current replica is to be promoted as the new replica source." -msgstr "Potvrdit, že současná replika bude povýšena na nový zdroj repliky." - -msgid "Connection Examples" -msgstr "Příklady připojení" - -msgid "Connection Information" -msgstr "Informace o připojení" - -msgid "Container" -msgstr "Kontejner" - -msgid "Create Backup" -msgstr "Vytvořit zálohu" - -msgid "Create Database" -msgstr "Vytvořit databázi" - -msgid "Create User" -msgstr "Vytvořit uživatele" - -msgid "Created" -msgstr "Vytvořeno" - -#, python-format -msgid "Created database \"%s\"." -msgstr "Vytvořena databáze \"%s\"." - -#, python-format -msgid "Created user \"%s\"." -msgstr "Vytvořen uživatel \"%s\"." - -msgid "Current Replica" -msgstr "Současná replika" - -msgid "Current Replica Source" -msgstr "Současný zdroj repliky" - -msgid "Current Size (GB)" -msgstr "Současná velikost (GB)" - -msgid "Current Task" -msgstr "Současný úkol" - -msgid "DATABASE" -msgstr "DATABÁZE" - -msgid "Database" -msgstr "Databáze" - -msgid "Database Access" -msgstr "Databázový přístup" - -msgid "Database Access for: {{ user_name }}" -msgstr "Databázový přístup pro: {{ user_name }}" - -msgid "Database Backups" -msgstr "Zálohy databáze" - -msgid "Database Info" -msgstr "Informace o databázi" - -msgid "Database Instance" -msgstr "Instance databáze" - -msgid "Database Name" -msgstr "Název databáze" - -msgid "Database Port" -msgstr "Port databáze" - -msgid "Databases" -msgstr "Databáze" - -msgid "Datastore" -msgstr "Datové úložiště" - -msgid "Datastore Version" -msgstr "Verze datového úložiště" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "Smazat zálohu" -msgstr[1] "Smazat zálohy" -msgstr[2] "Smazat zálohy" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "Smazat cluster" -msgstr[1] "Smazat clustery" -msgstr[2] "Smazat clustery" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "Smazat databázi" -msgstr[1] "Smazat databáze" -msgstr[2] "Smazat databáze" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "Smazání selhalo" - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "Smazat instanci" -msgstr[1] "Smazat instance" -msgstr[2] "Smazat instance" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "Smazat uživatele" -msgstr[1] "Smazat uživatele" -msgstr[2] "Smazat uživatele" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "Záloha smazána" -msgstr[1] "Zálohy smazány" -msgstr[2] "Zálohy smazány" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "Databáze smazána" -msgstr[1] "Databáze smazány" -msgstr[2] "Databáze smazány" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "Uživatel smazán" -msgstr[1] "Uživatelé smazáni" -msgstr[2] "Uživatelé smazáni" - -msgid "Deleted cluster is not recoverable." -msgstr "Smazaný cluster nelze obnovit" - -msgid "Deleted instances are not recoverable." -msgstr "Smazané instance nelze obnovit." - -msgid "Description" -msgstr "Popis" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "Odpojit repliku" -msgstr[1] "Odpojit repliky" -msgstr[2] "Odpojit repliky" - -msgid "Details" -msgstr "Podrobnosti" - -msgid "Disable Log" -msgid_plural "Disable Logs" -msgstr[0] "Zakázat log" -msgstr[1] "Zakázat logy" -msgstr[2] "Zakázat logy" - -msgid "Disable Root" -msgstr "Zakázat root." - -msgid "Disabled Log" -msgid_plural "Disabled Logs" -msgstr[0] "Log zakázán" -msgstr[1] "Logy zakázány" -msgstr[2] "Logy zakázány" - -msgid "Discard Log" -msgid_plural "Discard Logs" -msgstr[0] "Vyřadit log" -msgstr[1] "Vyřadit logy" -msgstr[2] "Vyřadit logy" - -msgid "Discarded Log" -msgid_plural "Discarded Logs" -msgstr[0] "Log vyřezen" -msgstr[1] "Logy vyřazeny" -msgstr[2] "Logy vyřazeny" - -msgid "Download" -msgstr "Stáhnout" - -msgid "Download Backup" -msgstr "Stáhnout zálohu" - -msgid "Edit User" -msgstr "Upravit uživatele" - -msgid "Eject Replica Source" -msgid_plural "Eject Replica Sources" -msgstr[0] "Vysunout zdroj repliky" -msgstr[1] "Vysunout zdroje repliky" -msgstr[2] "Vysunout zdroje repliky" - -msgid "Ejected Replica Source" -msgid_plural "Ejected Replica Sources" -msgstr[0] "Zdroj repliky odpojen" -msgstr[1] "Zdroje repliky odpojen" -msgstr[2] "Zdroje repliky odpojit" - -msgid "Enable Log" -msgid_plural "Enable Logs" -msgstr[0] "Povolit log" -msgstr[1] "Povolit logy" -msgstr[2] "Povolit logy" - -msgid "Enable Root" -msgstr "Povolit root" - -msgid "Enabled Log" -msgid_plural "Enabled Logs" -msgstr[0] "Log povolen" -msgstr[1] "Logy povoleny" -msgstr[2] "Logy povoleny" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "Chyba" - -msgid "Error creating database backup." -msgstr "Chyba při vytváření zálohy databáze." - -msgid "Error deleting database on instance." -msgstr "Chyba při mazání databáze v instanci." - -#, python-format -msgid "Error downloading log file: %s" -msgstr "Chyba při stahování log souboru: %s" - -msgid "Error getting database backup list." -msgstr "Chyba při získávání seznamu záloh databáze." - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "Selhalo" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "Selhalo" - -msgid "Flavor" -msgstr "Typ" - -msgid "GB" -msgstr "GB" - -msgid "Go" -msgstr "Přejít" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "Povolit přístup" -msgstr[1] "Povolit přístupy" -msgstr[2] "Povolit přístupy" - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "Přístup povolen do" -msgstr[1] "Přístupy povoleny do" -msgstr[2] "Přístupy povoleny do" - -msgid "Grow Cluster" -msgstr "Zvětšit cluster" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "Zvětšit cluster: {{cluster_name}}" - -msgid "Has Root Ever Been Enabled" -msgstr "Byl někdy povolen root" - -msgid "Host" -msgstr "Hostitel" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "Hostitel nebo IP, ze které se uživatel může připojit." - -msgid "ID" -msgstr "ID" - -msgid "Incremental" -msgstr "Přírůstková" - -msgid "Incremental Backup" -msgstr "Přírůstková záloha" - -msgid "Information" -msgstr "Informace" - -msgid "Initial Admin User" -msgstr "Výchozí účet správce" - -msgid "Initial Databases" -msgstr "Výchozí databáze" - -msgid "Initial Volume Size" -msgstr "Počáteční velikost svazku" - -msgid "Initial admin user to add" -msgstr "Výchozí účet správce pro přidání" - -msgid "Initialize Databases" -msgstr "Inicializovat databáze" - -msgid "Instance Name" -msgstr "Název instance" - -msgid "Instance Type" -msgstr "Typ instance" - -msgid "Instances" -msgstr "Instance" - -msgid "Is a Replica Of" -msgstr "Je replikou " - -msgid "Launch" -msgstr "Spustit" - -msgid "Launch Cluster" -msgstr "Spustit cluster" - -msgid "Launch Database" -msgstr "Spustit databázi" - -msgid "Launch Instance" -msgstr "Spustit instanci" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "Spuštěno %(count)s pojmenovaných \"%(name)s\"." - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "Cluster \"%s\" spuštěn" - -msgid "Log" -msgstr "Log" - -msgid "Log Contents" -msgstr "Obsah logu" - -msgid "Log Length" -msgstr "Délka logu" - -msgid "Log length must be a nonnegative integer." -msgstr "Délka logu musí být nezáporné celé číslo." - -msgid "Log: " -msgstr "Log: " - -msgid "Logs" -msgstr "Logy" - -msgid "Manage Access" -msgstr "Spravovat přístup" - -msgid "Manage Root" -msgstr "Spravovat root" - -msgid "Manage Root Access" -msgstr "Spravovat root přístup" - -msgid "Management Console" -msgstr "Správcovská konzole" - -msgid "Master Instance Name" -msgstr "Název hlavní instance" - -msgid "Name" -msgstr "Jméno" - -msgid "Network" -msgstr "Síť" - -msgid "Network attached to instance." -msgstr "Síť připojená k instanci." - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "Nový" - -msgid "New Flavor" -msgstr "Nový typ" - -msgid "New Host" -msgstr "Nový hostitel" - -msgid "New Name" -msgstr "Nový název" - -msgid "New Password" -msgstr "Nové heslo" - -msgid "New Size (GB)" -msgstr "Nová velkost (GB)" - -msgid "New password for cluster access." -msgstr "Nové heslo pro přístup ke clusteru" - -msgid "New size for volume must be greater than current size." -msgstr "Nová velikost svazku musí být větší než současná." - -msgid "No backups available" -msgstr "Žádné zálohy nejsou dostupné" - -msgid "No flavors available" -msgstr "Typy nejsou dostupné" - -msgid "No instances available" -msgstr "Žádné dostupné instance" - -msgid "No volume type" -msgstr "Žádný typ svazku" - -msgid "None" -msgstr "Žádný" - -msgid "Not Assigned" -msgstr "Nepřiděleno" - -msgid "Not Found" -msgstr "Nenalezeno" - -msgid "Not available" -msgstr "Není dostupné" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "" -"Poznámka: Povolí root přístup do instance. Pokud root uživatel je již " -"povolen, bude vygenerováno nové heslo." - -msgid "Number of Instances" -msgstr "Počet instancí" - -msgid "Number of Shards" -msgstr "Počet částí" - -msgid "Number of instances in the cluster." -msgstr "Počet instancí v clusteru." - -msgid "Number of instances in the cluster. (Read only)" -msgstr "Počet instanci v clusteru (pouze pro čtení)." - -msgid "Number of shards. (Read only)" -msgstr "Počet částí. (Pouze pro čtení)" - -msgid "Old Flavor" -msgstr "Původní typ" - -msgid "Optional Backup Description" -msgstr "Nepovinný popis zálohy" - -msgid "Optional character set for the database." -msgstr "Volitelná znaková sada pro databázi." - -msgid "Optional collation type for the database." -msgstr "Collation databáze (volitelné)." - -msgid "Optional comma separated list of databases user has access to." -msgstr "" -"Volitelný, čárkami oddělený seznam databází, do kterého má uživatel přístup." - -msgid "Optional datastore specific type of the instance." -msgstr "Typ instance specifický pro uložiště (volitelné)." - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "" -"Specifická hodnota volitelného datového uložiště, která definuje vztah z " -"jedné instance v clusteru do jiné instance." - -msgid "Optional host of user." -msgstr "Volitelný hostitel pro uživatele." - -msgid "Optional name of the instance." -msgstr "Volitelné jméno instance." - -msgid "Optional parent backup" -msgstr "Nepovinná nadřazená záloha" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "" -"Můžete vytvořit databázi pomocí předchozí zálohy, nebo jako repliku jiné " -"instance databáze." - -msgid "Optionally provide a character set and collation for the database." -msgstr "Zvolit znakovou sadu a collation databáze (volitelné)." - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "Lze zadat nepovinný, čárkami oddělený seznam databází pro vytvoření:" - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "" -"Volitelně zadat uživatelova hostitele a seznam databází, do kterých má " -"uživatel přístup." - -msgid "Overview" -msgstr "Přehled" - -msgid "PASSWORD" -msgstr "HESLO" - -msgid "Parent Backup" -msgstr "Nadřazená záloha" - -msgid "Password" -msgstr "Heslo" - -msgid "Password (required)" -msgstr "Heslo (povinné)" - -msgid "Password for root user must be specified." -msgstr "Heslo pro uživatele root musí být zadáno." - -msgid "Password for root user." -msgstr "Heslo pro root uživatele." - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "" -"Heslo je viditelné pouze bezprostředně po povolení nebo resetování root." - -msgid "" -"Please note: The new value must be greater than the existing volume " -"size." -msgstr "" -"Nezapomeňte prosím: Nová hodnota musí být větší nebo rovna " -"velikosti původního svazku." - -msgid "Promote" -msgstr "Povýšení" - -msgid "Promote to Replica Source" -msgstr "Povýšení zdroje repliky" - -#, python-format -msgid "Promoted replica \"%s\" as the new replica source." -msgstr "Povýšení repliky \"%s\" na nový zdroj repliky." - -msgid "Publish" -msgstr "Zveřejnit" - -msgid "Publish Log" -msgid_plural "Publish Logs" -msgstr[0] "Zveřejnit log" -msgstr[1] "Zveřejnit logy" -msgstr[2] "Zveřejnit logy" - -msgid "Publishable (bytes)" -msgstr "Publikovatelný (bytů)" - -msgid "Published (bytes)" -msgstr "Zvěřejněno (bajty)" - -msgid "Published Log" -msgid_plural "Published Logs" -msgstr[0] "Log zveřejněn" -msgstr[1] "Logy zveřejněny" -msgstr[2] "Logy zveřejněny" - -msgid "RAM" -msgstr "RAM" - -msgctxt "Current status of a Database Instance" -msgid "Rebooting" -msgstr "Restartování" - -msgid "Related To" -msgstr "Vztahující se k" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "Odstranit instanci" -msgstr[1] "Odstranit instance" -msgstr[2] "Odstranit instance" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "Instance smazána" -msgstr[1] "Instance smazány" -msgstr[2] "Instancí smazáno" - -msgid "Removed instances from cluster." -msgstr "Instance z clusteru odstraněny." - -msgid "Replica Count" -msgstr "Počet replik" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "Replika odpojena" -msgstr[1] "Repliky odpojeny" -msgstr[2] "Repliky odpojeny" - -msgid "Replicas" -msgstr "Repliky" - -msgid "Replicate from Instance" -msgstr "Replikovat z instance" - -msgid "Replication" -msgstr "Replikace" - -msgid "Reset Root Password" -msgstr "Resetovat root heslo" - -msgid "Resize Database Instance" -msgstr "Změnit velikost instance databáze" - -msgid "Resize Database Volume" -msgstr "Změnit velikost svazku databáze" - -msgid "Resize Instance" -msgstr "Změnit velikost instance" - -msgid "Resize Volume" -msgstr "Změnit velikost svazku" - -msgctxt "Current status of a Database Instance" -msgid "Resizing" -msgstr "Změna velikosti" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "Změna velikosti instance \"%s\"" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "Měnění velikosti svazku \"%s\"" - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "Restartovat instanci" -msgstr[1] "Restartovat instance" -msgstr[2] "Restartovat instance" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "Vyžadován restart" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "Instance restartována" -msgstr[1] "Instance restartovány" -msgstr[2] "Instance restartovány" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "" -"Restartované instance ztratí veškerá data, jenž nejsou uložená v trvalém " -"úložišti." - -msgid "Restore Backup" -msgstr "Obnovit zálohu" - -msgid "Restore from Backup" -msgstr "Obnovit ze zálohy" - -msgid "Return to Log List" -msgstr "Návrat do seznamu logů" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "Zrušit přístup" -msgstr[1] "Zrušit přístupy" -msgstr[2] "Zrušit přístupy" - -msgid "Root Enabled" -msgstr "Root povolen" - -msgid "Root Password" -msgstr "Heslo pro root uživatele" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "Root heslo pro cluster \"%s\" aktualizováno" - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "Ukládání" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "Zmenšení clusteru naplánováno" -msgstr[1] "Zmenšení clusterů naplánováno" -msgstr[2] "Zmenšení clusterů naplánováno" - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "Naplánována záloha \"%(name)s\"." - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "Smazání clusteru naplánováno" -msgstr[1] "Smazání clusterů naplánováno" -msgstr[2] "Smazání clusterů naplánováno" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "Smazání instance naplánováno" -msgstr[1] "Smazání instancí naplánováno" -msgstr[2] "Smazání instancí naplánováno" - -msgid "Scheduled growing of cluster." -msgstr "Zvětšení clusteru naplánováno." - -msgid "Select a backup to restore" -msgstr "Vyberte zálohu pro obnovení" - -msgid "Select a master instance" -msgstr "Vyberte hlavní instanci" - -msgid "Select a new flavor" -msgstr "Vyberte nový typ" - -msgid "Select backup" -msgstr "Vyberte zálohu" - -msgid "Select datastore type and version" -msgstr "Vyberte typ datového úložiště a verzi" - -msgid "Select instance" -msgstr "Vyberte instanci" - -msgid "Select parent backup" -msgstr "Vyberte nadřazenou zálohu" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "Vyberte instance, které budou odebrány z clusteru." - -msgid "Selected networks" -msgstr "Vybrané sítě" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "Zmenšit cluster" -msgstr[1] "Zmenšit clustery" -msgstr[2] "Zmenšit clustery" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "Zmenšit cluster: {{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "Zmenšení clusteru je nevratné." - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "Vypnout" - -msgid "Size" -msgstr "Velikost" - -msgid "Size of image to launch." -msgstr "Velikost obrazu pro spuštění." - -msgid "Size of instance to launch." -msgstr "Velikost instance pro spuštění." - -msgid "Size of the volume in GB." -msgstr "Velikost svazku v GB." - -msgid "Source for Initial State" -msgstr "Zdroj výchozího stavu" - -msgid "Specify a new flavor for the database instance." -msgstr "Zadejte nový typ instance databáze." - -msgid "Specify a new name, new password or new host name for the user." -msgstr "" -"Zadejte nové jméno, nové heslo nebo nové jméno hostitele pro uživatele." - -msgid "Specify the details for launching an instance." -msgstr "Zadejte podrobnosti spuštění instance." - -msgid "Specify the details for the database backup." -msgstr "Zadejte podrobnosti zálohy databáze." - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "Zadejte detaily instancí pro přidání do clusteru." - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"Zadejte instance pro přidání do clusteru. Po zadání všech instancí klikněte " -"na tlačítko 'Zvětšit cluster' pro zahájení operace." - -msgid "Specify the name of the new database." -msgstr "Zadejte název nové databáze." - -msgid "Specify the name of the new user and password." -msgstr "Zadejte jméno a heslo pro nového uživatele." - -msgid "Specify the new root password for vertica cluster." -msgstr "Zadejte nové root heslo pro vertica cluster." - -msgid "Specify the new volume size for the database instance." -msgstr "Zadejte novou velikost svazku instance databáze." - -msgid "Specify the number of replicas to be created" -msgstr "Zadejte počet replik pro vytvoření" - -msgid "Specs" -msgstr "Specifikace" - -msgid "Status" -msgstr "Stav" - -msgid "Status if root was ever enabled for an instance." -msgstr "Stav, zda byl root povolen pro instanci" - -msgid "Successfully disabled root access." -msgstr "Úspěšně zakázán přístup root." - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"Pole 'Typ instance' a 'Týkající se' jsou specifické vzhledem k úložišti a " -"jsou volitelné. Viz dokumentace Trove pro více informací o použití těchto " -"polí." - -msgid "The flavor must be specified." -msgstr "Typ musí být zadaný." - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "" -"Pole jméno je volitelné. Pokud je prázdné, bude generováno při vytvoření " -"clusteru." - -msgid "The number of instances must be greater than 1." -msgstr "Počet instancí musí být větší než 1." - -msgid "The number of shards must be greater than 1." -msgstr "Počet částí musí být větší než 1." - -msgid "There was a problem enabling root." -msgstr "Při povolování uživatele root se vyskytl problém." - -msgid "This action cannot be undone." -msgstr "Toto nelze vrátit." - -msgid "Type" -msgstr "Typ" - -msgid "Type and version of datastore." -msgstr "Typ a verze datového úložiště" - -msgid "USERNAME" -msgstr "UŽIVATELSKÉ JMÉNO" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Nelze %(action)s: %(objs)s" - -#, python-format -msgid "Unable to create database. %s" -msgstr "Nelze vytvořit databázi. %s" - -#, python-format -msgid "Unable to create user. %s" -msgstr "Nelze vytvořit uživatele. %s" - -msgid "Unable to determine if instance root is enabled." -msgstr "Nelze zjistit, zda je root přístup do instance povolen." - -msgid "Unable to find backup!" -msgstr "Nelze najít zálohu." - -msgid "Unable to find master instance!" -msgstr "Nelze najít hlavní instanci." - -msgid "Unable to get database backup data." -msgstr "Nelze získat data zálohy databáze." - -msgid "Unable to get databases data." -msgstr "Nelze získat data databáze." - -msgid "Unable to get instances data." -msgstr "Nelze získat data instance." - -msgid "Unable to get user access data." -msgstr "Nelze získat přístupová data uživatele." - -msgid "Unable to get user data." -msgstr "Nelze získat data uživatele." - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "Nelze zvětšit cluster. %s" - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "Nelze zvětšit cluster: %s" - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "Nelze spustit %(count)s pojmenovaných \"%(name)s\"." - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "Nelze spustit cluster. %s" - -msgid "Unable to list database backups for parent." -msgstr "Nelze vypsat zálohy databáze pro nadřazenou zálohu." - -msgid "Unable to list database instances to backup." -msgstr "Nelze vypsat instance databáze k zálohování." - -msgid "" -"Unable to load {0} log\n" -"{1}" -msgstr "" -"Nelze načíst {0} log.\n" -"{1}" - -msgid "Unable to load {0} log for instance \"{1}\"." -msgstr "Nelze načíst {0} log pro instanci \"{1}\"." - -msgid "Unable to obtain datastore versions." -msgstr "Nelze získat verze datových úložišť." - -msgid "Unable to obtain datastores." -msgstr "Nelze získat datová úložiště." - -msgid "Unable to obtain flavors." -msgstr "Nelze získat typy." - -msgid "Unable to obtain information on root user" -msgstr "Nelze získat informace o root uživateli" - -#, python-format -msgid "Unable to promote replica as the new replica source. \"%s\"" -msgstr "Repliku nelze povýšit na novou zdroj repliky. \"%s\"" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "Nelze odebrat instance z clusteru: %s." - -#, python-format -msgid "Unable to reset password. %s" -msgstr "Nelze resetovat heslo. %s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "Nelze změnit velikost instance. %s" - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "Nelze změnit velikost svazku. %s" - -msgid "Unable to retrieve accessible databases." -msgstr "Nelze získat dostupné databáze." - -msgid "Unable to retrieve cluster details." -msgstr "Nelze získat podrobnosti clusteru." - -msgid "Unable to retrieve database clusters." -msgstr "Nelze získat databázové clustery." - -msgid "Unable to retrieve database instances." -msgstr "Nelze získat instance databáze." - -msgid "Unable to retrieve database size information." -msgstr "Nelze získat informace o velikosti databáze." - -msgid "Unable to retrieve databases." -msgstr "Nelze získat databáze. " - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "Nelze získat podrobnosti zálohy: %s." - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "Nelze získat podrobnosti databázového clusteru: %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "Nelze získat detaily pro instance databáze: %s" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "Nelze získat podrobnosti nadřazené zálohy: %s" - -msgid "Unable to retrieve flavors." -msgstr "Nelze získat typy." - -msgid "Unable to retrieve instance details." -msgstr "Nelze získat podrobnosti instance." - -#, python-format -msgid "" -"Unable to retrieve list of logs.\n" -"%s" -msgstr "" -"Nelze získat seznam logů.\n" -"%s" - -msgid "Unable to retrieve networks." -msgstr "Nelze získat sítě." - -#, python-format -msgid "Unable to update user. %s" -msgstr "Nelze aktualizovat uživatele. %s" - -msgid "Unknown" -msgstr "Neznámý" - -msgid "Updated" -msgstr "Aktualizováno" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "Uživatel aktualizován \"%s\"." - -msgid "User Name" -msgstr "Uživatelské jméno" - -msgid "Username (required)" -msgstr "Uživatelské jméno (povinné)" - -msgid "Users" -msgstr "Uživatelé" - -msgid "View Full Log" -msgstr "Zobrazit celý log" - -msgid "View Log" -msgstr "Zobrazit log" - -msgid "Volume" -msgstr "Svazek" - -msgid "Volume Size" -msgstr "Velikost svazku" - -msgid "Volume Type" -msgstr "Typ svazku" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "Nemáte oprávnění pro %(action)s: %(objs)s" - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"Přírůstkovou zálohu můžete provést zadáním nadřazené zálohy. " -"Nezapomeňte ale, že ne všechny databáze podporují " -"přírůstkové zálohy a v takových případech operace selže s chybou." - -msgid "You must select a datastore type and version." -msgstr "Musíte vybrat typ datového úložiště a verzi." - -msgid "You must specify a password if you create a user." -msgstr "Při vytváření uživatele musíte zadat heslo." - -msgid "You must specify at least one database if you create a user." -msgstr "Při vytváření uživatele musíte zadat alespoň jednu databázi." - -msgid "instance" -msgstr "instance" diff --git a/trove_dashboard/locale/de/LC_MESSAGES/django.po b/trove_dashboard/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index d17ff45..0000000 --- a/trove_dashboard/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,1507 +0,0 @@ -# Andreas Jaeger , 2016. #zanata -# Frank Kloeker , 2016. #zanata -# Robert Simai , 2016. #zanata -# Robert Simai , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 9.0.0.0b2.dev2\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-05-12 11:33+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-01 04:35+0000\n" -"Last-Translator: Robert Simai \n" -"Language-Team: German\n" -"Language: de\n" -"X-Generator: Zanata 3.9.6\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s RAM | %(instances)s Instanzen" - -msgid "-" -msgstr "-" - -msgid "" -"Please note: It may be necessary to reboot the database " -"instance for this new configuration group to take effect." -msgstr "" -"Bitte beachten Sie: Es kann notwendig sein, die " -"Datenbankinstanz zur Übernahme der neuen Konfiguration neu zu starten." - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -"Zur Beachtung: Der Wert im Feld Datenträgergröße sollte im " -"Allgemeinen größer als 0 sein. Einige Konfigurationen unterstützen die " -"Angabe der Datenträgergröße jedoch nicht. Falls bei der Eingabe der " -"Datenträgergröße ein Fehler ausgegeben wird, wie Datenträgerunterstützung " -"nicht aktiviert, geben Sie 0 ein." - -msgid "A backup must be selected!" -msgstr "Es muss eine Sicherungskopie ausgewählt werden!" - -msgid "A master instance must be selected!" -msgstr "Es muss eine Master-Instanz ausgewählt werden!" - -msgid "A new name or new password or new host must be specified." -msgstr "" -"Ein neuer Name oder ein neues Passwort oder ein neuer Host muss angegeben " -"werden." - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "Zugriff widerrufen für" -msgstr[1] "Zugriff widerrufen für" - -msgid "Accessible" -msgstr "Verfügbar" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "Aktiv" - -msgid "Add" -msgstr "Hinzufügen" - -msgid "Add Instance" -msgstr "Füge Instanz hinzu" - -msgid "Add Parameter" -msgstr "Parameter hinzufügen" - -msgid "" -"Add parameters to the configuration group. When all the parameters are " -"added click 'Apply Changes' to persist changes." -msgstr "" -"Füge Parameter zur Gruppenkonfiguration hinzu. Wenn alle Parameter " -"hinzugefügt sind, klicke \"Änderungen übernehmen\" für dauerhafte Änderungen." - -msgid "Advanced" -msgstr "Erweitert" - -msgid "" -"Allow the user to connect from this host only. If not provided this user " -"will be allowed to connect from anywhere." -msgstr "" -"Erlauben Sie dem Benutzer sich nur von diesem Host zu verbinden. Ohne Angabe " -"darf der Benutzer sich von überall verbinden." - -msgid "Allowed Host" -msgstr "Erlaubter Host" - -msgid "Allowed Host (optional)" -msgstr "Erlaubter Host (optional)" - -msgid "Any Availability Zone" -msgstr "Irgendeine Verfügbarkeitszone" - -msgid "Applicable only if the volume size is specified." -msgstr "Nur anwendbar wenn die Datenträgergrösse angegeben ist." - -msgid "Applied changes to server" -msgstr "Angewandte Änderungen zum Server" - -msgid "Apply Changes" -msgstr "Änderungen anwenden" - -msgid "At least one of the new fields must be changed." -msgstr "Mindestens eines der neuen Felder muss geändert werden." - -msgid "Attach Configuration Group" -msgstr "Konfigurationsgruppe angehangen" - -#, python-format -msgid "Attaching Configuration group \"%s\"" -msgstr "Angehängte Konfigurationsgruppe \"%s\"" - -msgid "Availability Zone" -msgstr "Verfügbarkeitszone" - -msgid "Available networks" -msgstr "Verfügbare Netzwerke" - -msgid "Backup" -msgstr "Sicherungskopie" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "Sicherungskopie" - -msgid "Backup Database" -msgstr "Datenbank sichern" - -msgid "Backup Details" -msgstr "Sicherungskopie Details" - -msgid "Backup Details: {{ backup.name }}" -msgstr "Sicherungskopie Details: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "Dauer der Sicherung" - -msgid "Backup File" -msgstr "Sicherungsdatei" - -msgid "Backup File Location" -msgstr "Speicherort der Sicherungskopie" - -msgid "Backup Name" -msgstr "Name der Sicherung" - -msgid "Backup Overview" -msgstr "Sicherungskopie Übersicht" - -msgid "Backups" -msgstr "Sicherungskopien" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "Blockiert" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "Bauend" - -msgctxt "Current status of a Database Instance" -msgid "Building" -msgstr "Bauend" - -msgid "Cancel" -msgstr "Abbrechen" - -#, python-format -msgid "Cannot disable root access: %s" -msgstr "Konnte Root Zugriff nicht deaktivieren: %s" - -msgid "Cannot grow cluster. No instances specified." -msgstr "Cluster kann nicht vergrößert werden. Keine Instanzen angegeben." - -msgid "Character Set" -msgstr "Zeichensatz" - -msgid "Choose a new instance flavor." -msgstr "Neue Variante für die Instanz auswählen." - -msgid "Choose initial state." -msgstr "Initialen Status auswählen." - -msgid "Close" -msgstr "Schließen" - -msgid "Cluster Name" -msgstr "Cluster Name" - -msgid "Cluster Size" -msgstr "Clustergröße" - -msgid "Clusters" -msgstr "Cluster" - -msgid "Collation" -msgstr "Kollation" - -msgid "Comma separated list of databases to create" -msgstr "Kommaseparierte Liste von zu erzeugenden Datenbanken" - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "Abgeschlossen" - -msgid "Configuration Defaults" -msgstr "Konfigurationsdetails" - -msgid "Configuration Group" -msgstr "Konfigurationsgruppe" - -msgid "Configuration Group Details: {{configuration.name}}" -msgstr "Gruppenkonfigurationsdetails: {{configuration.name}}" - -msgid "Configuration Group Instances" -msgstr "Konfiguration der Gruppeninstanzen" - -msgid "Configuration Group Name" -msgstr "Name der Konfigurationsgruppe" - -msgid "Configuration Group Overview" -msgstr "Konfigurationsgruppenübersicht" - -msgid "Configuration Group Values" -msgstr "Werte der Konfigurationsgruppe" - -msgid "Configuration Groups" -msgstr "Konfigurationsgruppe" - -msgid "" -"Confirm the current replica is to be promoted as the new replica source." -msgstr "" -"Bestätige das derzeitige Replika zur Beförderung als neue Replika-Quelle." - -msgid "Connection Examples" -msgstr "Verbindungsbeispiele" - -msgid "Connection Information" -msgstr "Verbindungsinformationen" - -msgid "Container" -msgstr "Container" - -msgid "Create Backup" -msgstr "Sicherungskopie erstellen" - -msgid "Create Configuration Group" -msgstr "Erzeuge Konfigurationsgruppe" - -msgid "Create Database" -msgstr "Erzeuge Datenbank" - -msgid "Create User" -msgstr "Benutzer erstellen" - -msgid "" -"Create an optional initial user. This user will have access to all databases " -"you create." -msgstr "" -"Erzeugen Sie einen optionalen initialen Benutzer. Dieser Benutzer hat " -"Zugriff auf die Datenbank, die Sie erstellen." - -msgid "Created" -msgstr "Erstellt" - -msgid "Created configuration group" -msgstr "Neue Konfigurationsgruppe wurde erstellt" - -#, python-format -msgid "Created database \"%s\"." -msgstr "Datenbank \"%s\" erstellt." - -#, python-format -msgid "Created user \"%s\"." -msgstr "Benutzer \"%s\" angelegt." - -msgid "Current Replica" -msgstr "Derzeitiges Replika" - -msgid "Current Replica Source" -msgstr "Derzeitige Replika-Quelle" - -msgid "Current Size (GB)" -msgstr "Aktuelle Größe (GB)" - -msgid "Current Task" -msgstr "Aktuelle Aufgabe" - -msgid "DATABASE" -msgstr "DATENBANK" - -msgid "Database" -msgstr "Datenbank" - -msgid "Database Access" -msgstr "Datenbankzugriff" - -msgid "Database Access for: {{ user_name }}" -msgstr "Datenbankzugriff für: {{ user_name }}" - -msgid "Database Backups" -msgstr "Datenbanksicherungen" - -msgid "Database Info" -msgstr "Datenbank Info" - -msgid "Database Instance" -msgstr "Datenbankinstanz" - -msgid "Database Name" -msgstr "Datenbank Name" - -msgid "Database Port" -msgstr "Datenbankport" - -msgid "Databases" -msgstr "Datenbanken" - -msgid "Datastore" -msgstr "Datenspeicher" - -msgid "Datastore Version" -msgstr "Version des Datenspeichers" - -msgid "Defaults" -msgstr "Voreinstellungen" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "Sicherungskopie löschen" -msgstr[1] "Sicherungskopien löschen" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "Cluster löschen" -msgstr[1] "Cluster löschen" - -msgid "Delete Configuration Group" -msgid_plural "Delete Configuration Groups" -msgstr[0] "Konfigurationsgruppe löschen" -msgstr[1] "Konfigurationsgruppen löschen" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "Datenbank löschen" -msgstr[1] "Datenbanken löschen" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "Löschvorgang fehlgeschlagen" - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "Instanz löschen" -msgstr[1] "Instanzen löschen" - -msgid "Delete Parameter" -msgid_plural "Delete Parameters" -msgstr[0] "Parameter löschen" -msgstr[1] "Parameter löschen" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "Benutzer löschen" -msgstr[1] "Benutzer löschen" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "Gelöschte Sicherungskopie" -msgstr[1] "Gelöschte Sicherungskopien" - -msgid "Deleted Configuration Group" -msgid_plural "Deleted Configuration Groups" -msgstr[0] "Gelöschte Konfigurationsgruppe" -msgstr[1] "Gelöschte Konfigurationsgruppen" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "Gelöschte Datenbank" -msgstr[1] "Gelöschte Datenbanken" - -msgid "Deleted Parameter" -msgid_plural "Deleted Parameters" -msgstr[0] "Gelöschter Parameter" -msgstr[1] "Gelöschte Parameter" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "Gelöschter Benutzer" -msgstr[1] "Gelöschte Benutzer" - -msgid "Deleted cluster is not recoverable." -msgstr "Ein gelöschter Cluster kann nicht wiederhergestellt werden." - -msgid "Deleted instances are not recoverable." -msgstr "Gelöschte Instanzen können nicht wiederhergestellt werden." - -msgid "Description" -msgstr "Beschreibung" - -msgid "Detach Configuration Group" -msgid_plural "Detach Configuration Groups" -msgstr[0] "Konfigurationsgruppe abtrennen" -msgstr[1] "Konfigurationsgruppen abtrennen" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "Replikation abtrennen" -msgstr[1] "Replikationen abtrennen" - -msgid "Detached Configuration Group" -msgid_plural "Detached Configuration Groups" -msgstr[0] "Abgetrennte Konfigurationsgruppe" -msgstr[1] "Abgetrennte Konfigurationsgruppen" - -msgid "Details" -msgstr "Details" - -msgid "Disable Log" -msgid_plural "Disable Logs" -msgstr[0] "Deaktiviere Log" -msgstr[1] "Deaktiviere Logs" - -msgid "Disable Root" -msgstr "Deaktiviere Root" - -msgid "Disabled Log" -msgid_plural "Disabled Logs" -msgstr[0] "Deaktiviertes Log" -msgstr[1] "Deaktivierte Logs" - -msgid "Discard Changes" -msgstr "Verwerfe Änderungen" - -msgid "Discard Log" -msgid_plural "Discard Logs" -msgstr[0] "Log verwerfen" -msgstr[1] "Logs verwerfen" - -msgid "Discarded Log" -msgid_plural "Discarded Logs" -msgstr[0] "Verworfenes Log" -msgstr[1] "Verworfene Logs" - -msgid "Download" -msgstr "Herunterladen" - -msgid "Download Backup" -msgstr "Sicherungskopie herunterladen" - -msgid "Edit User" -msgstr "Benutzer bearbeiten" - -msgid "Eject Replica Source" -msgid_plural "Eject Replica Sources" -msgstr[0] "Replicaquelle auswerfen" -msgstr[1] "Replicaquellen auswerfen" - -msgid "Ejected Replica Source" -msgid_plural "Ejected Replica Sources" -msgstr[0] "Ausgeworfene Replicaquelle" -msgstr[1] "Ausgeworfene Replicaquellen" - -msgid "Enable Log" -msgid_plural "Enable Logs" -msgstr[0] "Aktiviere Log" -msgstr[1] "Aktiviere Logs" - -msgid "Enable Root" -msgstr "Aktiviere Root" - -msgid "Enabled Log" -msgid_plural "Enabled Logs" -msgstr[0] "Aktiviertes Log" -msgstr[1] "Aktivierte Logs" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "Fehler" - -msgid "Error applying changes" -msgstr "Fehler beim Anwenden der Änderungen" - -msgid "Error creating database backup." -msgstr "Fehler beim Erzeugen der Datenbanksicherung." - -msgid "Error deleting database on instance." -msgstr "Fehler beim Löschen der Datenbank auf Instanz." - -#, python-format -msgid "Error downloading log file: %s" -msgstr "Fehler beim Herunterladen von Logfiles: %s" - -msgid "Error getting configuration group list." -msgstr "Fehler beim Bezug der Gruppenkonfigurationsliste." - -msgid "Error getting database backup list." -msgstr "Fehler beim Abruf der Datenbank-Sicherungskopieliste." - -#, python-format -msgid "Error resetting parameters: %s" -msgstr "Fehler beim Zurücksetzen der Parameter: %s" - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "Fehlgeschlagen" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "Fehlgeschlagen" - -msgid "Fault" -msgstr "Fehler" - -msgid "Flavor" -msgstr "Variante" - -msgid "GB" -msgstr "GB" - -msgid "Go" -msgstr "Los" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "Zugriff erlauben." -msgstr[1] "Zugriff erlauben." - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "Zugriff erlaubt für" -msgstr[1] "Zugriff erlaubt für" - -msgid "Grow Cluster" -msgstr "Cluster vergrößern" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "Cluster vergrößern: {{cluster_name}}" - -msgid "Has Root Ever Been Enabled" -msgstr "Root war schon aktiviert" - -msgid "Host" -msgstr "Host" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "Host- oder IP-Adresse, zu der sich der Benutzer verbinden darf." - -msgid "ID" -msgstr "ID" - -msgid "Incremental" -msgstr "Inkrementell" - -msgid "Incremental Backup" -msgstr "Inkrementelle Sicherung" - -msgid "Info" -msgstr "Info" - -msgid "Information" -msgstr "Information" - -msgid "Initial Admin User" -msgstr "Initialer Administrator" - -msgid "Initial Databases" -msgstr "Initiale Datenbanken" - -msgid "Initial Volume Size" -msgstr "Initiale Datenträgergröße" - -msgid "Initial admin user to add" -msgstr "Initialer Administrator zum Hinzufügen" - -msgid "Initialize Databases" -msgstr "Datenbanken initialisieren" - -msgid "Instance Name" -msgstr "Instanzname" - -msgid "Instance Type" -msgstr "Instanz Typ" - -msgid "Instances" -msgstr "Instanzen" - -msgid "Is a Replica Of" -msgstr "Ist eine Replikation von" - -msgid "Launch" -msgstr "Start" - -msgid "Launch Cluster" -msgstr "Cluster starten" - -msgid "Launch Database" -msgstr "Datenbank starten" - -msgid "Launch Instance" -msgstr "Instanz starten" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "%(count)s mal \"%(name)s\" gestartet." - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "Cluster \"%s\" gestartet" - -msgid "Locality" -msgstr "Lokalität" - -msgid "Log" -msgstr "Log" - -msgid "Log Contents" -msgstr "Log Inhalte" - -msgid "Log Length" -msgstr "Loglänge" - -msgid "Log length must be a nonnegative integer." -msgstr "Loglänge muß eine nichtnegative Zahl sein." - -msgid "Log: " -msgstr "Log:" - -msgid "Logs" -msgstr "Logs" - -msgid "Manage Access" -msgstr "Zugriff verwalten" - -msgid "Manage Root" -msgstr "Verwalte Root" - -msgid "Manage Root Access" -msgstr "Verwalte Root Zugriff" - -msgid "Management Console" -msgstr "Verwaltungskonsole" - -msgid "Master Instance Name" -msgstr "Master-Instanz Name" - -msgid "Message" -msgstr "Nachricht" - -msgid "" -"Move networks from 'Available Networks' to 'Selected Networks' by clicking " -"the button, or dragging and dropping. You can change the NIC order by " -"dragging and dropping as well." -msgstr "" -"Bewegen Sie Netzwerke von 'Verfügbare Netzwerke' nach 'Ausgewählte " -"Netzwerke' durch klicken des Knopfes oder durch ziehen und fallen lassen. " -"Sie können die NIC Reihenfolge ebenso durch ziehen und fallen lassen ändern." - -msgid "Name" -msgstr "Name" - -msgid "Network" -msgstr "Netzwerk" - -msgid "Network attached to instance." -msgstr "Der Instanz zugewiesenes Netzwerk." - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "Neu" - -msgid "New Flavor" -msgstr "Neue Variante" - -msgid "New Host" -msgstr "Neuer Host" - -msgid "New Name" -msgstr "Neuer Name" - -msgid "New Password" -msgstr "Neues Passwort" - -msgid "New Size (GB)" -msgstr "Neue Größe (GB)" - -msgid "New password for cluster access." -msgstr "Neues Passwort für den Clusterzugriff." - -msgid "New size for volume must be greater than current size." -msgstr "" -"Die neue Größe des Datenträgers muss größer sein als die momentane Größe." - -msgid "No availability zones found" -msgstr "Keine Verfügbarkeitszone gefunden" - -msgid "No backups available" -msgstr "Keine Sicherungskopien verfügbar" - -msgid "No configuration groups available" -msgstr "Keine Konfigurationsgruppen verfügbar" - -msgid "No configurations available" -msgstr "Keine Konfigurationen verfügbar" - -msgid "No flavors available" -msgstr "Keine Varianten verfügbar" - -msgid "No instances available" -msgstr "Keine Instanz verfügbar" - -msgid "No volume type" -msgstr "Kein Datenträgertyp" - -msgid "None" -msgstr "Keine" - -msgid "Not Assigned" -msgstr "Nicht zugewiesen" - -msgid "Not Found" -msgstr "Nicht gefunden" - -msgid "Not available" -msgstr "Nicht verfügbar" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "" -"Anmerkung: Aktiviere root Zugriff auf der Instanz. Wenn root schon aktiviert " -"war, wurde ein neues Passwort generiert." - -msgid "Number of Instances" -msgstr "Anzahl der Instanzen" - -msgid "Number of Shards" -msgstr "Anzahl der Shards" - -msgid "Number of instances in the cluster." -msgstr "Anzahl der Instanzen in dem Cluster." - -msgid "Number of instances in the cluster. (Read only)" -msgstr "Anzahl der Instanzen im Cluster (nur lesen)" - -msgid "Number of shards. (Read only)" -msgstr "Anzahl der Shards. (nur lesen)" - -msgid "Old Flavor" -msgstr "Alte Variante" - -msgid "Optional Backup Description" -msgstr "Optionale Beschreibung der Sicherungskopie" - -msgid "Optional character set for the database." -msgstr "Optionaler Zeichensatz für die Datenbank." - -msgid "Optional collation type for the database." -msgstr "Optionaler Kollationstyp für die Datenbank." - -msgid "Optional comma separated list of databases user has access to." -msgstr "" -"Optionale kommaseparierte Liste von Datenbanken, auf die der Benutzer " -"Zugriff hat." - -msgid "Optional datastore specific type of the instance." -msgstr "Optional Datenspeicher spezifischer Typ der Instanz." - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "" -"Optionaler datenspeicher-spezifische Wert, der die Beziehung von einer " -"Instanz im Cluster zu einer anderen beschreibt." - -msgid "Optional host of user." -msgstr "Optionaler Host des Benutzers." - -msgid "Optional name of the instance." -msgstr "Optionaler Name der Instanz" - -msgid "Optional parent backup" -msgstr "Optionale Eltern-Sicherungskopie" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "" -"Optional wählen Sie die Erstellung der Datenbank aus einer vorherigen " -"Sicherung oder als Replikation einer vorhandenen Datenbankinstanz." - -msgid "Optionally provide a character set and collation for the database." -msgstr "" -"Stelle optional ein Zeichensatgz und eine Kollation für die Datenbank zur " -"Verfügung." - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "" -"Geben Sie optional eine kommaseparierte Liste der zu erzeugenden Datenbanken " -"an:" - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "" -"Stelle optional den Host des Benutzers und eine Liste von Datenbanken zur " -"Verfügung, auf die der Benutzer Zugriff haben soll." - -msgid "Overview" -msgstr "Übersicht" - -msgid "PASSWORD" -msgstr "PASSWORT" - -msgid "Parameter" -msgstr "Parameter" - -msgid "Parameters" -msgstr "Parameter" - -msgid "Parent Backup" -msgstr "Eltern-Sicherungskopie" - -msgid "Password" -msgstr "Passwort" - -msgid "Password (required)" -msgstr "Passwort (erforderlich)" - -msgid "Password for root user must be specified." -msgstr "Das Passwort für den Root-Benutzer muss angegeben werden." - -msgid "Password for root user." -msgstr "Passwort des Root-Benutzers." - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "" -"Passwort ist nur sichtbar, nachdem root aktiviert oder zurückgesetzt ist." - -msgid "" -"Please note: The new value must be greater than the existing volume " -"size." -msgstr "" -"Bitte beachten: Der neue Wert muss grösser sein als die " -"existierende Datenträgergrösse." - -msgid "Promote" -msgstr "Befördern" - -msgid "Promote to Replica Source" -msgstr "Befördert zur Replicaquelle" - -#, python-format -msgid "Promoted replica \"%s\" as the new replica source." -msgstr "Angebotenes Replica \"%s\" als die neue Replicaquelle." - -msgid "Property" -msgstr "Eigenschaft" - -msgid "Publish" -msgstr "Veröffentliche" - -msgid "Publish Log" -msgid_plural "Publish Logs" -msgstr[0] "Log publizieren" -msgstr[1] "Logs publizieren" - -msgid "Publishable (bytes)" -msgstr "Publizierbar (bytes)" - -msgid "Published (bytes)" -msgstr "Publiziert (bytes)" - -msgid "Published Log" -msgid_plural "Published Logs" -msgstr[0] "Publiziertes Log" -msgstr[1] "Publizierte Logs" - -msgid "RAM" -msgstr "RAM" - -msgctxt "Current status of a Database Instance" -msgid "Rebooting" -msgstr "Neustartend" - -msgid "Related To" -msgstr "In Beziehung zu" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "Entferne Instanz" -msgstr[1] "Entferne Instanzen" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "Entfernte Instanze" -msgstr[1] "Entfernte Instanzen" - -msgid "Removed instances from cluster." -msgstr "Instanzen wurden vom Cluster entfernt." - -msgid "Replica Count" -msgstr "Replica Anzahl" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "Abgetrennte Replikation" -msgstr[1] "Abgetrennte Replpikationen" - -msgid "Replicas" -msgstr "Replikationen" - -msgid "Replicate from Instance" -msgstr "Repliziere aus Instanz" - -msgid "Replication" -msgstr "Replikation" - -msgid "Reset Parameters" -msgstr "Parameter zurücksetzen" - -msgid "Reset Root Password" -msgstr "Root-Passwort zurücksetzen" - -msgid "Resize Database Instance" -msgstr "Datenbankinstanzgröße ändern" - -msgid "Resize Database Volume" -msgstr "Größe des Datenbank-Datenträgers anpassen" - -msgid "Resize Instance" -msgstr "Instanzgröße ändern" - -msgid "Resize Volume" -msgstr "Datenträgergröße ändern" - -msgctxt "Current status of a Database Instance" -msgid "Resizing" -msgstr "Größenänderung wird ausgeführt" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "Skaliere Instanz \"%s\"" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "Ändere Größe des Datenträgers \"%s\"" - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "Instanz neu starten" -msgstr[1] "Instanzen neu starten" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "Neustart erforderlich" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "Neu gestartete Instanz" -msgstr[1] "Neu gestartete Instanzen" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "" -"Neu gestartete Instanzen verlieren alle Daten, die nicht im persistenten " -"Speicher gespeichert wurden." - -msgid "Restore Backup" -msgstr "Aus Sicherungskopie wiederherstellen" - -msgid "Restore from Backup" -msgstr "Aus Sicherungskopie wiederherstellen" - -msgid "Return to Log List" -msgstr "Zurück zur Logliste" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "Zugriff entziehen" -msgstr[1] "Zugriff entziehen" - -msgid "Root Enabled" -msgstr "Root aktiviert" - -msgid "Root Password" -msgstr "Root-Passwort" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "Root-Passwort für den Cluster \"%s\" aktualisiert" - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "Speichern" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "Geplante Verkleinerung des Clusters" -msgstr[1] "Geplante Verkleinerung des Clusters" - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "Geplante Sicherung \"%(name)s\"." - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "Geplante Löschung eines Clusters" -msgstr[1] "Geplante Löschung von Clustern" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "Geplante Löschung einer Instanz" -msgstr[1] "Geplante Löschung von Instanzen" - -msgid "Scheduled growing of cluster." -msgstr "Geplante Vergrößerung des Clusters" - -msgid "Select a backup to restore" -msgstr "Wählen Sie eine Sicherungskopie zur Wiederherstellung aus" - -msgid "Select a configuration group" -msgstr "Wähle eine Konfigurationsgruppe" - -msgid "Select a configuration group to attach to the database instance." -msgstr "Wähle eine Konfigurationsgruppe zum Anhängen an die Datenbankinstanz." - -msgid "Select a master instance" -msgstr "Wählen Sie eine Master-Instanz" - -msgid "Select a new flavor" -msgstr "Neue Variante auswählen" - -msgid "Select a parameter and provide a value for the configuration parameter." -msgstr "" -"Wähle einen Parameter und stelle einen Wert für den Konfigurationsparameter " -"zur Verfügung." - -msgid "Select backup" -msgstr "Sicherungskopie auswählen" - -msgid "Select configuration" -msgstr "Wähle Konfiguration" - -msgid "Select configuration group" -msgstr "Wähle Konfigurationsgruppe" - -msgid "Select datastore type and version" -msgstr "Typ und Version des Datenspeichers wählen" - -msgid "Select instance" -msgstr "Instanz auswählen" - -msgid "Select parent backup" -msgstr "Eltern-Sicherungskopie auswählen" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "" -"Wählen Sie die Instanz(en) aus, die vom Cluster entfernt werden sollen." - -msgid "Selected networks" -msgstr "Ausgewählte Netzwerke" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "Cluster verkleinern" -msgstr[1] "Cluster verkleinern" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "Cluster verkleinern: {{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "Verkleinern eines Clusters kann nicht rückgängig gemacht werden." - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "Herunterfahren" - -msgid "Size" -msgstr "Größe" - -msgid "Size of image to launch." -msgstr "Größe des zu startenden Abbildes." - -msgid "Size of instance to launch." -msgstr "Größe der zu startenden Instanz." - -msgid "Size of the volume in GB." -msgstr "Größe des Datenträgers in GB." - -msgid "Source for Initial State" -msgstr "Quelle für initialen Status" - -msgid "Specify a new flavor for the database instance." -msgstr "Geben Sie eine neue Variante für die Datenbankinstanz an." - -msgid "Specify a new name, new password or new host name for the user." -msgstr "" -"Geben Sie einen neuen Namen, ein neues Passwort oder einen neuen Host für " -"den Benutzer an." - -msgid "Specify the details for launching an instance." -msgstr "Geben Sie die Details zum Start einer Instanz an." - -msgid "Specify the details for the database backup." -msgstr "Legen Sie die Details für die Datenbanksicherung fest." - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "" -"Geben Sie die Details der Instanz an, die zum Cluster hinzugefügt werden " -"soll." - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"Spezifiziert die Instanzen, die zum Cluster zugefügt worden. Wenn alle " -"Instanzen spezifiziert sind, klicken Sie \"Baue Cluster\", um den Cluster " -"entstehen zu lassen." - -msgid "Specify the name of the new database." -msgstr "Spezifiziere den Namen der neuen Datenbank." - -msgid "Specify the name of the new user and password." -msgstr "Geben Sie den Namen und das Passwort des neuen Benutzers an." - -msgid "Specify the new root password for vertica cluster." -msgstr "Geben Sie das neue root Passwort für den Vertica Cluster an." - -msgid "Specify the new volume size for the database instance." -msgstr "Die neue Größe des Datenträgers der Datenbankinstanz festlegen." - -msgid "Specify the number of replicas to be created" -msgstr "Spezifiziere die Nummer der zu erstellenden Replikas" - -msgid "" -"Specify whether future replicated instances will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity). This " -"value is ignored if the instance to be launched is a replica." -msgstr "" -"Spezifiere ob zukünftig replizierte Instanzen auf demselben Hypervisor " -"erstellt werden (Affinität) oder auf verschiedenen (Anti-Affinität). Wert " -"wird ignoriert, wenn die erstellte Instanz eine Replika ist." - -msgid "" -"Specify whether instances in the cluster will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity)." -msgstr "" -"Gibt an, welche Instanzen des Clusters auf demselben Hypervisor erstellt " -"werden (Affinität) oder auf unterschiedlichen (Anti-Affinität)." - -msgid "Specs" -msgstr "Spezifikationen" - -msgid "Status" -msgstr "Status" - -msgid "Status if root was ever enabled for an instance." -msgstr "Status wenn Root für diese Instanz schon aktiviert war." - -msgid "Successfully added parameter" -msgstr "Parameter erfolgreich hinzugefügt" - -msgid "Successfully disabled root access." -msgstr "Root Zugriff erfolgreich deaktiviert." - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"Das 'Instanztyp' und 'In Beziehung zu' Felder sind datenspeicherspezifisch " -"und optional. Schauen Sie in die Trove Dokumentation für mehr Informationen " -"zur Benutzung dieser Felder." - -msgid "The flavor must be specified." -msgstr "Die Variante muss angegeben werden." - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "" -"Das Namensfeld ist optional. Wenn das Feld leer ist, wird ein Name beim " -"Entstehen des Clusters generiert." - -msgid "The number of instances must be greater than 1." -msgstr "Die Anzahl der Instanzen muss größer als 1 sein." - -msgid "The number of shards must be greater than 1." -msgstr "Die Anzahl der Shards muss größer als 1 sein." - -msgid "There was a problem enabling root." -msgstr "Beim Root aktivieren ist ein Problem aufgetreten." - -msgid "This action cannot be undone." -msgstr "Diese Aktion kann nicht rückgängig gemacht werden." - -msgid "Type" -msgstr "Typ" - -msgid "Type and version of datastore." -msgstr "Typ und Version des Datenspeichers." - -msgid "USERNAME" -msgstr "BENUTZERNAME" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Nicht möglich: %(action)s: %(objs)s" - -#, python-format -msgid "Unable to add new parameter: %s" -msgstr "Parameter kann nicht hinzugefügt werden: %s" - -#, python-format -msgid "Unable to attach configuration group. %s" -msgstr "Konnte Konfigurationsgruppe nicht anhängen. %s" - -#, python-format -msgid "Unable to create configuration group. %s" -msgstr "Konfigurationsgruppe %s konnte nicht erstellt werden." - -#, python-format -msgid "Unable to create database. %s" -msgstr "Datenbank konnte nicht erstellt werden. %s" - -msgid "Unable to create list of parameters." -msgstr "Die Liste der Parameter kann nicht erzeugt werden." - -#, python-format -msgid "Unable to create user. %s" -msgstr "Benutzer %s kann nicht erstellt werden." - -msgid "Unable to determine if instance root is enabled." -msgstr "Es kann nicht ermittelt werden, ob auf der Instanz root aktiviert ist." - -msgid "Unable to find backup!" -msgstr "Sicherungskopie kann nicht gefunden werden!" - -msgid "Unable to find configuration group!" -msgstr "Konfigurationsgruppe konnte nicht gefunden werden!" - -msgid "Unable to find master instance!" -msgstr "Master-Instanz kann nicht gefunden werden!" - -msgid "Unable to get configuration data." -msgstr "Konnte Konfigurationsdaten nicht beziehen." - -msgid "Unable to get database backup data." -msgstr "Datenbank-Sicherungsdaten können nicht abgerufen werden." - -msgid "Unable to get databases data." -msgstr "Datenbank-Daten können nicht abgerufen werden." - -msgid "Unable to get instances data." -msgstr "Instanzdaten können nicht abgerufen werden." - -msgid "Unable to get user access data." -msgstr "Konnte Zugangsdaten nicht beziehen." - -msgid "Unable to get user data." -msgstr "Benutzerdaten können nicht abgerufen werden." - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "Cluster %s kann nicht vergrößert werden." - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "Cluster %s kann nicht vergrößert werden." - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "Außerstande %(count)s mal \"%(name)s\" zu starten." - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "Cluster \"%s\" kann nicht gestartet werden." - -msgid "Unable to list database backups for parent." -msgstr "Eltern-Datenbank-Sicherungskopien können nicht aufgelistet werden." - -msgid "Unable to list database instances to backup." -msgstr "Die zu sichernden Datenbankinstanzen können nicht aufgelistet werden." - -msgid "" -"Unable to load {0} log\n" -"{1}" -msgstr "" -"Konnte log {0} nicht laden\n" -"{1}" - -msgid "Unable to load {0} log for instance \"{1}\"." -msgstr "Konnte log {0} für Instanz \"{1}\" nicht laden." - -msgid "Unable to obtain datastore versions." -msgstr "Beziehen der Datastore Versionen nicht möglich." - -msgid "Unable to obtain datastores." -msgstr "Beziehen des Datastore nicht möglich." - -msgid "Unable to obtain flavors." -msgstr "Die Varianten können nicht abgerufen werden." - -msgid "Unable to obtain information on root user" -msgstr "Konnte keine Informationen über den Benutzer root erhalten" - -msgid "Unable to obtain list of parameters." -msgstr "Die Liste der Parameter können nicht abgerufen werden." - -#, python-format -msgid "Unable to promote replica as the new replica source. \"%s\"" -msgstr "Konnte neue Replicaquelle nicht anbieten. \"%s\"" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "Instanzen können nicht vom Cluster %s entfernt werden." - -#, python-format -msgid "Unable to reset password. %s" -msgstr "Das Passwort kann nicht zurückgesetzt werden. %s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "Instanz %s kann nicht skaliert werden." - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "Größenänderung des Datenträgers nicht möglich. %s" - -msgid "Unable to retrieve accessible databases." -msgstr "Konnte erreichbare Datenbanken nicht beziehen." - -msgid "Unable to retrieve availability zones." -msgstr "Verfügbarkeitszonen können nicht abgerufen werden." - -msgid "Unable to retrieve cluster details." -msgstr "Clusterdetails können nicht abgerufen werden." - -msgid "Unable to retrieve database clusters." -msgstr "Datenbankcluster können nicht abgerufen werden." - -msgid "Unable to retrieve database instances." -msgstr "Liste der Datenbankinstanzen kann nicht abgerufen werden." - -msgid "Unable to retrieve database size information." -msgstr "Größe der Datenbank kann nicht abgerufen werden." - -msgid "Unable to retrieve databases." -msgstr "Die Datenbanken können nicht abgerufen werden." - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "Details zur Sicherungskopie können nicht abgerufen werden: %s" - -#, python-format -msgid "Unable to retrieve details for configuration group: %s" -msgstr "Konnte Gruppenkonfigurationsdetails nicht beziehen: %s" - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "Details zum Datenbankcluster können nicht abgerufen werden: %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "Details zur Datenbankinstanz können nicht abgerufen werden: %s" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "" -"Details zur übergeordneten Sicherungskopie können nicht abgerufen werden: %s" - -msgid "Unable to retrieve flavors." -msgstr "Varianten können nicht abgerufen werden." - -msgid "Unable to retrieve instance details." -msgstr "Instanzdetails können nicht aufgerufen werden. " - -#, python-format -msgid "" -"Unable to retrieve list of logs.\n" -"%s" -msgstr "" -"Konnte die Liste der Logs nicht beziehen.\n" -"%s" - -msgid "Unable to retrieve networks." -msgstr "Netzwerke können nicht abgerufen werden." - -#, python-format -msgid "Unable to update user. %s" -msgstr "Benutzer %s kann nicht aktualisiert werden." - -msgid "Unknown" -msgstr "Unbekannt" - -msgid "Updated" -msgstr "Aktualisiert" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "Benutzer \"%s\" aktualisiert." - -msgid "User Name" -msgstr "Benutzername" - -msgid "Username (required)" -msgstr "Benutzername (erforderlich)" - -msgid "Users" -msgstr "Benutzer" - -msgid "Value" -msgstr "Wert" - -msgid "Value must be \"true\" or \"false\"." -msgstr "Wert muß \"true\" oder \"false\" sein." - -#, python-format -msgid "Value must be a number between %(min)s and %(max)s." -msgstr "Der Wert muss im Bereich von %(min)s bis %(max)s sein." - -#, python-format -msgid "Value must be a number greater than or equal to %s." -msgstr "Wert muß größer-gleich %s sein." - -#, python-format -msgid "Value must be a number less than or equal to %s." -msgstr "Wert muß kleiner-gleich %s sein." - -msgid "Value must be a number." -msgstr "Wert muß eine Zahl sein." - -#, python-format -msgid "Value must be of type %s." -msgstr "Wert muss vom Typ %s sein." - -msgid "Values" -msgstr "Werte" - -msgid "View Full Log" -msgstr "Gesamtes Log anzeigen" - -msgid "View Log" -msgstr "Log anzeigen" - -msgid "Volume" -msgstr "Datenträger" - -msgid "Volume Size" -msgstr "Datenträgergröße" - -msgid "Volume Type" -msgstr "Datenträgertyp" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "Sie haben keine Berechtigung für %(action)s: %(objs)s" - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"Sie können eine inkrementelle Sicherung durchführen, indem Sie eine Eltern-" -"Sicherungskopie angeben. Achtung! Nicht alle Datenbanken " -"unterstützen inkrementelle Sicherungen. In diesem Fall wird die Ausführung " -"fehlschlagen." - -msgid "You must select a datastore type and version." -msgstr "Sie müssen Typ und Version des Datenspeichers wählen." - -msgid "You must select a flavor." -msgstr "Sie müssen eine Variante auswählen." - -msgid "You must specify a password if you create a user." -msgstr "Sie müssen ein Passwort angeben, wenn Sie einen Benutzer erstellen." - -msgid "You must specify at least one database if you create a user." -msgstr "" -"Sie müssen mindestens eine Datenbank angeben, wenn Sie einen Benutzer " -"anlegen." - -#, python-format -msgid "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" -msgstr "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" - -msgid "instance" -msgstr "Instanz" diff --git a/trove_dashboard/locale/de/LC_MESSAGES/djangojs.po b/trove_dashboard/locale/de/LC_MESSAGES/djangojs.po deleted file mode 100644 index d697379..0000000 --- a/trove_dashboard/locale/de/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,39 +0,0 @@ -# Andreas Jaeger , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 7.0.0.0rc2.dev7\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-10-07 13:57+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-09-25 11:27+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 "Created" -msgstr "Erstellt" - -msgid "Database" -msgstr "Datenbank" - -msgid "Datastore" -msgstr "Datenspeicher" - -msgid "Datastore Version" -msgstr "Version des Datenspeichers" - -msgid "Incremental" -msgstr "Inkrementell" - -msgid "Name" -msgstr "Name" - -msgid "Unable to retrieve the Backups." -msgstr "Sicherungskopien können nicht abgerufen werden." - -msgid "status" -msgstr "Status" diff --git a/trove_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po b/trove_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po deleted file mode 100644 index 16febc5..0000000 --- a/trove_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,39 +0,0 @@ -# Andi Chandler , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 6.0.0.0rc2.dev48\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-07-08 04:24+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-07-11 03:12+0000\n" -"Last-Translator: Andi Chandler \n" -"Language-Team: English (United Kingdom)\n" -"Language: en-GB\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -msgid "Created" -msgstr "Created" - -msgid "Database" -msgstr "Database" - -msgid "Datastore" -msgstr "Datastore" - -msgid "Datastore Version" -msgstr "Datastore Version" - -msgid "Incremental" -msgstr "Incremental" - -msgid "Name" -msgstr "Name" - -msgid "Unable to retrieve the Backups." -msgstr "Unable to retrieve the Backups." - -msgid "status" -msgstr "status" diff --git a/trove_dashboard/locale/fr/LC_MESSAGES/django.po b/trove_dashboard/locale/fr/LC_MESSAGES/django.po deleted file mode 100644 index bcf5f28..0000000 --- a/trove_dashboard/locale/fr/LC_MESSAGES/django.po +++ /dev/null @@ -1,1496 +0,0 @@ -# Andreas Jaeger , 2016. #zanata -# Corinne Verheyde , 2016. #zanata -# Gérald LONLAS , 2016. #zanata -# Corinne Verheyde , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 8.0.0.0rc2.dev4\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-02-09 07:58+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-15 08:47+0000\n" -"Last-Translator: Corinne Verheyde \n" -"Language-Team: French\n" -"Language: fr\n" -"X-Generator: Zanata 3.9.6\n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s RAM | %(instances)s instances" - -msgid "-" -msgstr "-" - -msgid "" -"Please note: It may be necessary to reboot the database " -"instance for this new configuration group to take effect." -msgstr "" -"Note: Il peut être nécessaire de redémarrer l'instance de " -"base de données pour prendre en compte le nouveau groupe de configuration." - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -" Veuillez noter : La valeur spécifiée dans le champ Taille " -"de volume doit être supérieur à 0, cependant, certaines configurations ne " -"supportent pas la spécification de la taille du volume. Si la spécification " -"de la taille du volume génère un message d'erreur indiquant que le volume " -"n'est pas activé, rentrez 0." - -msgid "A backup must be selected!" -msgstr "Vous devez sélectionner un serveur de backend !" - -msgid "A master instance must be selected!" -msgstr "Vous devez sélectionner une instance Master !" - -msgid "A new name or new password or new host must be specified." -msgstr "" -"Un nouveau nom d'utilisateur, un nouveau mot de passe ou un nouveau nom " -"d'hôte doit être spécifié." - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "Accès enlevé à" -msgstr[1] "Accès enlevés à" - -msgid "Accessible" -msgstr "Accessible" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "Active" - -msgid "Add" -msgstr "Ajouter" - -msgid "Add Instance" -msgstr "Ajouter une instance" - -msgid "Add Parameter" -msgstr "Ajouter un paramètre" - -msgid "" -"Add parameters to the configuration group. When all the parameters are " -"added click 'Apply Changes' to persist changes." -msgstr "" -"Ajout de paramètres au groupe de configuration. Une fois tous les paramètres " -"ajoutés, cliquer sur 'Appliquer les changements' pour les rendre persistents." - -msgid "Advanced" -msgstr "Avancées" - -msgid "" -"Allow the user to connect from this host only. If not provided this user " -"will be allowed to connect from anywhere." -msgstr "" -"Autorise l'utilisateur à se connecter uniquement à partir de cet hôte. Si " -"non spécifié, l'utilisateur pourra se connecter de n'importe où." - -msgid "Allowed Host" -msgstr "Hôte autorisé" - -msgid "Allowed Host (optional)" -msgstr "Hôte autorisé (optionnel)" - -msgid "Any Availability Zone" -msgstr "Toute zone de disponibilité" - -msgid "Applicable only if the volume size is specified." -msgstr "Applicable seulement si la taille du volume est specifiée." - -msgid "Applied changes to server" -msgstr "Changements appliqués sur le serveur" - -msgid "Apply Changes" -msgstr "Appliquer les changements" - -msgid "At least one of the new fields must be changed." -msgstr "Au moins l'un des nouveaux champs doit être modifié." - -msgid "Attach Configuration Group" -msgstr "Attacher le groupe de configuration" - -#, python-format -msgid "Attaching Configuration group \"%s\"" -msgstr "Attachement du groupe de configuration. %s" - -msgid "Availability Zone" -msgstr "Zone de disponibilité" - -msgid "Available networks" -msgstr "Les réseaux disponibles" - -msgid "Backup" -msgstr "Sauvegarde" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "Sauvegarde" - -msgid "Backup Database" -msgstr "Sauvegarde de Base de Données" - -msgid "Backup Details" -msgstr "Détails de la sauvegarde" - -msgid "Backup Details: {{ backup.name }}" -msgstr "Détails de la sauvegarde: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "Durée de la sauvegarde" - -msgid "Backup File" -msgstr "Fichier de sauvegarde" - -msgid "Backup File Location" -msgstr "Emplacement du fichier de sauvegarde" - -msgid "Backup Name" -msgstr "Nom de la sauvegarde" - -msgid "Backup Overview" -msgstr "Aperçu de la Sauvegarde" - -msgid "Backups" -msgstr "Sauvegardes" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "Bloquée" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "Construction" - -msgctxt "Current status of a Database Instance" -msgid "Building" -msgstr "Construction" - -msgid "Cancel" -msgstr "Annuler" - -#, python-format -msgid "Cannot disable root access: %s" -msgstr "Impossible de désactiver l'accès Root : %s" - -msgid "Cannot grow cluster. No instances specified." -msgstr "Impossible d'agrandir le cluster. Aucune instance n'est spécifiée." - -msgid "Character Set" -msgstr "Codage des caractères" - -msgid "Choose a new instance flavor." -msgstr "Sélectionner un nouveau gabarit d'instance." - -msgid "Choose initial state." -msgstr "Sélectionner un état initial." - -msgid "Close" -msgstr "Fermer" - -msgid "Cluster Name" -msgstr "Nom du cluster" - -msgid "Cluster Size" -msgstr "Taille du cluster" - -msgid "Clusters" -msgstr "Clusters" - -msgid "Collation" -msgstr "Collation" - -msgid "Comma separated list of databases to create" -msgstr "Liste des bases de données séparée par des virgules à créer " - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "Terminé" - -msgid "Configuration Defaults" -msgstr "Configurations par défaut" - -msgid "Configuration Group" -msgstr "Groupe de configuration" - -msgid "Configuration Group Details: {{configuration.name}}" -msgstr "Détails du Group de Configuration: {{configuration.name}}" - -msgid "Configuration Group Instances" -msgstr "Instances du groupe de configuration" - -msgid "Configuration Group Name" -msgstr "Nom du groupe de configuration" - -msgid "Configuration Group Overview" -msgstr "Aperçu du Groupe de Configuration" - -msgid "Configuration Group Values" -msgstr "Valueur du groupe de configuration" - -msgid "Configuration Groups" -msgstr "Groupes de configuration" - -msgid "" -"Confirm the current replica is to be promoted as the new replica source." -msgstr "" -"Confirmer la promotion du replica en cours en tant que source de replica." - -msgid "Connection Examples" -msgstr "Exemples de connexion" - -msgid "Connection Information" -msgstr "Information de connexion" - -msgid "Container" -msgstr "Conteneur" - -msgid "Create Backup" -msgstr "Créer une sauvegarde" - -msgid "Create Configuration Group" -msgstr "Créer un groupe de configuration" - -msgid "Create Database" -msgstr "Créer la base de données" - -msgid "Create User" -msgstr "Créer un utilisateur" - -msgid "" -"Create an optional initial user. This user will have access to all databases " -"you create." -msgstr "" -"Créer un utilisateur initial optionnel. Cet utilisateur aura accès à toutes " -"les bases de données que vous créerez." - -msgid "Created" -msgstr "Créé" - -msgid "Created configuration group" -msgstr "Groupe de configuration créé" - -#, python-format -msgid "Created database \"%s\"." -msgstr "Base de données \"%s\" créée." - -#, python-format -msgid "Created user \"%s\"." -msgstr "Utilisateur \"%s\" créé." - -msgid "Current Replica" -msgstr "Replica courant" - -msgid "Current Replica Source" -msgstr "Source courante du Replica" - -msgid "Current Size (GB)" -msgstr "Taille courante (Go)" - -msgid "Current Task" -msgstr "Tâche courante" - -msgid "DATABASE" -msgstr "BASE DE DONNÉES" - -msgid "Database" -msgstr "Base de données" - -msgid "Database Access" -msgstr "Accès à la base de données" - -msgid "Database Access for: {{ user_name }}" -msgstr "Accès à la base de données pour : {{ user_name }}" - -msgid "Database Backups" -msgstr "Sauvegardes de Base de Données " - -msgid "Database Info" -msgstr "Informations de la Base de Données" - -msgid "Database Instance" -msgstr "Instance de la base de données" - -msgid "Database Name" -msgstr "Nom de la Base de Données" - -msgid "Database Port" -msgstr "Port de la base de données" - -msgid "Databases" -msgstr "Bases de données" - -msgid "Datastore" -msgstr "Datastore" - -msgid "Datastore Version" -msgstr "Version du datastore" - -msgid "Defaults" -msgstr "Valeurs par défaut" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "Supprimer la Sauvegarde" -msgstr[1] "Supprimer les Sauvegardes" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "Supprimer le cluster" -msgstr[1] "Supprimer les clusters" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "Supprimer une Base de données" -msgstr[1] "Supprimer les Bases de données" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "Échec de la suppression" - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "Supprimer l'instance" -msgstr[1] "Supprimer les instances" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "Supprimer l'utilisateur" -msgstr[1] "Supprimer les utilisateurs" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "Sauvegarde Supprimée" -msgstr[1] "Sauvegardes Supprimées" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "Base de données Supprimée" -msgstr[1] "Bases de données Supprimées" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "Utilisateur Supprimé" -msgstr[1] "Utilisateurs Supprimés" - -msgid "Deleted cluster is not recoverable." -msgstr "Le cluster supprimé n'est pas récupérable." - -msgid "Deleted instances are not recoverable." -msgstr "Les instances supprimées ne sont pas récupérables." - -msgid "Description" -msgstr "Description" - -msgid "Detach Configuration Group" -msgid_plural "Detach Configuration Groups" -msgstr[0] "Détacher un groupe de configuration" -msgstr[1] "Détacher des groupes de configuration" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "Détacher Réplica" -msgstr[1] "Détacher Réplicas" - -msgid "Detached Configuration Group" -msgid_plural "Detached Configuration Groups" -msgstr[0] "Groupe de configuration détaché" -msgstr[1] "Groupes de configuration détachés" - -msgid "Details" -msgstr "Détails" - -msgid "Disable Log" -msgid_plural "Disable Logs" -msgstr[0] "Désactiver le journal" -msgstr[1] "Désactiver les journaux" - -msgid "Disable Root" -msgstr "Désactiver Root" - -msgid "Disabled Log" -msgid_plural "Disabled Logs" -msgstr[0] "Journal désactivé" -msgstr[1] "Journaux désactivés" - -msgid "Discard Changes" -msgstr "Annuler les changements" - -msgid "Discard Log" -msgid_plural "Discard Logs" -msgstr[0] "Jeter le journal" -msgstr[1] "Jeter les journaux" - -msgid "Discarded Log" -msgid_plural "Discarded Logs" -msgstr[0] "Journal jeté" -msgstr[1] "Journaux jetés" - -msgid "Download" -msgstr "Télécharger" - -msgid "Download Backup" -msgstr "Télécharger la sauvegarde" - -msgid "Edit User" -msgstr "Éditer l'utilisateur" - -msgid "Eject Replica Source" -msgid_plural "Eject Replica Sources" -msgstr[0] "Éjecter la source du Replica" -msgstr[1] "Éjecter les sources du Replica" - -msgid "Ejected Replica Source" -msgid_plural "Ejected Replica Sources" -msgstr[0] "Éjecter la source du Replica" -msgstr[1] "Éjecter les sources du Replica" - -msgid "Enable Log" -msgid_plural "Enable Logs" -msgstr[0] "Activer le journal" -msgstr[1] "Activer les journaux" - -msgid "Enable Root" -msgstr "Activer le Root" - -msgid "Enabled Log" -msgid_plural "Enabled Logs" -msgstr[0] "Journal activé" -msgstr[1] "Journaux activés" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "Erreur" - -msgid "Error applying changes" -msgstr "Erreur à l'application de la modification" - -msgid "Error creating database backup." -msgstr "Erreur pendant la sauvegarde de la base de données." - -msgid "Error deleting database on instance." -msgstr "Erreur lors de la suppression de la base de données sur l'instance." - -#, python-format -msgid "Error downloading log file: %s" -msgstr "Erreur lors du téléchargement du journal : %s" - -msgid "Error getting configuration group list." -msgstr "" -"Erreur lors de la récupération de la liste des groupes de configuration." - -msgid "Error getting database backup list." -msgstr "" -"Erreur lors de la récupération de la liste des sauvegardes de la base de " -"données." - -#, python-format -msgid "Error resetting parameters: %s" -msgstr "Erreur lors de la réinitialisation des paramètres: %s" - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "Échec" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "Échec" - -msgid "Fault" -msgstr "Panne" - -msgid "Flavor" -msgstr "Gabarit" - -msgid "GB" -msgstr "Go" - -msgid "Go" -msgstr "Go" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "Droit d'accès" -msgstr[1] "Droits d'accès" - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "Accès autorisé à" -msgstr[1] "Accès autorisés à" - -msgid "Grow Cluster" -msgstr "Agrandir le cluster" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "Agrandir le cluster : {{cluster_name}}" - -msgid "Has Root Ever Been Enabled" -msgstr "Si l'accès root a déjà été activé" - -msgid "Host" -msgstr "Host" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "Hôte ou IP autorisé pour la connexion de l'utilisateur." - -msgid "ID" -msgstr "ID" - -msgid "Incremental" -msgstr "Incrémentale" - -msgid "Incremental Backup" -msgstr "Sauvegarde incrémentale" - -msgid "Info" -msgstr "Info" - -msgid "Information" -msgstr "Information" - -msgid "Initial Admin User" -msgstr "Utilisateur Admin initial" - -msgid "Initial Databases" -msgstr "Bases de données initiales" - -msgid "Initial Volume Size" -msgstr "Taille initiale du volume" - -msgid "Initial admin user to add" -msgstr "Utilisateur admin initial à ajouter" - -msgid "Initialize Databases" -msgstr "Initialiser les bases de données" - -msgid "Instance Name" -msgstr "Nom de l'instance" - -msgid "Instance Type" -msgstr "Type d'instance" - -msgid "Instances" -msgstr "Instances" - -msgid "Is a Replica Of" -msgstr "Est un réplica de" - -msgid "Launch" -msgstr "Démarrer" - -msgid "Launch Cluster" -msgstr "Lancer le Cluster" - -msgid "Launch Database" -msgstr "Lancer la base de données" - -msgid "Launch Instance" -msgstr "Lancer Instance" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "%(count)s instance(s) nommée(s) \"%(name)s\" ont été lancée(s)." - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "Cluster \"%s\" démarré" - -msgid "Locality" -msgstr "Localisation" - -msgid "Log" -msgstr "Journal" - -msgid "Log Contents" -msgstr "Contenu du journal" - -msgid "Log Length" -msgstr "Longueur du journal" - -msgid "Log length must be a nonnegative integer." -msgstr "La longueur du journal doit correspondre à un nombre non négatif." - -msgid "Log: " -msgstr "Journal :" - -msgid "Logs" -msgstr "Journaux" - -msgid "Manage Access" -msgstr "Gérer les accès" - -msgid "Manage Root" -msgstr "Gérer le Root" - -msgid "Manage Root Access" -msgstr "Gérer les accès Root" - -msgid "Management Console" -msgstr "Console de management" - -msgid "Master Instance Name" -msgstr "Nom de l'instance Master" - -msgid "Message" -msgstr "Message" - -msgid "" -"Move networks from 'Available Networks' to 'Selected Networks' by clicking " -"the button, or dragging and dropping. You can change the NIC order by " -"dragging and dropping as well." -msgstr "" -"Déplacer les réseaux depuis \"Réseaux disponibles\" vers \"Réseaux " -"Sélectionnés\" en cliquant sur le bouton, ou en faisant un glisser-déposer. " -"Vous pouvez changer l'ordre des interfaces réseaux en faisant également un " -"glisser-déposer." - -msgid "Name" -msgstr "Nom" - -msgid "Network" -msgstr "Réseau" - -msgid "Network attached to instance." -msgstr "Réseau attaché à l'instance." - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "Nouveau" - -msgid "New Flavor" -msgstr "Nouveau gabarit" - -msgid "New Host" -msgstr "Nouvel hôte" - -msgid "New Name" -msgstr "Nouveau nom" - -msgid "New Password" -msgstr "Nouveau mot de passe" - -msgid "New Size (GB)" -msgstr "Nouvelle Taille (Go)" - -msgid "New password for cluster access." -msgstr "Nouveau mot de passe pour accès au cluster" - -msgid "New size for volume must be greater than current size." -msgstr "La nouvelle taille du volume doit être supérieur à sa taille actuelle." - -msgid "No availability zones found" -msgstr "Pas de zones de disponibilité trouvées" - -msgid "No backups available" -msgstr "Aucune sauvegarde disponible" - -msgid "No configuration groups available" -msgstr "Aucun groupe de configuration disponible" - -msgid "No configurations available" -msgstr "Aucun configuration disponible" - -msgid "No flavors available" -msgstr "Pas de gabarits disponibles" - -msgid "No instances available" -msgstr "Aucune instance disponible" - -msgid "No volume type" -msgstr "Pas de type de volume" - -msgid "None" -msgstr "Aucun" - -msgid "Not Assigned" -msgstr "Non assigné" - -msgid "Not Found" -msgstr "Non trouvé" - -msgid "Not available" -msgstr "Non disponible" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "" -"Note: Autorise l'accès root à une instance. Si l'utilisateur root est déjà " -"activé, alors un nouveau mot de passe est généré." - -msgid "Number of Instances" -msgstr "Nombre d'instances" - -msgid "Number of Shards" -msgstr "Nombre de fragments" - -msgid "Number of instances in the cluster." -msgstr "Nombre d'instances dans le cluster." - -msgid "Number of instances in the cluster. (Read only)" -msgstr "Nombre d'instances dans le cluster. (En lecture seule)" - -msgid "Number of shards. (Read only)" -msgstr "Nombre de fragments. (lecture seule)" - -msgid "Old Flavor" -msgstr "Ancien gabarit" - -msgid "Optional Backup Description" -msgstr "Description de sauvegarde optionnelle" - -msgid "Optional character set for the database." -msgstr "Codage des caractères optionnel pour la base de données" - -msgid "Optional collation type for the database." -msgstr "Optionnel: Type de collation pour la base de données " - -msgid "Optional comma separated list of databases user has access to." -msgstr "" -"Optionnel: Liste des bases de données auxquelles l'utilisateur a accès, " -"séparée par des virgules. " - -msgid "Optional datastore specific type of the instance." -msgstr "Optionnel: Type spécifique au datastore pour l'instance." - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "" -"Optionnel: Valeur spécifique au datastore qui définie la relation d'une " -"instance du cluster vers une autre." - -msgid "Optional host of user." -msgstr "Hôte optionnel de l'utilisateur" - -msgid "Optional name of the instance." -msgstr "Nom optionnel de l'instance." - -msgid "Optional parent backup" -msgstr "Sauvegarde totale optionnelle" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "" -"A choisi de créer cette base de données en option à l'aide d'une sauvegarde " -"antérieure, ou en répliqua d'une autre instance de base de données." - -msgid "Optionally provide a character set and collation for the database." -msgstr "" -"Éventuellement, fournir un jeu de caractères et une collation pour la base " -"de données." - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "" -"Fournissez, optionnellement, une liste de base de données à créer, séparée " -"par des virgules." - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "" -"Éventuellement, fournir l'hôte de l'utilisateur et la liste des bases de " -"données auxquelles l'utilisateur a accès." - -msgid "Overview" -msgstr "Vue d'ensemble" - -msgid "PASSWORD" -msgstr "MOT DE PASSE" - -msgid "Parameter" -msgstr "Paramètre" - -msgid "Parameters" -msgstr "Paramètres" - -msgid "Parent Backup" -msgstr "Sauvegarde totale" - -msgid "Password" -msgstr "Mot de passe" - -msgid "Password (required)" -msgstr "Mot de passe (obligatoire)" - -msgid "Password for root user must be specified." -msgstr "Le mot de passe pour l'utilisateur root doit être spécifié." - -msgid "Password for root user." -msgstr "Mot de passe pour l'utilisateur root." - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "" -"Le mot de passe est visible uniquement juste après l'activation de root ou " -"sa réinitialisation." - -msgid "" -"Please note: The new value must be greater than the existing volume " -"size." -msgstr "" -"Veuillez noter que : La nouvelle valeur doit être plus grande que " -"la taille du volume existant." - -msgid "Promote" -msgstr "Promouvoir" - -msgid "Promote to Replica Source" -msgstr "Promouvoir la source du Replica" - -#, python-format -msgid "Promoted replica \"%s\" as the new replica source." -msgstr "Promouvoir le replica \"%s\" comme nouvelle source de replica." - -msgid "Property" -msgstr "Propriété" - -msgid "Publish" -msgstr "Publier" - -msgid "Publish Log" -msgid_plural "Publish Logs" -msgstr[0] "Publier le journal" -msgstr[1] "Publier les journaux" - -msgid "Publishable (bytes)" -msgstr "Publiable (Octets)" - -msgid "Published (bytes)" -msgstr "Publié (Octets)" - -msgid "Published Log" -msgid_plural "Published Logs" -msgstr[0] "Journal publié" -msgstr[1] "Journaux publiés" - -msgid "RAM" -msgstr "RAM" - -msgctxt "Current status of a Database Instance" -msgid "Rebooting" -msgstr "Redémarrage en cours" - -msgid "Related To" -msgstr "Relatif à" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "Supprimer l'instance" -msgstr[1] "Supprimer les instances" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "Instance supprimée" -msgstr[1] "Instances supprimées" - -msgid "Removed instances from cluster." -msgstr "Instances supprimées du cluster" - -msgid "Replica Count" -msgstr "Nombre de replicata" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "Réplica détachée" -msgstr[1] "Réplicas détachées" - -msgid "Replicas" -msgstr "Réplicas" - -msgid "Replicate from Instance" -msgstr "Réplication depuis l'instance" - -msgid "Replication" -msgstr "Réplication" - -msgid "Reset Parameters" -msgstr "Réinitialiser les paramètres" - -msgid "Reset Root Password" -msgstr "Réinitialiser le mot de passe root" - -msgid "Resize Database Instance" -msgstr "Redimensionnement de l'instance de la base de données" - -msgid "Resize Database Volume" -msgstr "Redimensionner le Volume de base de données" - -msgid "Resize Instance" -msgstr "Redimensionner une instance" - -msgid "Resize Volume" -msgstr "Redimensionner un volume" - -msgctxt "Current status of a Database Instance" -msgid "Resizing" -msgstr "Redimensionnement" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "Redimensionnement de l'instance \"%s\" en cours" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "Redimensionnement du volume \"%s\" en cours" - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "Redémarrer l'Instance" -msgstr[1] "Redémarrer les Instances" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "Redémarrage requis" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "Instance Redémarrée" -msgstr[1] "Instances Redémarrées" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "" -"Les instances démarrées à nouveau perdront les données qui n'auront pas été " -"sauvegardées en stockage persistant." - -msgid "Restore Backup" -msgstr "Restaurer une Sauvegarde" - -msgid "Restore from Backup" -msgstr "Restaurer depuis la sauvegarde" - -msgid "Return to Log List" -msgstr "Revenir à la liste des journaux" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "Enlever l'accès" -msgstr[1] "Enlever les accès" - -msgid "Root Enabled" -msgstr "Root activé" - -msgid "Root Password" -msgstr "Mot de passe Root" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "Mot de passe root mis à jour pour le cluster \"%s\"" - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "Enregistrement" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "Rétrécissement du cluster programmé," -msgstr[1] "Rétrécissement des clusters programmé," - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "Sauvegarde \"%(name)s\" planifiée." - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "Suppression du cluster programmée" -msgstr[1] "Suppression des clusters programmée" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "Suppression de l'instances planifiée" -msgstr[1] "Suppression des instances planifiée" - -msgid "Scheduled growing of cluster." -msgstr "Agrandissement du cluster programmé." - -msgid "Select a backup to restore" -msgstr "Sélectionnez une sauvegarde à restaurer" - -msgid "Select a configuration group" -msgstr "Sélectionner un groupe de configuration" - -msgid "Select a configuration group to attach to the database instance." -msgstr "" -"Sélectionnez un groupe de configuration à attacher à l'instance de base de " -"données." - -msgid "Select a master instance" -msgstr "Sélectionner une instance Master" - -msgid "Select a new flavor" -msgstr "Sélectionner un nouveau gabarit" - -msgid "Select a parameter and provide a value for the configuration parameter." -msgstr "" -"Sélectionner un paramètre et fournir une valeur pour ce paramètre de " -"configuration." - -msgid "Select backup" -msgstr "Sélectionner une sauvegarde" - -msgid "Select configuration" -msgstr "Sélectionner la configuration" - -msgid "Select configuration group" -msgstr "Sélectionner le groupe de configuration" - -msgid "Select datastore type and version" -msgstr "Sélectionner le type et la version de datastore" - -msgid "Select instance" -msgstr "Sélectionner une instance" - -msgid "Select parent backup" -msgstr "Sélectionner une sauvegarde totale" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "Sélectionner le ou les instances qui seront supprimées du cluster." - -msgid "Selected networks" -msgstr "Réseaux sélectionnés" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "Rétrécir le cluster" -msgstr[1] "Rétrécir les clusters" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "Diminuer le cluster : {{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "Un cluster rétréci n'est pas récupérable." - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "Éteindre " - -msgid "Size" -msgstr "Taille" - -msgid "Size of image to launch." -msgstr "Taille de l'image à lancer." - -msgid "Size of instance to launch." -msgstr "Taille de l'instance à lancer." - -msgid "Size of the volume in GB." -msgstr "Taille du volume en Go" - -msgid "Source for Initial State" -msgstr "Source de l'état initial" - -msgid "Specify a new flavor for the database instance." -msgstr "Spécifier un nouveau gabarit pour l'instance de la base de données." - -msgid "Specify a new name, new password or new host name for the user." -msgstr "" -"Spécifier le nouveau nom, le nouveau mot de passe ou le nouveau nom d'hôte " -"pour cet utilisateur." - -msgid "Specify the details for launching an instance." -msgstr "Spécifiez les détails de démarrage d'une instance." - -msgid "Specify the details for the database backup." -msgstr "Spécifiez les détails pour la sauvegarde de la base de données." - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "Spécifier le détail de l'instance à ajouter au cluster." - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"Spécifier les instances à ajouter au cluster. Quand toutes les instances " -"sont spécifiées, cliquer sur 'Agrandir le cluster' pour effectuer " -"l'opération de croissance du cluster." - -msgid "Specify the name of the new database." -msgstr "Spécifier le nom pour la nouvelle base de donnée." - -msgid "Specify the name of the new user and password." -msgstr "Spécifier le nom et le mot de passe du nouvel utilisateur." - -msgid "Specify the new root password for vertica cluster." -msgstr "Spécifier le nouveau mot de passe root pour le cluster vertica." - -msgid "Specify the new volume size for the database instance." -msgstr "" -"Spécifier la nouvelle taille du volume pour l'instance de base de données." - -msgid "Specify the number of replicas to be created" -msgstr "Spécifier le nombre de répliques à créer." - -msgid "" -"Specify whether future replicated instances will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity). This " -"value is ignored if the instance to be launched is a replica." -msgstr "" -"Spécifie si les prochaines instances répliquées seront créées sur le même " -"hyperviseur (affinité) ou sur des hyperviseurs différents (anti-affinité). " -"Cette valeur n'est pas prise en compte si l'instance à lancer est une " -"réplique." - -msgid "" -"Specify whether instances in the cluster will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity)." -msgstr "" -"Spécifie si des instances dans le cluster seront crées sur le même " -"hyperviseur (affinité) ou sur des hyperviseurs différents (anti-affinité)." - -msgid "Specs" -msgstr "Spécifications" - -msgid "Status" -msgstr "Statut" - -msgid "Status if root was ever enabled for an instance." -msgstr "Statut si l'accès root n'a jamais été activé sur une instance." - -msgid "Successfully added parameter" -msgstr "Paramètre ajoutée avec succès" - -msgid "Successfully disabled root access." -msgstr "Désactivation avec succès de l'accès Root." - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"Les champs 'Type d'Instance' et 'Relatif à' sont spécifiques au datastore et " -"optionnel. Voir la documentation Trove pour plus d'informations sur " -"l'utilisation de ces champs." - -msgid "The flavor must be specified." -msgstr "Le gabarit doit être spécifié." - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "" -"Le champs nom est optionnel. Si le champs est laissé vide, un nom sera " -"généré lors de l’agrandissement du cluster." - -msgid "The number of instances must be greater than 1." -msgstr "Le nombre d'instances doit être supérieur à 1." - -msgid "The number of shards must be greater than 1." -msgstr "Le nombre de fragment doit être supérieur à 1." - -msgid "There was a problem enabling root." -msgstr "Il y a eu un problème durant l'activation du root." - -msgid "This action cannot be undone." -msgstr "Cette action ne peut pas être annulée." - -msgid "Type" -msgstr "Type" - -msgid "Type and version of datastore." -msgstr "Type et version du datastore." - -msgid "USERNAME" -msgstr "NOM D'UTILISATEUR" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Impossible de %(action)s : %(objs)s" - -#, python-format -msgid "Unable to add new parameter: %s" -msgstr "Impossible d'ajouter le nouveau paramètre. %s" - -#, python-format -msgid "Unable to attach configuration group. %s" -msgstr "Impossible d'attacher le groupe de configuration. %s" - -#, python-format -msgid "Unable to create configuration group. %s" -msgstr "Impossible de créer le groupe de configuration %s" - -#, python-format -msgid "Unable to create database. %s" -msgstr "Impossible de créer la base de données %s" - -msgid "Unable to create list of parameters." -msgstr "Impossible de créer la liste des paramètres." - -#, python-format -msgid "Unable to create user. %s" -msgstr "Impossible de créer l'utilisateur %s." - -msgid "Unable to determine if instance root is enabled." -msgstr "Impossible de déterminer si l'instance Root est active." - -msgid "Unable to find backup!" -msgstr "Impossible de trouver la sauvegarde !" - -msgid "Unable to find configuration group!" -msgstr "Impossible de trouver le groupe de configuration !" - -msgid "Unable to find master instance!" -msgstr "Impossible de trouver une instance Master !" - -msgid "Unable to get configuration data." -msgstr "Impossible d'obtenir les données de configuration." - -msgid "Unable to get database backup data." -msgstr "Impossible d'obtenir les données de sauvegarde de la base de données." - -msgid "Unable to get databases data." -msgstr "Impossible d'obtenir les informations de la base de données" - -msgid "Unable to get instances data." -msgstr "Impossible d'obtenir les données de l'instance." - -msgid "Unable to get user access data." -msgstr "Impossible d'obtenir les informations d'accès de l'utilisateur." - -msgid "Unable to get user data." -msgstr "Impossible d'obtenir les informations de l'utilisateur." - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "Impossible d'agrandir le cluster. %s" - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "Impossible d'agrandir le cluster : %s" - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "Impossible de démarrer %(count)s instance(s) nommée(s) \"%(name)s\"." - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "Impossible de démarrer le cluster. %s" - -msgid "Unable to list database backups for parent." -msgstr "Impossible de lister les sauvegardes totale des base de données." - -msgid "Unable to list database instances to backup." -msgstr "Impossible de lister les instances de base de données à sauvegarder." - -msgid "" -"Unable to load {0} log\n" -"{1}" -msgstr "" -"Impossible de charger le journal {0}\n" -"{1}" - -msgid "Unable to load {0} log for instance \"{1}\"." -msgstr "Impossible de charger le journal {0} pour l\\'instance \"{1}\"." - -msgid "Unable to obtain datastore versions." -msgstr "Impossible d'obtenir les versions de datastores." - -msgid "Unable to obtain datastores." -msgstr "Impossible d'obtenir les datastores." - -msgid "Unable to obtain flavors." -msgstr "Impossible d'obtenir les gabarits." - -msgid "Unable to obtain information on root user" -msgstr "Impossible d'obtenir les informations de l'utilisateur Root" - -msgid "Unable to obtain list of parameters." -msgstr "Impossible d'obtenir la liste des paramètres." - -#, python-format -msgid "Unable to promote replica as the new replica source. \"%s\"" -msgstr "" -"Impossible de promouvoir le replica comme nouvelle source de replica. \"%s\"" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "Impossible de supprimer les instances du cluster : %s" - -#, python-format -msgid "Unable to reset password. %s" -msgstr "Impossible de réinitialiser le mot de passe. %s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "Impossible de redimensionner l'instance. %s" - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "Impossible de redimensionner le volume %s" - -msgid "Unable to retrieve accessible databases." -msgstr "Impossible de récupérer les bases de données accessibles." - -msgid "Unable to retrieve availability zones." -msgstr "Impossible de récupérer les zones de disponibilité." - -msgid "Unable to retrieve cluster details." -msgstr "Impossible de récupérer les détails du cluster." - -msgid "Unable to retrieve database clusters." -msgstr "Impossible de trouver les clusters de base de donnée." - -msgid "Unable to retrieve database instances." -msgstr "Impossible de récupérer les instances de base de données" - -msgid "Unable to retrieve database size information." -msgstr "" -"Impossible de récupérer les informations sur la taille de la base de données." - -msgid "Unable to retrieve databases." -msgstr "Impossible de récupérer la base de données." - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "Impossible de récupérer les détails pour la sauvegarde : %s" - -#, python-format -msgid "Unable to retrieve details for configuration group: %s" -msgstr "" -"Impossible de récupérer les détails pour le groupe de configuration: %s" - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "" -"Impossible de récupérer les détails pour le cluster de base de données : %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "" -"Impossible de récupérer les détails pour l'instance %s de base de données" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "Impossible de récupérer les détails de la sauvegarde totale: %s" - -msgid "Unable to retrieve flavors." -msgstr "Impossible de récupérer les gabarits." - -msgid "Unable to retrieve instance details." -msgstr "Impossible de récupérer les détails de l'instance." - -#, python-format -msgid "" -"Unable to retrieve list of logs.\n" -"%s" -msgstr "" -"Impossible de récupérer la liste des journaux.\n" -"%s" - -msgid "Unable to retrieve networks." -msgstr "Impossible de récupérer les réseaux." - -#, python-format -msgid "Unable to update user. %s" -msgstr "Impossible de mettre à jour l'utilisateur %s." - -msgid "Unknown" -msgstr "Inconnu" - -msgid "Updated" -msgstr "Mis à jour" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "L'utilisateur \"%s\" a été mis à jour." - -msgid "User Name" -msgstr "Nom d'utilisateur" - -msgid "Username (required)" -msgstr "Nom d'utilisateur (obligatoire)" - -msgid "Users" -msgstr "Utilisateurs" - -msgid "Value" -msgstr "Valeur" - -msgid "Value must be \"true\" or \"false\"." -msgstr "La valeur doit être \"vrai\" ou \"faux\"." - -#, python-format -msgid "Value must be a number between %(min)s and %(max)s." -msgstr "La valeur doit être entre %(min)s et %(max)s." - -#, python-format -msgid "Value must be a number greater than or equal to %s." -msgstr "La valeur doit être un nombre plus grand ou égal à %s." - -#, python-format -msgid "Value must be a number less than or equal to %s." -msgstr "La valeur doit être un nombre inférieur ou égal à %s." - -msgid "Value must be a number." -msgstr "La valeur doit être numérique." - -#, python-format -msgid "Value must be of type %s." -msgstr "La valeur doit être de type %s." - -msgid "Values" -msgstr "Valeurs" - -msgid "View Full Log" -msgstr "Afficher le journal complet" - -msgid "View Log" -msgstr "Afficher le journal" - -msgid "Volume" -msgstr "Volume" - -msgid "Volume Size" -msgstr "Taille du Volume" - -msgid "Volume Type" -msgstr "Type de Volume" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "Vous n'êtes pas autorisé à %(action)s : %(objs)s" - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"Vous pouvez effectuer une sauvegarde incrémentale en spécifiant une " -"sauvegarde totale.Cependant, toutes les bases de données ne " -"supportent pas les sauvegardes incrémentales, et dans ce cas l'opération se " -"terminera en erreur." - -msgid "You must select a datastore type and version." -msgstr "Vous devez sélectionner un type et une version de datastore." - -msgid "You must select a flavor." -msgstr "Vous devez choisir un gabarit." - -msgid "You must specify a password if you create a user." -msgstr "Vous devez spécifier un mot de passe si vous créez un utilisateur." - -msgid "You must specify at least one database if you create a user." -msgstr "" -"Vous devez spécifier au moins une base de données si vous créez un " -"utilisateur." - -#, python-format -msgid "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" -msgstr "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" - -msgid "instance" -msgstr "instance" diff --git a/trove_dashboard/locale/fr/LC_MESSAGES/djangojs.po b/trove_dashboard/locale/fr/LC_MESSAGES/djangojs.po deleted file mode 100644 index 2ce111a..0000000 --- a/trove_dashboard/locale/fr/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,39 +0,0 @@ -# Gérald LONLAS , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 7.0.0.0rc2.dev12\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-11-04 14:40+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-11-08 10:42+0000\n" -"Last-Translator: Gérald LONLAS \n" -"Language-Team: French\n" -"Language: fr\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=2; plural=(n > 1)\n" - -msgid "Created" -msgstr "Créé" - -msgid "Database" -msgstr "Base de données" - -msgid "Datastore" -msgstr "Datastore" - -msgid "Datastore Version" -msgstr "Version du datastore" - -msgid "Incremental" -msgstr "Incrémentale" - -msgid "Name" -msgstr "Nom" - -msgid "Unable to retrieve the Backups." -msgstr "Impossible de récupérer les sauvegardes." - -msgid "status" -msgstr "statut" diff --git a/trove_dashboard/locale/id/LC_MESSAGES/django.po b/trove_dashboard/locale/id/LC_MESSAGES/django.po deleted file mode 100644 index bb985ef..0000000 --- a/trove_dashboard/locale/id/LC_MESSAGES/django.po +++ /dev/null @@ -1,1450 +0,0 @@ -# suhartono , 2016. #zanata -# suhartono , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 9.0.0.0b2.dev2\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-05-12 11:33+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-06-09 04:01+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" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s RAM | %(instances)s instances" - -msgid "-" -msgstr "-" - -msgid "" -"Please note: It may be necessary to reboot the database " -"instance for this new configuration group to take effect." -msgstr "" -"Please note: Mungkin perlu untuk reboot instance database " -"bagi kelompok konfigurasi baru untuk memulai berpengaruh." - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -"Harap dicatat: Nilai yang ditentukan dalam kolom Volume " -"Size harus lebih besar dari 0, namun, beberapa konfigurasi tidak mendukung " -"menentukan ukuran volume. Jika penentuan hasil ukuran volume dalam kesalahan " -"yang menyatakan dukungan volume tidak diaktifkan, masukkan 0." - -msgid "A backup must be selected!" -msgstr "Sebuah cadangan harus dipilih!" - -msgid "A master instance must be selected!" -msgstr "Sebuah instance utama harus dipilih!" - -msgid "A new name or new password or new host must be specified." -msgstr "Sebuah nama baru atau password baru atau host baru harus ditentukan." - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "Access Revoked to" - -msgid "Accessible" -msgstr "Accessible (dapat diakses)" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "Active (aktif)" - -msgid "Add" -msgstr "Add (pemambahan)" - -msgid "Add Instance" -msgstr "Add Instance (tambah instance)" - -msgid "Add Parameter" -msgstr "Add Parameter (penambahan parameter)" - -msgid "" -"Add parameters to the configuration group. When all the parameters are " -"added click 'Apply Changes' to persist changes." -msgstr "" -"Menambahkan parameter ke kelompok konfigurasi. Ketika semua parameter " -"ditambahkan klik 'Apply Changes' untuk menyimpan perubahan." - -msgid "Advanced" -msgstr "Advanced (lanjutan)" - -msgid "" -"Allow the user to connect from this host only. If not provided this user " -"will be allowed to connect from anywhere." -msgstr "" -"Izinkan pengguna untuk menghubungkan dari host ini saja. Jika tidak izin " -"ini, pengguna ini akan diizinkan untuk terhubung dari mana saja." - -msgid "Allowed Host" -msgstr "Allowed Host (diizinkan host)" - -msgid "Allowed Host (optional)" -msgstr "Allowed Host (optional)" - -msgid "Any Availability Zone" -msgstr "Any Availability Zone" - -msgid "Applicable only if the volume size is specified." -msgstr "Berlaku hanya jika ukuran volume ditentukan." - -msgid "Applied changes to server" -msgstr "Perubahan yang diterapkan ke server" - -msgid "Apply Changes" -msgstr "Apply Changes (penerapan perubahan)" - -msgid "At least one of the new fields must be changed." -msgstr "Setidaknya satu kolom baru harus diubah." - -msgid "Attach Configuration Group" -msgstr "Attach Configuration Group (pelekatan grup konfigurasi)" - -#, python-format -msgid "Attaching Configuration group \"%s\"" -msgstr "Melekatkan grup Konfigurasi \"%s\"" - -msgid "Availability Zone" -msgstr "Availability Zone (ketersediaan zona)" - -msgid "Available networks" -msgstr "Jaringan yang tersedia" - -msgid "Backup" -msgstr "Backup (cadangan)" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "Backup (pencadangan)" - -msgid "Backup Database" -msgstr "Backup Database (cadangan database)" - -msgid "Backup Details" -msgstr "Backup Details (rincian cadangan)" - -msgid "Backup Details: {{ backup.name }}" -msgstr "Backup Details: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "Backup Duration (jangka cadangan)" - -msgid "Backup File" -msgstr "Backup File (file cadangan)" - -msgid "Backup File Location" -msgstr "Backup File Location (lokasi file cadangan)" - -msgid "Backup Name" -msgstr "Backup Name (nama cadangan)" - -msgid "Backup Overview" -msgstr "Backup Overview (ikhtisar cadangan)" - -msgid "Backups" -msgstr "Backups (cadangan)" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "Blocked (diblokir)" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "Building (pembangunan)" - -msgctxt "Current status of a Database Instance" -msgid "Building" -msgstr "Building (pembangunan)" - -msgid "Cancel" -msgstr "Cancel (pembatalan)" - -#, python-format -msgid "Cannot disable root access: %s" -msgstr "Tidak dapat menonaktifkan akses root: %s" - -msgid "Cannot grow cluster. No instances specified." -msgstr "Tidak bisa tumbuh cluster. Tidak ada instance yang ditentukan." - -msgid "Character Set" -msgstr "Character Set (set karakter)" - -msgid "Choose a new instance flavor." -msgstr "Pilih flavor instance baru." - -msgid "Choose initial state." -msgstr "Pilih keadaan awal." - -msgid "Close" -msgstr "Close (tutup)" - -msgid "Cluster Name" -msgstr "Cluster Name (nama kluster)" - -msgid "Cluster Size" -msgstr "Cluster Size (ukuran kluster)" - -msgid "Clusters" -msgstr "Clusters (kluster)" - -msgid "Collation" -msgstr "Collation (pemeriksaan)" - -msgid "Comma separated list of databases to create" -msgstr "Daftar dipisahkan koma dari database untuk membuat" - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "Completed (lengkap)" - -msgid "Configuration Defaults" -msgstr "Configuration Defaults (default konfigurasi)" - -msgid "Configuration Group" -msgstr "Configuration Group (grup konfigurasi)" - -msgid "Configuration Group Details: {{configuration.name}}" -msgstr "Configuration Group Details: {{configuration.name}}" - -msgid "Configuration Group Instances" -msgstr "Configuration Group Instances (instance grup konfigurasi)" - -msgid "Configuration Group Name" -msgstr "Configuration Group Name (nama grup konfigurasi)" - -msgid "Configuration Group Overview" -msgstr "Configuration Group Overview" - -msgid "Configuration Group Values" -msgstr "Configuration Group Values (nilai grup konfigurasi)" - -msgid "Configuration Groups" -msgstr "Configuration Groups (grup konfigurasi)" - -msgid "" -"Confirm the current replica is to be promoted as the new replica source." -msgstr "" -"Konfirmasi replika saat ini adalah untuk dipromosikan sebagai sumber replika " -"baru." - -msgid "Connection Examples" -msgstr "Connection Examples (contoh koneksi)" - -msgid "Connection Information" -msgstr "Connection Information (informasi koneksi)" - -msgid "Container" -msgstr "Container (kontainer)" - -msgid "Create Backup" -msgstr "Create Backup (buat cadangan)" - -msgid "Create Configuration Group" -msgstr "Create Configuration Group (buat grup konfigurasi)" - -msgid "Create Database" -msgstr "Create Database (buat database)" - -msgid "Create User" -msgstr "Create User (buat user)" - -msgid "" -"Create an optional initial user. This user will have access to all databases " -"you create." -msgstr "" -"Buat pengguna awal opsional. Pengguna ini akan memiliki akses ke semua " -"database yang Anda buat." - -msgid "Created" -msgstr "Created (dibuat))" - -msgid "Created configuration group" -msgstr "Dibuat grup konfigurasi" - -#, python-format -msgid "Created database \"%s\"." -msgstr "Database yang dibuat \"%s\"." - -#, python-format -msgid "Created user \"%s\"." -msgstr "Dibuat pengguna \"%s\"." - -msgid "Current Replica" -msgstr "Current Replica (salinan saat ini)" - -msgid "Current Replica Source" -msgstr "Current Replica Source (sumber salinan saat ini)" - -msgid "Current Size (GB)" -msgstr "Current Size (GB) (ukuran saat ini)" - -msgid "Current Task" -msgstr "Current Task (tugas saat ini)" - -msgid "DATABASE" -msgstr "DATABASE (database)" - -msgid "Database" -msgstr "Database (database)" - -msgid "Database Access" -msgstr "Database Access (akses database)" - -msgid "Database Access for: {{ user_name }}" -msgstr "Akses database untuk: {{ user_name }}" - -msgid "Database Backups" -msgstr "Database Backups (cadangan database) " - -msgid "Database Info" -msgstr "Database Info (info database)" - -msgid "Database Instance" -msgstr "Database Instance (instance database)" - -msgid "Database Name" -msgstr "Database Name (nama pengguna)" - -msgid "Database Port" -msgstr "Database Port (port database)" - -msgid "Databases" -msgstr "Databases (database)" - -msgid "Datastore" -msgstr "Datastore (penyimpanan data)" - -msgid "Datastore Version" -msgstr "Datastore Version (versi penyimpanan data)" - -msgid "Defaults" -msgstr "Defaults (default)" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "Delete Backup" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "Delete Cluster" - -msgid "Delete Configuration Group" -msgid_plural "Delete Configuration Groups" -msgstr[0] "Delete Configuration Group" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "Delete Database" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "Delete Failed (penghapusan kegagalan)" - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "Delete Instance" - -msgid "Delete Parameter" -msgid_plural "Delete Parameters" -msgstr[0] "Delete Parameter" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "Delete User" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "Deleted Backup" - -msgid "Deleted Configuration Group" -msgid_plural "Deleted Configuration Groups" -msgstr[0] "Deleted Configuration Group" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "Deleted Database" - -msgid "Deleted Parameter" -msgid_plural "Deleted Parameters" -msgstr[0] "Deleted Parameter" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "Deleted User" - -msgid "Deleted cluster is not recoverable." -msgstr "Cluster dihapus tidak dapat dipulihkan." - -msgid "Deleted instances are not recoverable." -msgstr "Instance yang dihapus tidak dapat dipulihkan." - -msgid "Description" -msgstr "Description (deskripsi)" - -msgid "Detach Configuration Group" -msgid_plural "Detach Configuration Groups" -msgstr[0] "Detach Configuration Group" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "Detach Replica" - -msgid "Detached Configuration Group" -msgid_plural "Detached Configuration Groups" -msgstr[0] "Detached Configuration Group" - -msgid "Details" -msgstr "Details (rincian)" - -msgid "Disable Log" -msgid_plural "Disable Logs" -msgstr[0] "Disable Log" - -msgid "Disable Root" -msgstr "Disable Root (menonaktifkan root)" - -msgid "Disabled Log" -msgid_plural "Disabled Logs" -msgstr[0] "Disabled Log" - -msgid "Discard Changes" -msgstr "Discard Changes (pembuangan perubahan)" - -msgid "Discard Log" -msgid_plural "Discard Logs" -msgstr[0] "Discard Log" - -msgid "Discarded Log" -msgid_plural "Discarded Logs" -msgstr[0] "Discarded Log" - -msgid "Download" -msgstr "Download (pengunduhan)" - -msgid "Download Backup" -msgstr "Download Backup (mengunduh cadangan)" - -msgid "Edit User" -msgstr "Edit User (edit user)" - -msgid "Eject Replica Source" -msgid_plural "Eject Replica Sources" -msgstr[0] "Eject Replica Source" - -msgid "Ejected Replica Source" -msgid_plural "Ejected Replica Sources" -msgstr[0] "Ejected Replica Source" - -msgid "Enable Log" -msgid_plural "Enable Logs" -msgstr[0] "Enable Log" - -msgid "Enable Root" -msgstr "Enable Root (mengaktifkan root)" - -msgid "Enabled Log" -msgid_plural "Enabled Logs" -msgstr[0] "Enabled Log" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "Error" - -msgid "Error applying changes" -msgstr "Kesalahan menerapkan perubahan" - -msgid "Error creating database backup." -msgstr "Kesalahan menciptakan backup database." - -msgid "Error deleting database on instance." -msgstr "Kesalahan menghapus database pada instance." - -#, python-format -msgid "Error downloading log file: %s" -msgstr "Kesalahan men-download file log: %s" - -msgid "Error getting configuration group list." -msgstr "Kesalahan mendapatkan daftar grup konfigurasi." - -msgid "Error getting database backup list." -msgstr "Kesalahan mendapatkan daftar backup database." - -#, python-format -msgid "Error resetting parameters: %s" -msgstr "Kesalahan ulang (resetting) parameter: %s" - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "Failed" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "Failed (kegagalan)" - -msgid "Fault" -msgstr "Fault (kesalahan)" - -msgid "Flavor" -msgstr "Flavor" - -msgid "GB" -msgstr "GB" - -msgid "Go" -msgstr "Go (jalan)" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "Grant Access" - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "Granted Access to" - -msgid "Grow Cluster" -msgstr "Grow Cluster (pertumbuhan kluster)" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "Grow Cluster: {{cluster_name}}" - -msgid "Has Root Ever Been Enabled" -msgstr "Has Root Ever Been Enabled (apakah root pernah diaktifkan)" - -msgid "Host" -msgstr "Host (host)" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "Host atau IP dimana pengguna diperbolehkan untuk terhubung melalui." - -msgid "ID" -msgstr "ID (id)" - -msgid "Incremental" -msgstr "Incremental (penambahan)" - -msgid "Incremental Backup" -msgstr "Incremental Backup (cadangan inkremental)" - -msgid "Info" -msgstr "Info (informasi)" - -msgid "Information" -msgstr "Information (informasi)" - -msgid "Initial Admin User" -msgstr "Initial Admin User (user admin awal)" - -msgid "Initial Databases" -msgstr "Initial Databases (database awal)" - -msgid "Initial Volume Size" -msgstr "Initial Volume Size (ukuran volume awal)" - -msgid "Initial admin user to add" -msgstr "Awal user admin untuk menambahkan" - -msgid "Initialize Databases" -msgstr "Initialize Databases" - -msgid "Instance Name" -msgstr "Instance Name (nama instance)" - -msgid "Instance Type" -msgstr "Instance Type (tipe instance)" - -msgid "Instances" -msgstr "Instances (instance)" - -msgid "Is a Replica Of" -msgstr "Is a Replica Of" - -msgid "Launch" -msgstr "Launch (meluncurkan)" - -msgid "Launch Cluster" -msgstr "Launch Cluster (peluncuran kluster)" - -msgid "Launch Database" -msgstr "Launch Database (peluncuran database)" - -msgid "Launch Instance" -msgstr " Launch Instance (peluncuran instance)" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "Diluncurkan %(count)s named \"%(name)s\"." - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "Diluncurkan klaster \"%s\"" - -msgid "Locality" -msgstr "Locality (lokalitas)" - -msgid "Log" -msgstr "Log (catatan)" - -msgid "Log Contents" -msgstr "Log Contents (konten catatan)" - -msgid "Log Length" -msgstr "Log Length (panjang catatan)" - -msgid "Log length must be a nonnegative integer." -msgstr "Panjang log harus berupa bilangan integer positif." - -msgid "Log: " -msgstr "Log (catatan): " - -msgid "Logs" -msgstr "Logs (catatan)" - -msgid "Manage Access" -msgstr "Manage Access (mengelola akses)" - -msgid "Manage Root" -msgstr "Manage Root (mengelola root)" - -msgid "Manage Root Access" -msgstr "Manage Root Access (mengelolaan akses root)" - -msgid "Management Console" -msgstr "Management Console (konsol pengelolaan)" - -msgid "Master Instance Name" -msgstr "Master Instance Name (nama instance induk)" - -msgid "Message" -msgstr "Message (pesan)" - -msgid "" -"Move networks from 'Available Networks' to 'Selected Networks' by clicking " -"the button, or dragging and dropping. You can change the NIC order by " -"dragging and dropping as well." -msgstr "" -"Pindah jaringan dari 'Available Networks' ke 'Selected Networks' dengan " -"mengklik tombol, atau menyeret dan menjatuhkan (drag and drop). Anda dapat " -"mengubah urutan NIC dengan menyeret dan menjatuhkan juga." - -msgid "Name" -msgstr "Name (nama)" - -msgid "Network" -msgstr "Network (jaringan)" - -msgid "Network attached to instance." -msgstr "Jaringan terpasang untuk instance." - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "New (baru)" - -msgid "New Flavor" -msgstr "New Flavor (flavor baru)" - -msgid "New Host" -msgstr "New Host (host baru)" - -msgid "New Name" -msgstr "New Name (nama baru)" - -msgid "New Password" -msgstr "New Password (password baru)" - -msgid "New Size (GB)" -msgstr "New Size (GB) (ukuran baru)" - -msgid "New password for cluster access." -msgstr "Password baru untuk akses cluster." - -msgid "New size for volume must be greater than current size." -msgstr "Ukuran baru untuk volume harus lebih besar dari ukuran saat ini." - -msgid "No availability zones found" -msgstr "Tidak ada zona ketersediaan ditemukan" - -msgid "No backups available" -msgstr "Tidak ada backup yang tersedia" - -msgid "No configuration groups available" -msgstr "Tidak ada grup konfigurasi yang tersedia" - -msgid "No configurations available" -msgstr "Tidak ada konfigurasi yang tersedia" - -msgid "No flavors available" -msgstr "Tidak ada flavor tersedia" - -msgid "No instances available" -msgstr "Tidak ada instance yang tersedia" - -msgid "No volume type" -msgstr "Tidak ada jenis volume" - -msgid "None" -msgstr "None (tak satupun)" - -msgid "Not Assigned" -msgstr "Not Assigned (tidak ditugaskan)" - -msgid "Not Found" -msgstr "Not Found (tidak ditemukan)" - -msgid "Not available" -msgstr "Not available (tidak tersedia)" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "" -"Catatan: Aktifkan akses root pada sebuah instance. Jika user root sudah " -"diaktifkan maka password baru yang dihasilkan." - -msgid "Number of Instances" -msgstr "Number of Instances (jumlah instance)" - -msgid "Number of Shards" -msgstr "Number of Shards (jumlah serpihan)" - -msgid "Number of instances in the cluster." -msgstr "Jumlah instance dalam cluster." - -msgid "Number of instances in the cluster. (Read only)" -msgstr "Jumlah instance dalam cluster. (read only)" - -msgid "Number of shards. (Read only)" -msgstr "Jumlah serpihan. (Read only)" - -msgid "Old Flavor" -msgstr "Old Flavor (flavor lama)" - -msgid "Optional Backup Description" -msgstr "Optional Backup Description (deskripsi cadangan opsional)" - -msgid "Optional character set for the database." -msgstr "Set karakter opsional untuk database." - -msgid "Optional collation type for the database." -msgstr "Tipe pemeriksaan opsional untuk database." - -msgid "Optional comma separated list of databases user has access to." -msgstr "" -"Daftar dipisahkan koma opsional di database pengguna memiliki akses ke." - -msgid "Optional datastore specific type of the instance." -msgstr "Tipe tertentu datastore opsional untuk instance." - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "" -"Nilai tertentu datastore opsional yang mendefinisikan hubungan dari satu " -"instance dalam cluster ke instance yang lain." - -msgid "Optional host of user." -msgstr "Host opsional pengguna." - -msgid "Optional name of the instance." -msgstr "Nama opsional instance." - -msgid "Optional parent backup" -msgstr "Backup indukn opsional" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "" -"Secara opsional memilih untuk membuat database ini menggunakan cadangan " -"sebelumnya, atau sebagai replika contoh database lain." - -msgid "Optionally provide a character set and collation for the database." -msgstr "" -"Secara opsional menyediakan set karakter dan pemeriksaan untuk database." - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "" -"Secara opsional memberikan daftar dipisahkan koma dari database untuk " -"membuat:" - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "" -"Secara opsional menyediakan host pengguna dan daftar database dimana " -"pengguna diberikan akses ke database itu." - -msgid "Overview" -msgstr "Overview (ikhtisar)" - -msgid "PASSWORD" -msgstr "PASSWORD (password)" - -msgid "Parameter" -msgstr "Parameter (parameter)" - -msgid "Parameters" -msgstr "Parameters (parameter)" - -msgid "Parent Backup" -msgstr "Parent Backup (cadangan induk)" - -msgid "Password" -msgstr "Password (password)" - -msgid "Password (required)" -msgstr "Password (wajib)" - -msgid "Password for root user must be specified." -msgstr "Password untuk user root harus ditentukan." - -msgid "Password for root user." -msgstr "Password untuk user root." - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "Password hanya terlihat segera setelah akar diaktifkan atau reset." - -msgid "" -"Please note: The new value must be greater than the existing volume " -"size." -msgstr "" -"Harap dicatat: Nilai baru harus lebih besar dari ukuran volume yang " -"ada." - -msgid "Promote" -msgstr "Promote (promosi)" - -msgid "Promote to Replica Source" -msgstr "Promote to Replica Source (promosi sumber replika)" - -#, python-format -msgid "Promoted replica \"%s\" as the new replica source." -msgstr "Replika dipromosikan \"%s\" sebagai sumber replika baru." - -msgid "Property" -msgstr "Property (properti)" - -msgid "Publish" -msgstr "Publish (penerbitan)" - -msgid "Publish Log" -msgid_plural "Publish Logs" -msgstr[0] "Publish Log" - -msgid "Publishable (bytes)" -msgstr "Publishable (yang patut diterbitkan) (bytes)" - -msgid "Published (bytes)" -msgstr "Published (diterbitkan) (bytes)" - -msgid "Published Log" -msgid_plural "Published Logs" -msgstr[0] "Published Log" - -msgid "RAM" -msgstr "RAM" - -msgctxt "Current status of a Database Instance" -msgid "Rebooting" -msgstr "Rebooting (melakukan reboot)" - -msgid "Related To" -msgstr "Related To" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "Remove Instance" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "Removed Instance" - -msgid "Removed instances from cluster." -msgstr "Instance dihapus dari cluster." - -msgid "Replica Count" -msgstr "Replica Count (jumlah salinan)" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "Replica Detached" - -msgid "Replicas" -msgstr "Replicas (salinan)" - -msgid "Replicate from Instance" -msgstr "Mereplikasi dari Instance" - -msgid "Replication" -msgstr "Replication (tiruan)" - -msgid "Reset Parameters" -msgstr "Reset Parameters (pengaturan ulang parameter)" - -msgid "Reset Root Password" -msgstr "Reset Root Password (mengatur ulang password root) " - -msgid "Resize Database Instance" -msgstr "Resize Database Instance (perubahan ukuran instance database)" - -msgid "Resize Database Volume" -msgstr "Resize Database Volume (perubahan ukuran volume database)" - -msgid "Resize Instance" -msgstr "Resize Instance (perubahan ukuran instance)" - -msgid "Resize Volume" -msgstr "Resize Volume (perubahan ukuran volume)" - -msgctxt "Current status of a Database Instance" -msgid "Resizing" -msgstr "Resizing (perubahan ukurang)" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "Mengubah ukuran instance \"%s\"" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "Perubahan ukuran volume \"%s\"" - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "Restart Instance" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "Restart Required (restart diperlukan)" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "Restarted Instance" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "" -"Instance yang direstart akan kehilangan data tidak disimpan dalam " -"penyimpanan persisten." - -msgid "Restore Backup" -msgstr "Restore Backup (pengembalian cadangan)" - -msgid "Restore from Backup" -msgstr "Restore dari Backup" - -msgid "Return to Log List" -msgstr "Return to Log List (kembali ke daftar catatan)" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "Revoke Access" - -msgid "Root Enabled" -msgstr "Root Enabled (root diaktifkan)" - -msgid "Root Password" -msgstr "Root Password (password root)" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "Password root diperbarui untuk cluster \"%s\"" - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "Saving (penyimpanan)" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "Scheduled Shrinking of Cluster" - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "Backup dijadwalkan\"%(name)s\"." - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "Scheduled deletion of Cluster" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "Scheduled deletion of Instance" - -msgid "Scheduled growing of cluster." -msgstr "Dijadwalkan pertumbuhan cluster." - -msgid "Select a backup to restore" -msgstr "Pilih cadangan untuk mengembalikan" - -msgid "Select a configuration group" -msgstr "Pilih grup konfigurasi" - -msgid "Select a configuration group to attach to the database instance." -msgstr "Pilih grup konfigurasi untuk melekat pada instance database." - -msgid "Select a master instance" -msgstr "Pilih instance induk" - -msgid "Select a new flavor" -msgstr "Pilih flavor baru" - -msgid "Select a parameter and provide a value for the configuration parameter." -msgstr "Pilih parameter dan memberikan nilai untuk parameter konfigurasi." - -msgid "Select backup" -msgstr "Pilih backup" - -msgid "Select configuration" -msgstr "Pilih konfigurasi" - -msgid "Select configuration group" -msgstr "Pilih grup konfigurasi" - -msgid "Select datastore type and version" -msgstr "Pilih tipe datastore dan versi" - -msgid "Select instance" -msgstr "Pilih instance" - -msgid "Select parent backup" -msgstr "Pilih cadangan induknya" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "Pilih instance yang akan dihapus dari cluster." - -msgid "Selected networks" -msgstr "Jaringan yang dipilih" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "Shrink Cluster" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "Shrink Cluster: {{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "Menyusut cluster tidak dapat dipulihkan." - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "Shutdown (mematikan)" - -msgid "Size" -msgstr "Size (size)" - -msgid "Size of image to launch." -msgstr "Ukuran image untuk memulai." - -msgid "Size of instance to launch." -msgstr "Ukuran instance untuk memulai." - -msgid "Size of the volume in GB." -msgstr "Ukuran volume dalam GB." - -msgid "Source for Initial State" -msgstr "Source untuk Initial State" - -msgid "Specify a new flavor for the database instance." -msgstr "Tentukan flavor baru untuk instance database." - -msgid "Specify a new name, new password or new host name for the user." -msgstr "Tentukan nama baru, password baru atau nama host baru bagi pengguna." - -msgid "Specify the details for launching an instance." -msgstr "Tentukan rincian untuk meluncurkan sebuah instance." - -msgid "Specify the details for the database backup." -msgstr "Tentukan rincian untuk backup database." - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "Menentukan rincian instance yang akan ditambahkan ke cluster." - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"Tentukan instance yang akan ditambahkan ke cluster. Ketika semua instance " -"yang klik ditentukan 'Grow Cluster' untuk melakukan operasi tumbuh." - -msgid "Specify the name of the new database." -msgstr "Tentukan nama database baru." - -msgid "Specify the name of the new user and password." -msgstr "Tentukan nama pengguna dan password baru." - -msgid "Specify the new root password for vertica cluster." -msgstr "Tentukan password root baru untuk cluster vertica." - -msgid "Specify the new volume size for the database instance." -msgstr "Tentukan ukuran volume baru untuk instance database." - -msgid "Specify the number of replicas to be created" -msgstr "Tentukan jumlah replika yang akan dibuat" - -msgid "" -"Specify whether future replicated instances will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity). This " -"value is ignored if the instance to be launched is a replica." -msgstr "" -"Menentukan apakah instance yang direplikasi masa depan akan dibuat pada " -"hypervisor yang sama (afinitas) atau pada hypervisors berbeda (anti-" -"afinitas). Nilai ini diabaikan jika instance yang akan diluncurkan adalah " -"replika." - -msgid "" -"Specify whether instances in the cluster will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity)." -msgstr "" -"Menentukan apakah instance di cluster akan dibuat pada hypervisor yang sama " -"(afinitas) atau pada hypervisors berbeda (anti-afinitas)." - -msgid "Specs" -msgstr "Specs (spesifikasi)" - -msgid "Status" -msgstr "Status (keadaan)" - -msgid "Status if root was ever enabled for an instance." -msgstr "Keadaan jika root pernah diaktifkan untuk sebuah instance." - -msgid "Successfully added parameter" -msgstr "Berhasil ditambahkan parameter" - -msgid "Successfully disabled root access." -msgstr "Berhasil menonaktifkan akses root." - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"Kolom 'Instance Type' dan 'Related To' adalah datastore spesifik dan " -"opsional. Lihat dokumentasi Trove untuk informasi lebih lanjut tentang " -"menggunakan kolom ini." - -msgid "The flavor must be specified." -msgstr "Flavor harus ditentukan." - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "" -"Kolom nama adalah opsional. Jika Kolom ini dibiarkan kosong maka nama akan " -"dihasilkan ketika cluster tumbuh." - -msgid "The number of instances must be greater than 1." -msgstr "Jumlah instance harus lebih besar dari 1." - -msgid "The number of shards must be greater than 1." -msgstr "Jumlah serpihan harus lebih besar dari 1." - -msgid "There was a problem enabling root." -msgstr "Ada masalah mengaktifkan root." - -msgid "This action cannot be undone." -msgstr "Tindakan ini tidak bisa dibatalkan." - -msgid "Type" -msgstr "Type (tipe)" - -msgid "Type and version of datastore." -msgstr "Tipe dan versi datastore." - -msgid "USERNAME" -msgstr "USERNAME (username)" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Tidak bisa %(action)s: %(objs)s" - -#, python-format -msgid "Unable to add new parameter: %s" -msgstr "Tidak dapat menambahkan parameter baru: %s" - -#, python-format -msgid "Unable to attach configuration group. %s" -msgstr "Tidak dapat melekatkan grup konfigurasi. %s" - -#, python-format -msgid "Unable to create configuration group. %s" -msgstr "Tidak dapat membuat grup konfigurasi %s" - -#, python-format -msgid "Unable to create database. %s" -msgstr "Tidak dapat membuat database. %s" - -msgid "Unable to create list of parameters." -msgstr "Tidak dapat membuat daftar parameter." - -#, python-format -msgid "Unable to create user. %s" -msgstr "Tidak dapat membuat pengguna. %s" - -msgid "Unable to determine if instance root is enabled." -msgstr "Tidak dapat menentukan apakah instance akar diaktifkan." - -msgid "Unable to find backup!" -msgstr "Tidak dapat menemukan cadangan (backup) !" - -msgid "Unable to find configuration group!" -msgstr "Tidak dapat menemukan grup konfigurasi!" - -msgid "Unable to find master instance!" -msgstr "Tidak dapat menemukan instance utama!" - -msgid "Unable to get configuration data." -msgstr "Tidak dapat mendapatkan data konfigurasi." - -msgid "Unable to get database backup data." -msgstr "Tidak dapat mendapatkan data backup database." - -msgid "Unable to get databases data." -msgstr "Tidak dapat mendapatkan data database." - -msgid "Unable to get instances data." -msgstr "Tidak dapat mendapatkan data instance." - -msgid "Unable to get user access data." -msgstr "Tidak dapat mendapatkan akses data pengguna." - -msgid "Unable to get user data." -msgstr "Tidak dapat mendapatkan data pengguna." - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "Tidak dapat mengembangkan cluster. %s" - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "Tidak dapat tumbuh klaster: %s" - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "Tidak dapat meluncurkan %(count)s named \"%(name)s\"." - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "Tidak dapat meluncurkan klaster. %s" - -msgid "Unable to list database backups for parent." -msgstr "Tidak dapat mendaftar backup database untuk induknya." - -msgid "Unable to list database instances to backup." -msgstr "Tidak dapat mendaftar instance database untuk backup." - -msgid "" -"Unable to load {0} log\n" -"{1}" -msgstr "" -"Tidak bisa memuat {0} log\n" -"{1}" - -msgid "Unable to load {0} log for instance \"{1}\"." -msgstr "Tidak bisa memuat {0} log untuk instance \"{1}\"." - -msgid "Unable to obtain datastore versions." -msgstr "Tidak dapat memperoleh versi datastore." - -msgid "Unable to obtain datastores." -msgstr "Tidak dapat memperoleh datastores." - -msgid "Unable to obtain flavors." -msgstr "Tidak dapat memperoleh flavor." - -msgid "Unable to obtain information on root user" -msgstr "Tidak dapat memperoleh informasi tentang root user" - -msgid "Unable to obtain list of parameters." -msgstr "Tidak dapat memperoleh daftar parameter." - -#, python-format -msgid "Unable to promote replica as the new replica source. \"%s\"" -msgstr "Tidak dapat mempromosikan replika sebagai sumber replika baru. \"%s\"" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "Tidak dapat menghapus instance dari gugus: %s" - -#, python-format -msgid "Unable to reset password. %s" -msgstr "Tidak dapat me-reset password. %s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "Tidak dapat mengubah ukuran instance. %s" - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "Tidak dapat mengubah ukuran volume. %s" - -msgid "Unable to retrieve accessible databases." -msgstr "Tidak dapat mengambil database yang dapat diakses." - -msgid "Unable to retrieve availability zones." -msgstr "Tidak dapat mengambil zona ketersediaan." - -msgid "Unable to retrieve cluster details." -msgstr "Tidak dapat mengambil rincian cluster." - -msgid "Unable to retrieve database clusters." -msgstr "Tidak dapat mengambil cluster database." - -msgid "Unable to retrieve database instances." -msgstr "Tidak dapat mengambil instance database." - -msgid "Unable to retrieve database size information." -msgstr "Tidak dapat mengambil informasi ukuran database." - -msgid "Unable to retrieve databases." -msgstr "Tidak dapat mengambil database." - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "Tidak dapat mengambil rincian untuk backup: %s" - -#, python-format -msgid "Unable to retrieve details for configuration group: %s" -msgstr "Tidak dapat mengambil rincian untuk kelompok konfigurasi: % s" - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "Tidak dapat mengambil rincian untuk cluster database: %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "Tidak dapat mengambil rincian untuk instance database: %s" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "Tidak dapat mengambil rincian untuk backup induknya: %s" - -msgid "Unable to retrieve flavors." -msgstr "Tidak dapat mengambil flavor." - -msgid "Unable to retrieve instance details." -msgstr "Tidak dapat mengambil rincian instance." - -#, python-format -msgid "" -"Unable to retrieve list of logs.\n" -"%s" -msgstr "" -"Tidak dapat mengambil daftar log.\n" -"%s" - -msgid "Unable to retrieve networks." -msgstr "Tidak dapat mengambil jaringan." - -#, python-format -msgid "Unable to update user. %s" -msgstr "Tidak dapat memperbarui pengguna. %s" - -msgid "Unknown" -msgstr "Unknown (tidak diketahui)" - -msgid "Updated" -msgstr "Updated (diperbarui)" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "Diperbarui pengguna \"%s\"." - -msgid "User Name" -msgstr "User Name (nama user)" - -msgid "Username (required)" -msgstr "Username (wajib)" - -msgid "Users" -msgstr "Users (pengguna)" - -msgid "Value" -msgstr "Value (nilai)" - -msgid "Value must be \"true\" or \"false\"." -msgstr "Nilai harus \"true\" atau \"false\"." - -#, python-format -msgid "Value must be a number between %(min)s and %(max)s." -msgstr "Nilai harus berupa angka antara %(min)s dan %(max)s." - -#, python-format -msgid "Value must be a number greater than or equal to %s." -msgstr "Nilai harus berupa angka lebih besar dari atau sama dengan %s." - -#, python-format -msgid "Value must be a number less than or equal to %s." -msgstr "Nilai harus berupa angka kurang dari atau sama dengan %s." - -msgid "Value must be a number." -msgstr "Nilai harus berupa angka" - -#, python-format -msgid "Value must be of type %s." -msgstr "Nilai harus dari tipe %s." - -msgid "Values" -msgstr "Values (nilai)" - -msgid "View Full Log" -msgstr "View Full Log (melihat catalan seluruhnya)" - -msgid "View Log" -msgstr "View Log (melihat catatan)" - -msgid "Volume" -msgstr "Volume (volume)" - -msgid "Volume Size" -msgstr "Volume Size (ukuran volume)" - -msgid "Volume Type" -msgstr "Volume Type (tipe volume)" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "Anda tidak diizinkan untuk %(action)s: %(objs)s" - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"Anda dapat melakukan incremental backup dengan menetapkan cadangan induknya. " -" However, tidak semua database mendukung incremental " -"backup dalam hal operasi ini akan mengakibatkan kesalahan." - -msgid "You must select a datastore type and version." -msgstr "Anda harus memilih jenis datastore dan versi." - -msgid "You must select a flavor." -msgstr "Anda harus memilih sebuah flavor." - -msgid "You must specify a password if you create a user." -msgstr "Anda harus menentukan password jika Anda membuat user." - -msgid "You must specify at least one database if you create a user." -msgstr "Anda harus menentukan setidaknya satu database jika Anda membuat user." - -#, python-format -msgid "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" -msgstr "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" - -msgid "instance" -msgstr "instance" diff --git a/trove_dashboard/locale/id/LC_MESSAGES/djangojs.po b/trove_dashboard/locale/id/LC_MESSAGES/djangojs.po deleted file mode 100644 index 3c124d2..0000000 --- a/trove_dashboard/locale/id/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,39 +0,0 @@ -# suhartono , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 7.0.0.0rc2.dev7\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-10-07 13:57+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-10-04 03:38+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 "Created" -msgstr "Created (dibuat)" - -msgid "Database" -msgstr "Database (database)" - -msgid "Datastore" -msgstr "Datastore (penyimpanan data)" - -msgid "Datastore Version" -msgstr "Datastore Version (versi penyimpanan data)" - -msgid "Incremental" -msgstr "Incremental (inkremental)" - -msgid "Name" -msgstr "Name (nama)" - -msgid "Unable to retrieve the Backups." -msgstr "Tidak dapat mengambil Backup." - -msgid "status" -msgstr "status (keadaan)" diff --git a/trove_dashboard/locale/ja/LC_MESSAGES/django.po b/trove_dashboard/locale/ja/LC_MESSAGES/django.po deleted file mode 100644 index 920ae38..0000000 --- a/trove_dashboard/locale/ja/LC_MESSAGES/django.po +++ /dev/null @@ -1,1403 +0,0 @@ -# Akihiro Motoki , 2016. #zanata -# Andreas Jaeger , 2016. #zanata -# Shu Muto , 2016. #zanata -# Yoshiki Eguchi , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 8.0.0.0b3.dev9\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-01-10 19:59+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-09-30 03:49+0000\n" -"Last-Translator: Akihiro Motoki \n" -"Language-Team: Japanese\n" -"Language: ja\n" -"Plural-Forms: nplurals=1; plural=0\n" -"X-Generator: Zanata 3.7.3\n" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s RAM | %(instances)s インスタンス" - -msgid "-" -msgstr "-" - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -"注意: ボリュームサイズ欄では 0 より大きい値を指定すべきです" -"が、設定によってはボリュームサイズの指定に対応していない場合があります。ボ" -"リュームサイズを指定した際に、ボリューム側でのサポートが有効になっていないと" -"のエラーになる場合は、0 を入力してください。" - -msgid "A backup must be selected!" -msgstr "バックアップを選択する必要があります。" - -msgid "A master instance must be selected!" -msgstr "マスターインスタンスを選択する必要があります" - -msgid "A new name or new password or new host must be specified." -msgstr "" -"新しい名前、新しいパスワード、新しいホストのいずれかは指定しなければいけませ" -"ん。" - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "アクセスを取り消しました" - -msgid "Accessible" -msgstr "アクセス可能" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "稼働中" - -msgid "Add" -msgstr "追加" - -msgid "Add Instance" -msgstr "インスタンスの追加" - -msgid "Add Parameter" -msgstr "パラメーターの追加" - -msgid "" -"Add parameters to the configuration group. When all the parameters are " -"added click 'Apply Changes' to persist changes." -msgstr "" -"設定グループのパラメーターを追加してください。全てのパラメーターが追加した" -"ら、変更を保存するために「変更の適用」をクリックしてください。" - -msgid "Advanced" -msgstr "高度な設定" - -msgid "Allowed Host" -msgstr "許可ホスト" - -msgid "Allowed Host (optional)" -msgstr "許可ホスト (省略可)" - -msgid "Any Availability Zone" -msgstr "すべてのアベイラビリティーゾーン" - -msgid "Applicable only if the volume size is specified." -msgstr "ボリュームサイズが指定された場合のみ有効です。" - -msgid "Applied changes to server" -msgstr "変更をサーバーに適用しました" - -msgid "Apply Changes" -msgstr "変更の適用" - -msgid "At least one of the new fields must be changed." -msgstr "" -"新しい値を指定するフィールドの少なくとも 1 つは、値が変更されていないければい" -"けません。" - -msgid "Attach Configuration Group" -msgstr "設定グループの適用" - -#, python-format -msgid "Attaching Configuration group \"%s\"" -msgstr "設定グループ \"%s\" を適用中" - -msgid "Availability Zone" -msgstr "アベイラビリティーゾーン" - -msgid "Available networks" -msgstr "利用可能なネットワーク" - -msgid "Backup" -msgstr "バックアップ" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "バックアップ" - -msgid "Backup Database" -msgstr "データベースのバックアップ" - -msgid "Backup Details" -msgstr "バックアップの詳細" - -msgid "Backup Details: {{ backup.name }}" -msgstr "バックアップの詳細: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "バックアップ生存期間" - -msgid "Backup File" -msgstr "バックアップファイル" - -msgid "Backup File Location" -msgstr "バックアップファイルの場所" - -msgid "Backup Name" -msgstr "バックアップ名" - -msgid "Backup Overview" -msgstr "バックアップの概要" - -msgid "Backups" -msgstr "バックアップ" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "実行待ち" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "作成中" - -msgctxt "Current status of a Database Instance" -msgid "Building" -msgstr "作成中" - -msgid "Cancel" -msgstr "取り消し" - -#, python-format -msgid "Cannot disable root access: %s" -msgstr "ルートアクセスを無効化できません: %s" - -msgid "Cannot grow cluster. No instances specified." -msgstr "クラスターを拡張できません。インスタンスが指定されていません。" - -msgid "Character Set" -msgstr "文字集合" - -msgid "Choose a new instance flavor." -msgstr "新しいインスタンスフレーバーを選択してください。" - -msgid "Choose initial state." -msgstr "初期状態を選択してください" - -msgid "Close" -msgstr "閉じる" - -msgid "Cluster Name" -msgstr "クラスター名" - -msgid "Cluster Size" -msgstr "クラスターサイズ" - -msgid "Clusters" -msgstr "クラスター" - -msgid "Collation" -msgstr "照合順序" - -msgid "Comma separated list of databases to create" -msgstr "作成するデータベースのリスト(コンマ区切り)" - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "完了" - -msgid "Configuration Defaults" -msgstr "設定のデフォルト値" - -msgid "Configuration Group" -msgstr "設定グループ" - -msgid "Configuration Group Details: {{configuration.name}}" -msgstr "設定グループの詳細: {{configuration.name}}" - -msgid "Configuration Group Instances" -msgstr "設定グループのインスタンス" - -msgid "Configuration Group Name" -msgstr "設定グループ名" - -msgid "Configuration Group Overview" -msgstr "設定グループの概要" - -msgid "Configuration Group Values" -msgstr "設定グループ値" - -msgid "Configuration Groups" -msgstr "設定グループ" - -msgid "" -"Confirm the current replica is to be promoted as the new replica source." -msgstr "現在のレプリカを新しいレプリカ元に昇格することを確認してください。" - -msgid "Connection Examples" -msgstr "接続例" - -msgid "Connection Information" -msgstr "接続情報" - -msgid "Container" -msgstr "コンテナー" - -msgid "Create Backup" -msgstr "バックアップの作成" - -msgid "Create Configuration Group" -msgstr "設定グループの作成" - -msgid "Create Database" -msgstr "データベースの作成" - -msgid "Create User" -msgstr "ユーザーの作成" - -msgid "Created" -msgstr "作成時刻" - -msgid "Created configuration group" -msgstr "設定グループを作成しました" - -#, python-format -msgid "Created database \"%s\"." -msgstr "データベース \"%s\" を作成しました。" - -#, python-format -msgid "Created user \"%s\"." -msgstr "ユーザー \"%s\" を作成しました。" - -msgid "Current Replica" -msgstr "現在のレプリカ" - -msgid "Current Replica Source" -msgstr "現在のレプリカ元" - -msgid "Current Size (GB)" -msgstr "現在のサイズ (GB)" - -msgid "Current Task" -msgstr "現在のタスク" - -msgid "DATABASE" -msgstr "DATABASE" - -msgid "Database" -msgstr "データベース" - -msgid "Database Access" -msgstr "データベースのアクセス権" - -msgid "Database Access for: {{ user_name }}" -msgstr "{{ user_name }} のデータベースアクセス権" - -msgid "Database Backups" -msgstr "データベースのバックアップ" - -msgid "Database Info" -msgstr "データーベースの情報" - -msgid "Database Instance" -msgstr "データベースインスタンス" - -msgid "Database Name" -msgstr "データベース名" - -msgid "Database Port" -msgstr "データベースのポート番号" - -msgid "Databases" -msgstr "データベース" - -msgid "Datastore" -msgstr "データストア" - -msgid "Datastore Version" -msgstr "データストアバージョン" - -msgid "Defaults" -msgstr "デフォルト値" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "バックアップの削除" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "クラスターの削除" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "データベースの削除" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "削除に失敗しました" - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "インスタンスの削除" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "ユーザーの削除" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "バックアップを削除しました" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "データベースを削除しました" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "ユーザーを削除しました" - -msgid "Deleted cluster is not recoverable." -msgstr "削除されたクラスターは元に戻すことはできません。" - -msgid "Deleted instances are not recoverable." -msgstr "削除されたインスタンスは元に戻すことはできません。" - -msgid "Description" -msgstr "説明" - -msgid "Detach Configuration Group" -msgid_plural "Detach Configuration Groups" -msgstr[0] "設定グループの解除" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "レプリカの切断" - -msgid "Detached Configuration Group" -msgid_plural "Detached Configuration Groups" -msgstr[0] "設定グループを解除しました" - -msgid "Details" -msgstr "詳細" - -msgid "Disable Log" -msgid_plural "Disable Logs" -msgstr[0] "ログの無効化" - -msgid "Disable Root" -msgstr "ルートの無効化" - -msgid "Disabled Log" -msgid_plural "Disabled Logs" -msgstr[0] "ログを無効にしました" - -msgid "Discard Changes" -msgstr "変更の破棄" - -msgid "Discard Log" -msgid_plural "Discard Logs" -msgstr[0] "ログの破棄" - -msgid "Discarded Log" -msgid_plural "Discarded Logs" -msgstr[0] "ログを破棄しました" - -msgid "Download" -msgstr "ダウンロード" - -msgid "Download Backup" -msgstr "バックアップのダウンロード" - -msgid "Edit User" -msgstr "ユーザーの編集" - -msgid "Eject Replica Source" -msgid_plural "Eject Replica Sources" -msgstr[0] "レプリカ元のイジェクト" - -msgid "Ejected Replica Source" -msgid_plural "Ejected Replica Sources" -msgstr[0] "レプリカ元をイジェクトしました" - -msgid "Enable Log" -msgid_plural "Enable Logs" -msgstr[0] "ログの有効化" - -msgid "Enable Root" -msgstr "ルートの有効化" - -msgid "Enabled Log" -msgid_plural "Enabled Logs" -msgstr[0] "ログを有効にしました" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "エラー" - -msgid "Error applying changes" -msgstr "変更の適用中にエラーが発生しました" - -msgid "Error creating database backup." -msgstr "データベースのバックアップ作成でエラーが発生しました。" - -msgid "Error deleting database on instance." -msgstr "インスタンスからのデータベースの削除でエラーが発生しました。" - -#, python-format -msgid "Error downloading log file: %s" -msgstr "ログファイルのダウンロードに失敗しました: %s" - -msgid "Error getting configuration group list." -msgstr "設定グループ一覧の取得でエラーが発生しました。" - -msgid "Error getting database backup list." -msgstr "データベースのバックアップ一覧の取得でエラーが発生しました。" - -#, python-format -msgid "Error resetting parameters: %s" -msgstr "パラメーターのリセット中にエラーが発生しました: %s" - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "失敗" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "失敗" - -msgid "Fault" -msgstr "失敗" - -msgid "Flavor" -msgstr "フレーバー" - -msgid "GB" -msgstr "GB" - -msgid "Go" -msgstr "表示" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "アクセスの承認" - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "アクセスを承認しました" - -msgid "Grow Cluster" -msgstr "クラスターの拡張" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "クラスターの拡張: {{cluster_name}}" - -msgid "Has Root Ever Been Enabled" -msgstr "ルートを有効のままにする" - -msgid "Host" -msgstr "ホスト" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "このユーザーで許可される接続元のホスト名または IP アドレス" - -msgid "ID" -msgstr "ID" - -msgid "Incremental" -msgstr "差分" - -msgid "Incremental Backup" -msgstr "差分バックアップ" - -msgid "Info" -msgstr "情報" - -msgid "Information" -msgstr "情報" - -msgid "Initial Admin User" -msgstr "最初の管理ユーザー" - -msgid "Initial Databases" -msgstr "初期データベース" - -msgid "Initial Volume Size" -msgstr "初期ボリュームサイズ" - -msgid "Initial admin user to add" -msgstr "追加する初期管理ユーザー" - -msgid "Initialize Databases" -msgstr "データベースの初期化" - -msgid "Instance Name" -msgstr "インスタンス名" - -msgid "Instance Type" -msgstr "インスタンスタイプ" - -msgid "Instances" -msgstr "インスタンス" - -msgid "Is a Replica Of" -msgstr "インスタンスのレプリカ元" - -msgid "Launch" -msgstr "起動" - -msgid "Launch Cluster" -msgstr "クラスターの起動" - -msgid "Launch Database" -msgstr "データベースの起動" - -msgid "Launch Instance" -msgstr "インスタンスの起動" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "名前が \"%(name)s\" の %(count)s を起動しました。" - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "クラスター \"%s\" を起動しました。" - -msgid "Locality" -msgstr "局所性" - -msgid "Log" -msgstr "ログ" - -msgid "Log Contents" -msgstr "ログの内容" - -msgid "Log Length" -msgstr "ログの表示行数" - -msgid "Log length must be a nonnegative integer." -msgstr "ログの表示行数は 0 以上の整数でなければいけません。" - -msgid "Log: " -msgstr "ログ:" - -msgid "Logs" -msgstr "ログ" - -msgid "Manage Access" -msgstr "アクセス権の管理" - -msgid "Manage Root" -msgstr "ルートの管理" - -msgid "Manage Root Access" -msgstr "ルートアクセスの管理" - -msgid "Management Console" -msgstr "管理コンソール" - -msgid "Master Instance Name" -msgstr "マスターインスタンス名" - -msgid "Message" -msgstr "メッセージ" - -msgid "Name" -msgstr "名前" - -msgid "Network" -msgstr "ネットワーク" - -msgid "Network attached to instance." -msgstr "インスタンスに接続するネットワーク。" - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "新規作成" - -msgid "New Flavor" -msgstr "新しいフレーバー" - -msgid "New Host" -msgstr "新しいホスト" - -msgid "New Name" -msgstr "新しい名前" - -msgid "New Password" -msgstr "新しいパスワード" - -msgid "New Size (GB)" -msgstr "新しいサイズ (GB)" - -msgid "New password for cluster access." -msgstr "クラスターへのアクセスに使用する新しいパスワード。" - -msgid "New size for volume must be greater than current size." -msgstr "新しいボリュームサイズは現在のサイズよりも大きい必要があります。" - -msgid "No availability zones found" -msgstr "アベイラビリティーゾーンがありません" - -msgid "No backups available" -msgstr "バックアップがありません" - -msgid "No configuration groups available" -msgstr "設定グループがありません" - -msgid "No configurations available" -msgstr "設定がありません" - -msgid "No flavors available" -msgstr "利用可能なフレーバーがありません" - -msgid "No instances available" -msgstr "インスタンスがありません" - -msgid "No volume type" -msgstr "ボリューム種別の指定なし" - -msgid "None" -msgstr "なし" - -msgid "Not Assigned" -msgstr "割り当てなし" - -msgid "Not Found" -msgstr "見つかりません" - -msgid "Not available" -msgstr "利用できません" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "" -"注意: インスタンスでルートアクセスを有効にします。ルートユーザーがすでに有効" -"になっている場合は、新しいパスワードが生成されます。" - -msgid "Number of Instances" -msgstr "インスタンス数" - -msgid "Number of Shards" -msgstr "シャード数" - -msgid "Number of instances in the cluster." -msgstr "クラスター内のインスタンス数。" - -msgid "Number of instances in the cluster. (Read only)" -msgstr "クラスターのインスタンス数 (読み出し専用)" - -msgid "Number of shards. (Read only)" -msgstr "シャード数 (読み出し専用)" - -msgid "Old Flavor" -msgstr "現在のフレーバー" - -msgid "Optional Backup Description" -msgstr "バックアップの説明(省略可)" - -msgid "Optional character set for the database." -msgstr "(オプション) データベースで使用する文字集合。" - -msgid "Optional collation type for the database." -msgstr "(オプション) このデータベースでの照合順序タイプ。" - -msgid "Optional comma separated list of databases user has access to." -msgstr "" -"(オプション) ユーザーがアクセスできるデータベースのコンマ区切りのリスト。" - -msgid "Optional datastore specific type of the instance." -msgstr "(オプション) このインスタンスのデータストア固有のタイプ。" - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "" -"(オプション) クラスター内のあるインスタンスから他のインスタンスへの関係性を定" -"義するデータストア固有の値。" - -msgid "Optional host of user." -msgstr "(オプション) ユーザーのホスト。" - -msgid "Optional name of the instance." -msgstr "インスタンス名 (オプション)。" - -msgid "Optional parent backup" -msgstr "親バックアップ(省略可)" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "" -"オプションで、以前のバックアップまたは他のデータベースインスタンスのレプリカ" -"を使用してこのデータベースを作成するように選択することもできます。" - -msgid "Optionally provide a character set and collation for the database." -msgstr "" -"オプションで、このデータベースで使用する文字集合と照合順序を指定できます。" - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "" -"オプションで、作成するデータベースをコンマ区切りのリストで指定できます: " - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "" -"オプションで、このユーザーのホストと、このユーザーにアクセスを承認するデータ" -"ベースのリストを指定できます。" - -msgid "Overview" -msgstr "概要" - -msgid "PASSWORD" -msgstr "PASSWORD" - -msgid "Parameter" -msgstr "パラメーター" - -msgid "Parameters" -msgstr "パラメーター" - -msgid "Parent Backup" -msgstr "親バックアップ" - -msgid "Password" -msgstr "パスワード" - -msgid "Password (required)" -msgstr "パスワード (必須)" - -msgid "Password for root user must be specified." -msgstr "ルートユーザーのパスワードを指定する必要があります。" - -msgid "Password for root user." -msgstr "ルートユーザーのパスワード。" - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "" -"パスワードが表示されるのは、ルートを有効またはリセットした直後のみです。" - -msgid "" -"Please note: The new value must be greater than the existing volume " -"size." -msgstr "" -"注意: 新しいボリュームサイズは現在のサイズよりも大きくなければいけま" -"せん。" - -msgid "Promote" -msgstr "昇格" - -msgid "Promote to Replica Source" -msgstr "レプリカ元へ昇格" - -#, python-format -msgid "Promoted replica \"%s\" as the new replica source." -msgstr "レプリカ \"%s\" を新しいレプリカ元に昇格しました。" - -msgid "Property" -msgstr "プロパティー" - -msgid "Publish" -msgstr "公開" - -msgid "Publish Log" -msgid_plural "Publish Logs" -msgstr[0] "ログの公開" - -msgid "Publishable (bytes)" -msgstr "公開可能なバイト数" - -msgid "Published (bytes)" -msgstr "公開されたバイト数" - -msgid "Published Log" -msgid_plural "Published Logs" -msgstr[0] "ログを公開しました" - -msgid "RAM" -msgstr "メモリー" - -msgctxt "Current status of a Database Instance" -msgid "Rebooting" -msgstr "リブート中" - -msgid "Related To" -msgstr "関連付け先" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "インスタンスの削除" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "インスタンスを削除しました" - -msgid "Removed instances from cluster." -msgstr "クラスターからインスタンスを削除しました。" - -msgid "Replica Count" -msgstr "レプリカ数" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "レプリカが切断されました" - -msgid "Replicas" -msgstr "レプリカ" - -msgid "Replicate from Instance" -msgstr "インスタンスから複製" - -msgid "Replication" -msgstr "レプリケーション" - -msgid "Reset Parameters" -msgstr "パラメーターのリセット" - -msgid "Reset Root Password" -msgstr "ルートパスワードのリセット" - -msgid "Resize Database Instance" -msgstr "データベースインスタンスのリサイズ" - -msgid "Resize Database Volume" -msgstr "データベースボリュームのリサイズ" - -msgid "Resize Instance" -msgstr "インスタンスのリサイズ" - -msgid "Resize Volume" -msgstr "ボリュームのリサイズ" - -msgctxt "Current status of a Database Instance" -msgid "Resizing" -msgstr "リサイズ中" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "インスタンス \"%s\" をリサイズ中です" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "ボリューム \"%s\" をリサイズ中" - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "インスタンスの再起動" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "再起動が必要です" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "インスタンスを再起動しました" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "" -"インスタンスが再起動されると、永続ストレージに保存されていないデータはすべて" -"失われます。 " - -msgid "Restore Backup" -msgstr "バックアップのリストア" - -msgid "Restore from Backup" -msgstr "バックアップからのリストア" - -msgid "Return to Log List" -msgstr "ログの一覧に戻る" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "アクセスの取り消し" - -msgid "Root Enabled" -msgstr "ルートの有効化" - -msgid "Root Password" -msgstr "ルートパスワード" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "クラスター \"%s\" のルートパスワードを更新しました。" - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "保存中" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "クラスターの縮小を予約しました" - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "バックアップ \"%(name)s\" の作成を予約しました。" - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "クラスターの削除を予約しました" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "インスタンスの削除を予約しました。" - -msgid "Scheduled growing of cluster." -msgstr "クラスターの拡張を予約しました。" - -msgid "Select a backup to restore" -msgstr "リストアするバックアップを選択してください" - -msgid "Select a configuration group" -msgstr "設定グループを選択してください" - -msgid "Select a configuration group to attach to the database instance." -msgstr "このデータベースインスタンスに適用する設定グループを選択してください。" - -msgid "Select a master instance" -msgstr "マスターインスタンスを選択してください" - -msgid "Select a new flavor" -msgstr "新しいフレーバーを選択してください" - -msgid "Select a parameter and provide a value for the configuration parameter." -msgstr "パラメーターを選択して、設定パラメーターの値を指定してください。" - -msgid "Select backup" -msgstr "バックアップを選択してください" - -msgid "Select configuration" -msgstr "設定を選択してください" - -msgid "Select configuration group" -msgstr "設定グループを選択してください" - -msgid "Select datastore type and version" -msgstr "データストアの種別とバージョンを選択してください" - -msgid "Select instance" -msgstr "インスタンスを選択してください" - -msgid "Select parent backup" -msgstr "親バックアップを選択してください" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "クラスターから削除するインスタンスを選択してください。" - -msgid "Selected networks" -msgstr "選択済みネットワーク" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "クラスターの縮小" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "クラスターの縮小: {{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "クラスターの縮小は元に戻すことはできません。" - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "シャットダウン" - -msgid "Size" -msgstr "サイズ" - -msgid "Size of image to launch." -msgstr "起動するイメージの容量" - -msgid "Size of instance to launch." -msgstr "起動するインスタンスのサイズ。" - -msgid "Size of the volume in GB." -msgstr "GB 単位のボリュームサイズ" - -msgid "Source for Initial State" -msgstr "初期状態の元情報" - -msgid "Specify a new flavor for the database instance." -msgstr "データベースインスタンスの新しいフレーバーを指定します。" - -msgid "Specify a new name, new password or new host name for the user." -msgstr "" -"新しい名前、新しいパスワード、そのユーザーの新しいホスト名を指定してくださ" -"い。" - -msgid "Specify the details for launching an instance." -msgstr "インスタンスを起動するために詳細を指定します。" - -msgid "Specify the details for the database backup." -msgstr "データベースバックアップの詳細を指定します。" - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "クラスターに追加するインスタンスの詳細を指定してください。" - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"クラスターに追加するインスタンスを指定してください。追加するインスタンスをす" -"べて指定したら、「クラスターの拡張」をクリックして拡張操作を実行してくださ" -"い。" - -msgid "Specify the name of the new database." -msgstr "新しいデータベースの名前を指定してください。" - -msgid "Specify the name of the new user and password." -msgstr "新しいユーザーの名前とパスワードを指定してください。" - -msgid "Specify the new root password for vertica cluster." -msgstr "vertica クラスターの新しいルートパスワードを指定します。" - -msgid "Specify the new volume size for the database instance." -msgstr "データベースインスタンスのボリュームの新しいサイズを指定します。" - -msgid "Specify the number of replicas to be created" -msgstr "作成するレプリカ数を指定します。" - -msgid "" -"Specify whether instances in the cluster will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity)." -msgstr "" -"クラスター内のインスタンスが同じハイパーバイザーに作成されるか (affinity)、別" -"のハイパーバイザーに作成されるか (anti-affinity) を指定します。" - -msgid "Specs" -msgstr "スペック" - -msgid "Status" -msgstr "ステータス" - -msgid "Status if root was ever enabled for an instance." -msgstr "インスタンスでこれまでにルートが有効にされたことがあるかのスタータス。" - -msgid "Successfully added parameter" -msgstr "パラメーターを正常に追加しました" - -msgid "Successfully disabled root access." -msgstr "ルートアクセスを無効化しました。" - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"フィールド「インスタンスタイプ」と「関連付け先」はデータストア固有で、指定は" -"任意です。これらのフィールドの使い方に関する詳しい情報は Trove のドキュメント" -"を参照してください。" - -msgid "The flavor must be specified." -msgstr "フレーバーを指定する必要があります。" - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "" -"名前のフィールドはオプションです。このフィールドが空の場合、クラスターの拡張" -"時に名前が生成されます。" - -msgid "The number of instances must be greater than 1." -msgstr "インスタンス数は 1 より大きくなければいけません。" - -msgid "The number of shards must be greater than 1." -msgstr "シャード数は 1 より大きくなければいけません。" - -msgid "There was a problem enabling root." -msgstr "ルートの有効化中に問題がありました。" - -msgid "This action cannot be undone." -msgstr "この操作は取り消せません。" - -msgid "Type" -msgstr "種別" - -msgid "Type and version of datastore." -msgstr "データストアの種別とバージョン" - -msgid "USERNAME" -msgstr "USERNAME" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "%(action)s を実行できません: %(objs)s" - -#, python-format -msgid "Unable to add new parameter: %s" -msgstr "新しいパラメーターを追加できません: %s" - -#, python-format -msgid "Unable to attach configuration group. %s" -msgstr "設定グループを適用できません。 %s" - -#, python-format -msgid "Unable to create configuration group. %s" -msgstr "設定グループを作成できません。 %s" - -#, python-format -msgid "Unable to create database. %s" -msgstr "データベースを作成できません: %s" - -msgid "Unable to create list of parameters." -msgstr "パラメーターの一覧を作成できません。" - -#, python-format -msgid "Unable to create user. %s" -msgstr "ユーザーを作成できません。 %s" - -msgid "Unable to determine if instance root is enabled." -msgstr "インスタンスのルートが有効になっているか判定できません。" - -msgid "Unable to find backup!" -msgstr "バックアップが見つかりません!" - -msgid "Unable to find configuration group!" -msgstr "設定が見つかりません!" - -msgid "Unable to find master instance!" -msgstr "マスターインスタンスが見つかりません。" - -msgid "Unable to get configuration data." -msgstr "設定データを取得できません。" - -msgid "Unable to get database backup data." -msgstr "データベースバックアップの一覧を取得できません。" - -msgid "Unable to get databases data." -msgstr "データベースの一覧を取得できません。" - -msgid "Unable to get instances data." -msgstr "インスタンスのデータを取得できません。" - -msgid "Unable to get user access data." -msgstr "ユーザーのアクセスデータを取得できません。" - -msgid "Unable to get user data." -msgstr "ユーザーの一覧を取得できません。" - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "クラスターを拡張できません: %s" - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "クラスターを拡張できません: %s" - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "名前が \"%(name)s\" の %(count)s が起動できません。" - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "クラスターを起動できません。 %s" - -msgid "Unable to list database backups for parent." -msgstr "親バックアップとなるデータベースバックアップの一覧を取得できません。" - -msgid "Unable to list database instances to backup." -msgstr "バックアップ候補のデータベースインスタンスの一覧を取得できません。" - -msgid "" -"Unable to load {0} log\n" -"{1}" -msgstr "" -"{0} ログをロードできません\n" -"{1}" - -msgid "Unable to load {0} log for instance \"{1}\"." -msgstr "インスタンス \"{1}\" の {0} ログをロードできません。" - -msgid "Unable to obtain datastore versions." -msgstr "データストアのバージョン一覧を取得できません。" - -msgid "Unable to obtain datastores." -msgstr "データストア一覧を取得できません。" - -msgid "Unable to obtain flavors." -msgstr "フレーバー一覧を取得できません。" - -msgid "Unable to obtain information on root user" -msgstr "ルートユーザーの情報を取得できません。" - -msgid "Unable to obtain list of parameters." -msgstr "パラメーターの一覧を取得できません。" - -#, python-format -msgid "Unable to promote replica as the new replica source. \"%s\"" -msgstr "新しいレプリカ元としてレプリカを昇格できません。 \"%s\"" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "クラスターからインスタンスを削除できません: %s" - -#, python-format -msgid "Unable to reset password. %s" -msgstr "パスワードをリセットできません。 %s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "インスタンスをリサイズできません。 %s" - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "ボリュームをリサイズできません。%s" - -msgid "Unable to retrieve accessible databases." -msgstr "アクセス可能なデータベースの一覧を取得できません。" - -msgid "Unable to retrieve availability zones." -msgstr "アベイラビリティーゾーンを取得できません。" - -msgid "Unable to retrieve cluster details." -msgstr "クラスターの詳細を取得できません。" - -msgid "Unable to retrieve database clusters." -msgstr "データベースクラスターの一覧を取得できません。" - -msgid "Unable to retrieve database instances." -msgstr "データベースインスタンスを取得できません。" - -msgid "Unable to retrieve database size information." -msgstr "データベースのサイズ情報を取得できません。" - -msgid "Unable to retrieve databases." -msgstr "データベースの一覧を取得できません。" - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "バックアップの詳細を取得できません: %s" - -#, python-format -msgid "Unable to retrieve details for configuration group: %s" -msgstr "設定グループの詳細を取得できません: %s" - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "データベースクラスターの詳細を取得できません: %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "データベースインスタンスの詳細を取得できません: %s" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "親バックアップ %s の詳細を取得できません。" - -msgid "Unable to retrieve flavors." -msgstr "フレーバーの一覧を取得できません。" - -msgid "Unable to retrieve instance details." -msgstr "インスタンスの詳細を取得できません。" - -#, python-format -msgid "" -"Unable to retrieve list of logs.\n" -"%s" -msgstr "" -"ログの一覧を取得できません。\n" -"%s" - -msgid "Unable to retrieve networks." -msgstr "ネットワーク一覧を取得できません。" - -#, python-format -msgid "Unable to update user. %s" -msgstr "ユーザーを更新できません。 %s" - -msgid "Unknown" -msgstr "不明" - -msgid "Updated" -msgstr "更新日時" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "ユーザー \"%s\" を更新しました。" - -msgid "User Name" -msgstr "ユーザー名" - -msgid "Username (required)" -msgstr "ユーザー名 (必須)" - -msgid "Users" -msgstr "ユーザー" - -msgid "Value" -msgstr "値" - -msgid "Value must be \"true\" or \"false\"." -msgstr "値は True または False でなければなりません。" - -#, python-format -msgid "Value must be a number between %(min)s and %(max)s." -msgstr "値は %(min)s から %(max)s までの数字でなければなりません。" - -#, python-format -msgid "Value must be a number greater than or equal to %s." -msgstr "値は %s 以上でなければなりません。" - -#, python-format -msgid "Value must be a number less than or equal to %s." -msgstr "値は %s 以下でなければなりません。" - -msgid "Value must be a number." -msgstr "値は数字でなければなりません。" - -#, python-format -msgid "Value must be of type %s." -msgstr "値のタイプは %s でなければなりません。" - -msgid "Values" -msgstr "値" - -msgid "View Full Log" -msgstr "すべてのログの表示" - -msgid "View Log" -msgstr "ログの参照" - -msgid "Volume" -msgstr "ボリューム" - -msgid "Volume Size" -msgstr "ボリュームサイズ" - -msgid "Volume Type" -msgstr "ボリューム種別" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "%(action)s は許可されていません: %(objs)s" - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"親バックアップを指定することで差分バックアップを行うことができます。" -"ただし、すべてのデータベースが差分バックアップに対応しているわけでは" -"なく、その場合にはこのバックアップ操作はエラーになります。" - -msgid "You must select a datastore type and version." -msgstr "データストアの種別とバージョンを選択する必要があります。" - -msgid "You must select a flavor." -msgstr "フレーバーを選択しなければいけません。" - -msgid "You must specify a password if you create a user." -msgstr "ユーザーを作成する場合は、パスワードを指定する必要があります。" - -msgid "You must specify at least one database if you create a user." -msgstr "" -"ユーザーを作成する場合は、データベースを少なくとも 1 つ指定する必要がありま" -"す。" - -#, python-format -msgid "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" -msgstr "" -"[フレーバー=%(flavor)s, ボリューム=%(volume)s, 名前=%(name)s, タイプ=" -"%(type)s, 関連付け先=%(related_to)s, NIC(s)=%(nics)s]" - -msgid "instance" -msgstr "インスタンス" diff --git a/trove_dashboard/locale/ja/LC_MESSAGES/djangojs.po b/trove_dashboard/locale/ja/LC_MESSAGES/djangojs.po deleted file mode 100644 index c51abd4..0000000 --- a/trove_dashboard/locale/ja/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,39 +0,0 @@ -# Yoshiki Eguchi , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 7.0.0.0b3.dev14\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-08-26 11:48+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-09-02 02:19+0000\n" -"Last-Translator: Yoshiki Eguchi \n" -"Language-Team: Japanese\n" -"Language: ja\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=1; plural=0\n" - -msgid "Created" -msgstr "作成時刻" - -msgid "Database" -msgstr "データベース" - -msgid "Datastore" -msgstr "データストア" - -msgid "Datastore Version" -msgstr "データストアバージョン" - -msgid "Incremental" -msgstr "差分" - -msgid "Name" -msgstr "名前" - -msgid "Unable to retrieve the Backups." -msgstr "バックアップ一覧を取得できません。" - -msgid "status" -msgstr "ステータス" diff --git a/trove_dashboard/locale/ko_KR/LC_MESSAGES/django.po b/trove_dashboard/locale/ko_KR/LC_MESSAGES/django.po deleted file mode 100644 index 3ccd401..0000000 --- a/trove_dashboard/locale/ko_KR/LC_MESSAGES/django.po +++ /dev/null @@ -1,1424 +0,0 @@ -# Andreas Jaeger , 2016. #zanata -# Ian Y. Choi , 2016. #zanata -# Ian Y. Choi , 2017. #zanata -# Sungjin Kang , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 8.0.0.0rc2.dev1\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-02-03 10:29+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-02-03 06:05+0000\n" -"Last-Translator: Ian Y. Choi \n" -"Language-Team: Korean (South Korea)\n" -"Language: ko-KR\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=1; plural=0\n" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s RAM | 인스턴스 %(instances)s" - -msgid "-" -msgstr "-" - -msgid "" -"Please note: It may be necessary to reboot the database " -"instance for this new configuration group to take effect." -msgstr "" -"참고: 새로운 구성 그룹을 적용하기 위해 데이터베이스 인스턴스" -"를 재부팅할 필요가 있을 수 있습니다." - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -"주: 볼륨 크기 필드에 0보다 큰 값을 지정해야 하지만, 일부 구" -"성에서는 볼륨 크기를 지정할 수 없습니다. 볼륨 크기를 지정했을 때 볼륨 지원이 " -"사용되지 않음을 표시하는 메시지가 표시되면 0을 입력하십시오." - -msgid "A backup must be selected!" -msgstr "백업이 반드시 선택되어야 합니다!" - -msgid "A master instance must be selected!" -msgstr "마스터 인스턴스는 반드시 선택되어야 합니다!" - -msgid "A new name or new password or new host must be specified." -msgstr "새로운 이름이나 새로운 암호, 새로운 호스트를 지정할 수 있습니다." - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "접근 불가" - -msgid "Accessible" -msgstr "접근 가능한" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "Active" - -msgid "Add" -msgstr "추가" - -msgid "Add Instance" -msgstr "인스턴스 추가" - -msgid "Add Parameter" -msgstr "매개 변수 추가" - -msgid "" -"Add parameters to the configuration group. When all the parameters are " -"added click 'Apply Changes' to persist changes." -msgstr "" -"매개 변수를 구성 그룹에 추가하였습니다. 모든 매개 변수를 추가한 뒤에 변경 사" -"항을 유지하기 위해 '변경 사항 적용' 을 클릭합니다." - -msgid "Advanced" -msgstr "진보된" - -msgid "" -"Allow the user to connect from this host only. If not provided this user " -"will be allowed to connect from anywhere." -msgstr "" -"사용자가 이 호스트에서만 접근하도록 허용하십시오. 이 옵션을 제공하지 않으면 " -"사용자가 모든 위치에서 접근할 수 있습니다. " - -msgid "Allowed Host" -msgstr "허용한 호스트" - -msgid "Allowed Host (optional)" -msgstr "허용한 호스트(선택적)" - -msgid "Any Availability Zone" -msgstr "임의 가용 구역" - -msgid "Applicable only if the volume size is specified." -msgstr "볼륨 크기가 지정된 경우에만 적용됩니다." - -msgid "Applied changes to server" -msgstr "서버에 적용된 변경 사항" - -msgid "Apply Changes" -msgstr "변경 사항 적용" - -msgid "At least one of the new fields must be changed." -msgstr "적어도 새로운 필드 중 하나는 반드시 바뀌어야만한다." - -msgid "Attach Configuration Group" -msgstr "구성 그룹 연결" - -#, python-format -msgid "Attaching Configuration group \"%s\"" -msgstr "구성 그룹 \"%s\" 연결" - -msgid "Availability Zone" -msgstr "가용 구역" - -msgid "Available networks" -msgstr "사용 가능한 네트워크" - -msgid "Backup" -msgstr "백업" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "Backup" - -msgid "Backup Database" -msgstr "백업 데이터베이스" - -msgid "Backup Details" -msgstr "백업에 대한 세부 정보" - -msgid "Backup Details: {{ backup.name }}" -msgstr "백업 세부 정보: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "백업 사용 시간" - -msgid "Backup File" -msgstr "백업 파일" - -msgid "Backup File Location" -msgstr "백업 파일 위치" - -msgid "Backup Name" -msgstr "백업 이름" - -msgid "Backup Overview" -msgstr "백업 개요" - -msgid "Backups" -msgstr "백업" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "Blocked" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "Building" - -msgctxt "Current status of a Database Instance" -msgid "Building" -msgstr "Building" - -msgid "Cancel" -msgstr "취소" - -#, python-format -msgid "Cannot disable root access: %s" -msgstr "루트 액세스를 비활성화할 수 없습니다: %s" - -msgid "Cannot grow cluster. No instances specified." -msgstr "클러스터를 확장할 수 없습니다. 선택된 인스턴스가 없습니다." - -msgid "Character Set" -msgstr "Character Set" - -msgid "Choose a new instance flavor." -msgstr "새로운 인스턴스 flavor를 선택하세요." - -msgid "Choose initial state." -msgstr "초기 상태를 선택하십시오." - -msgid "Close" -msgstr "닫기" - -msgid "Cluster Name" -msgstr "클러스터 이름" - -msgid "Cluster Size" -msgstr "클러스터 크기" - -msgid "Clusters" -msgstr "클러스터" - -msgid "Collation" -msgstr "컬렉션" - -msgid "Comma separated list of databases to create" -msgstr "생성할 데이터베이스를 쉼표로 구분한 목록" - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "완료됨" - -msgid "Configuration Defaults" -msgstr "구성 디폴트" - -msgid "Configuration Group" -msgstr "구성 그룹" - -msgid "Configuration Group Details: {{configuration.name}}" -msgstr "구성 그룹 세부 사항: {{configuration.name}}" - -msgid "Configuration Group Instances" -msgstr "구성 그룹 인스턴스" - -msgid "Configuration Group Name" -msgstr "구성 그룹 이름" - -msgid "Configuration Group Overview" -msgstr "구성 그룹 개요" - -msgid "Configuration Group Values" -msgstr "구성 그룹 값" - -msgid "Configuration Groups" -msgstr "구성 그룹" - -msgid "" -"Confirm the current replica is to be promoted as the new replica source." -msgstr "현재 복제가 새로운 복제 원본으로 승격되었는지를 확인합니다." - -msgid "Connection Examples" -msgstr "연결 예제" - -msgid "Connection Information" -msgstr "연결 정보" - -msgid "Container" -msgstr "컨테이너" - -msgid "Create Backup" -msgstr "백업 생성" - -msgid "Create Configuration Group" -msgstr "구성 그룹 생성" - -msgid "Create Database" -msgstr "데이터베이스 생성" - -msgid "Create User" -msgstr "사용자 생성" - -msgid "" -"Create an optional initial user. This user will have access to all databases " -"you create." -msgstr "" -"선택적 초기 사용자를 작성하십시오. 이 초기 사용자는 사용자가 만든 모든 데이터" -"베이스에 액세스할 수 있습니다." - -msgid "Created" -msgstr "생성됨" - -msgid "Created configuration group" -msgstr "생성한 구성 그룹" - -#, python-format -msgid "Created database \"%s\"." -msgstr "데이터베이스 \"%s\"가 생성되었습니다." - -#, python-format -msgid "Created user \"%s\"." -msgstr "\"%s\" 사용자 생성되었습니다." - -msgid "Current Replica" -msgstr "현재 복제" - -msgid "Current Replica Source" -msgstr "현재 복제 원본" - -msgid "Current Size (GB)" -msgstr "현재 크기 (GB)" - -msgid "Current Task" -msgstr "현재 작업" - -msgid "DATABASE" -msgstr "DATABASE" - -msgid "Database" -msgstr "Database" - -msgid "Database Access" -msgstr "데이터베이스 접근" - -msgid "Database Access for: {{ user_name }}" -msgstr "사용자에 대한 데이터베이스 접근: {{ user_name }}" - -msgid "Database Backups" -msgstr "데이터베이스 백업" - -msgid "Database Info" -msgstr "데이터베이스 정보" - -msgid "Database Instance" -msgstr "데이터베이스 인스턴스" - -msgid "Database Name" -msgstr " 데이트베이스 이름" - -msgid "Database Port" -msgstr "데이터베이스 포트" - -msgid "Databases" -msgstr "데이터베이스" - -msgid "Datastore" -msgstr "Datastore" - -msgid "Datastore Version" -msgstr "Datastore 버전" - -msgid "Defaults" -msgstr "디폴트" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "백업 삭제" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "클러스터 삭제" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "데이터베이스 삭제" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "삭제 실패함" - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "인스턴스 삭제" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "사용자 삭제" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "백업 삭제됨" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "데이터베이스 삭제됨" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "사용자 삭제됨" - -msgid "Deleted cluster is not recoverable." -msgstr "삭제된 클러스터는 복구할 수 없습니다." - -msgid "Deleted instances are not recoverable." -msgstr "삭제된 인스턴스는 되살릴 수 없습니다." - -msgid "Description" -msgstr "설명" - -msgid "Detach Configuration Group" -msgid_plural "Detach Configuration Groups" -msgstr[0] "구성 그룹 연결 해제" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "복제본으로부터 해제" - -msgid "Detached Configuration Group" -msgid_plural "Detached Configuration Groups" -msgstr[0] "연결 해제된 구성 그룹" - -msgid "Details" -msgstr "상세 정보" - -msgid "Disable Log" -msgid_plural "Disable Logs" -msgstr[0] "로그 비활성화" - -msgid "Disable Root" -msgstr "루트 비활성화" - -msgid "Disabled Log" -msgid_plural "Disabled Logs" -msgstr[0] "비활성화된 로그" - -msgid "Discard Changes" -msgstr "변경 사항 폐기" - -msgid "Discard Log" -msgid_plural "Discard Logs" -msgstr[0] "로그 폐기" - -msgid "Discarded Log" -msgid_plural "Discarded Logs" -msgstr[0] "폐기된 로그" - -msgid "Download" -msgstr "내려받기" - -msgid "Download Backup" -msgstr "백업 다운로드" - -msgid "Edit User" -msgstr "사용자 수정" - -msgid "Eject Replica Source" -msgid_plural "Eject Replica Sources" -msgstr[0] "복제 원본 이젝트" - -msgid "Ejected Replica Source" -msgid_plural "Ejected Replica Sources" -msgstr[0] "이젝트된 복제 원본" - -msgid "Enable Log" -msgid_plural "Enable Logs" -msgstr[0] "로그 활성화" - -msgid "Enable Root" -msgstr "Root 활성화" - -msgid "Enabled Log" -msgid_plural "Enabled Logs" -msgstr[0] "활성화된 로그" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "Error" - -msgid "Error applying changes" -msgstr "변경 사항 적용 오류" - -msgid "Error creating database backup." -msgstr "데이터베이스 백업을 생성하던 중 오류가 발생하였습니다." - -msgid "Error deleting database on instance." -msgstr "인스턴스에서 데이터베이스 삭제중 에러가 발생하였습니다." - -#, python-format -msgid "Error downloading log file: %s" -msgstr "로그 파일 다운로드 오류: %s" - -msgid "Error getting configuration group list." -msgstr "구성 그룹 목록을 가져올 수 없습니다." - -msgid "Error getting database backup list." -msgstr "데이터베이스 백업 목록을 가져오던 중 오류가 발생하였습니다." - -#, python-format -msgid "Error resetting parameters: %s" -msgstr "매개 변수 리셋 중 오류 발생: %s" - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "실패함" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "Failed" - -msgid "Fault" -msgstr "Fault" - -msgid "Flavor" -msgstr "Flavor" - -msgid "GB" -msgstr "GB" - -msgid "Go" -msgstr "시작" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "접근 허용" - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "접근 허용 " - -msgid "Grow Cluster" -msgstr "클러스터 확장" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "클러스터 확장: {{cluster_name}}" - -msgid "Has Root Ever Been Enabled" -msgstr "루트가 활성화되어 있음" - -msgid "Host" -msgstr "호스트" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "사용자가 연결하도록 허용된 호스트 또는 IP입니다." - -msgid "ID" -msgstr "ID" - -msgid "Incremental" -msgstr "증분" - -msgid "Incremental Backup" -msgstr "증분 백업" - -msgid "Info" -msgstr "정보" - -msgid "Information" -msgstr "정보" - -msgid "Initial Admin User" -msgstr "초기 관리자" - -msgid "Initial Databases" -msgstr "초기 데이터베이스" - -msgid "Initial Volume Size" -msgstr "초기 볼륨 크기" - -msgid "Initial admin user to add" -msgstr "추가할 초기 관리자" - -msgid "Initialize Databases" -msgstr "데이터베이스 초기화" - -msgid "Instance Name" -msgstr "인스턴스 이름" - -msgid "Instance Type" -msgstr "인스턴스 타입" - -msgid "Instances" -msgstr "인스턴스" - -msgid "Is a Replica Of" -msgstr "복제본에 속함" - -msgid "Launch" -msgstr "실행" - -msgid "Launch Cluster" -msgstr "클러스터 실행" - -msgid "Launch Database" -msgstr "데이터베이스 시작" - -msgid "Launch Instance" -msgstr "인스턴스 시작" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "%(count)s개의 \"%(name)s\"이(가) 시작되었습니다." - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "클러스터 \"%s\" 구동됨" - -msgid "Locality" -msgstr "지역성" - -msgid "Log" -msgstr "로그" - -msgid "Log Contents" -msgstr "로그 내용" - -msgid "Log Length" -msgstr "로그 길이" - -msgid "Log length must be a nonnegative integer." -msgstr "로그 길이는 음수가 아닌 정수값이어야 합니다." - -msgid "Log: " -msgstr "로그:" - -msgid "Logs" -msgstr "로그" - -msgid "Manage Access" -msgstr "접근 관리" - -msgid "Manage Root" -msgstr "Root 관리" - -msgid "Manage Root Access" -msgstr "Root 접근 관리" - -msgid "Management Console" -msgstr "관리 콘솔" - -msgid "Master Instance Name" -msgstr "마스터 인스턴스 이름" - -msgid "Message" -msgstr "메시지" - -msgid "" -"Move networks from 'Available Networks' to 'Selected Networks' by clicking " -"the button, or dragging and dropping. You can change the NIC order by " -"dragging and dropping as well." -msgstr "" -"버튼을 클릭하거나 드래그 앤 드롭하여 '사용 가능한 네트워크'를 '선택한 네트워" -"크'로 이동합니다. 드래그 앤 드롭을 사용해서 NIC 순서 또한 변경 가능합니다." - -msgid "Name" -msgstr "이름" - -msgid "Network" -msgstr "네트워크" - -msgid "Network attached to instance." -msgstr "인스턴스에 네트워크 연결하였습니다." - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "New" - -msgid "New Flavor" -msgstr "새로운 Flavor" - -msgid "New Host" -msgstr "새 호스트" - -msgid "New Name" -msgstr "새 이름" - -msgid "New Password" -msgstr "새로운 암호" - -msgid "New Size (GB)" -msgstr "새로운 크기 (GB)" - -msgid "New password for cluster access." -msgstr "클러스터에 접근할 수 있는 새로운 암호를 설정합니다." - -msgid "New size for volume must be greater than current size." -msgstr "볼륨의 새로운 크기는 현재 크기보다 커야합니다." - -msgid "No availability zones found" -msgstr "가용 구역을 찾을 수 없습니다." - -msgid "No backups available" -msgstr "사용가능한 백업 없음" - -msgid "No configuration groups available" -msgstr "사용 가능한 구성 그룹이 없습니다" - -msgid "No configurations available" -msgstr "사용 가능한 구성이 없습니다" - -msgid "No flavors available" -msgstr "Flavor가 존재하지 않습니다" - -msgid "No instances available" -msgstr "사용 가능한 인스턴스가 없음" - -msgid "No volume type" -msgstr "볼륨 타입이 없음" - -msgid "None" -msgstr "None" - -msgid "Not Assigned" -msgstr "할당되지 않았습니다." - -msgid "Not Found" -msgstr "찾을 수 없음" - -msgid "Not available" -msgstr "사용할 수 없음" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "" -"주: 인스턴스에서 root 접근을 사용하십시오. root 사용자가 이미 사용되는 경우 " -"새 암호가 생성됩니다." - -msgid "Number of Instances" -msgstr "인스턴스 수" - -msgid "Number of Shards" -msgstr "Shard 개수" - -msgid "Number of instances in the cluster." -msgstr "클러스터에 있는 인스턴스 수" - -msgid "Number of instances in the cluster. (Read only)" -msgstr "클러스터에 존재하는 인스턴스 수. (읽기 전용)" - -msgid "Number of shards. (Read only)" -msgstr "Shard 개수 (읽기 전용)" - -msgid "Old Flavor" -msgstr "오래된 Flavor" - -msgid "Optional Backup Description" -msgstr "선택 백업 설명" - -msgid "Optional character set for the database." -msgstr "데이터베이스 character set을 선택합니다." - -msgid "Optional collation type for the database." -msgstr "데이터베이스에대한 컬렉션 타입은 옵션입니다." - -msgid "Optional comma separated list of databases user has access to." -msgstr "접근 가능한 데이터베이스 사용자는 쉼표로 구분하여 지정 가능합니다." - -msgid "Optional datastore specific type of the instance." -msgstr "인스턴스에 대한 datastore 특정 타입을 선택할 수 있습니다." - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "" -"다른 클러스터에서 하나의 인스턴스와 관계를 정의하는 datastore 고유 값을 선택" -"합니다." - -msgid "Optional host of user." -msgstr "사용자 호스트는 선택할 수 있습니다." - -msgid "Optional name of the instance." -msgstr "인스턴스 이름을 선택할 수 있습니다." - -msgid "Optional parent backup" -msgstr "선택가능한 부모 백업" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "" -"이 데이터베이스를 이전 백업을 사용하여 생성할지 아니면 다른 데이터베이스 인스" -"턴스의 복제본으로 생성할지 선택하십시오." - -msgid "Optionally provide a character set and collation for the database." -msgstr "선택적으로 데이터베이스의 문자 세트와 데이터 정렬을 제공하십시오." - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "선택적으로, 생성할 데이터베이스 목록을 쉼표로 구분하여 제공하십시오." - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "" -"선택적으로 사용자의 호스트와 사용자가 액세스 권한을 부여한 데이터베이스 목록" -"을 제공하십시오." - -msgid "Overview" -msgstr "개요" - -msgid "PASSWORD" -msgstr "PASSWORD" - -msgid "Parameter" -msgstr "매개 변수" - -msgid "Parameters" -msgstr "매개 변수" - -msgid "Parent Backup" -msgstr "부모 백업" - -msgid "Password" -msgstr "암호" - -msgid "Password (required)" -msgstr "패스워드(필수)" - -msgid "Password for root user must be specified." -msgstr "Root 사용자 암호가 지정되어야 합니다." - -msgid "Password for root user." -msgstr "Root 사용자 암호" - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "패스워드는 오직 root가 리셋,enabled된 이후에 즉시 보이기 시작한다." - -msgid "" -"Please note: The new value must be greater than the existing volume " -"size." -msgstr "참고: 새로운 값은 기존 볼륨 크기보다 커야 합니다." - -msgid "Promote" -msgstr "승격" - -msgid "Promote to Replica Source" -msgstr "복제 원본 승격" - -#, python-format -msgid "Promoted replica \"%s\" as the new replica source." -msgstr "복제 \"%s\" 를 새로운 복제 원본으로 승격합니다." - -msgid "Property" -msgstr "속성" - -msgid "Publish" -msgstr "퍼블리시" - -msgid "Publish Log" -msgid_plural "Publish Logs" -msgstr[0] "로그 퍼블리시" - -msgid "Publishable (bytes)" -msgstr "퍼블리시 가능 (바이트)" - -msgid "Published (bytes)" -msgstr "퍼블리시됨 (바이트)" - -msgid "Published Log" -msgid_plural "Published Logs" -msgstr[0] "퍼블리시된 로그" - -msgid "RAM" -msgstr "RAM" - -msgctxt "Current status of a Database Instance" -msgid "Rebooting" -msgstr "Rebooting" - -msgid "Related To" -msgstr "Related To" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "인스턴스 제거" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "인스턴스 제거됨" - -msgid "Removed instances from cluster." -msgstr "클러스터에서 인스턴스를 제거하였습니다." - -msgid "Replica Count" -msgstr "복제 개수" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "복제본으로부터 해제됨" - -msgid "Replicas" -msgstr "복제본" - -msgid "Replicate from Instance" -msgstr "인스턴스에서 복제" - -msgid "Replication" -msgstr "복제(Replication)" - -msgid "Reset Parameters" -msgstr "매개 변수 리셋" - -msgid "Reset Root Password" -msgstr "Root 암호 재설정" - -msgid "Resize Database Instance" -msgstr "데이터베이스 인스턴스 크기 재조정" - -msgid "Resize Database Volume" -msgstr "데이터베이스 볼륨 크기 조정" - -msgid "Resize Instance" -msgstr "인스턴스 크기 재조정" - -msgid "Resize Volume" -msgstr "볼륨 크기 재조정" - -msgctxt "Current status of a Database Instance" -msgid "Resizing" -msgstr "Resizing" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "인스턴스 \"%s\" 크기 재조정" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "볼륨 \"%s\" 크기 재조정" - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "인스턴스 재시작" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "Restart Required" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "인스턴스 재시작함" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "" -"재시작된 인스턴스에서 persistent 스토리지에 저장되지 않은 모든 데이터는 손실" -"됩니다." - -msgid "Restore Backup" -msgstr "백업 복구" - -msgid "Restore from Backup" -msgstr "백업으로부터 복구" - -msgid "Return to Log List" -msgstr "로그 목록으로 돌아가기" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "접근 불가" - -msgid "Root Enabled" -msgstr "Root 활성화됨" - -msgid "Root Password" -msgstr "Root 암호" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "\"%s\" 클러스터에 대한 root 암호를 업데이트 하였습니다." - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "저장 중" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "클러스터 예약 축소" - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "\"%(name)s\" 백업할 예정입니다." - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "클러스터 예약 삭제" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "인스턴스 예약 삭제" - -msgid "Scheduled growing of cluster." -msgstr "클러스터 예약 확장" - -msgid "Select a backup to restore" -msgstr "복원할 백업본 선택" - -msgid "Select a configuration group" -msgstr "구성 그룹 선택" - -msgid "Select a configuration group to attach to the database instance." -msgstr "데이터베이스 인스턴스에 연결할 구성 그룹을 선택합니다." - -msgid "Select a master instance" -msgstr "마스터 인스턴스 선택" - -msgid "Select a new flavor" -msgstr "새로운 flavor 선택" - -msgid "Select a parameter and provide a value for the configuration parameter." -msgstr "매개 변수를 선택하고 구성 매개 변수에 대한 값을 제공합니다." - -msgid "Select backup" -msgstr "백업 선택" - -msgid "Select configuration" -msgstr "구성 선택" - -msgid "Select configuration group" -msgstr "구성 그룹 선택" - -msgid "Select datastore type and version" -msgstr "Datastore 타입과 버전 선택" - -msgid "Select instance" -msgstr "인스턴스 선택" - -msgid "Select parent backup" -msgstr "부모 백업 선택" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "선택한 인스턴스를 클러스터에서 제거합니다." - -msgid "Selected networks" -msgstr "네트워크 선택됨" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "클러스터 축소" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "클러스터 축소: {{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "축소한 클러스터는 복구할 수 없습니다." - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "Shutdown" - -msgid "Size" -msgstr "크기" - -msgid "Size of image to launch." -msgstr "시작시 이미지 크기" - -msgid "Size of instance to launch." -msgstr "동작중인 인스턴스 크기" - -msgid "Size of the volume in GB." -msgstr "GB 볼륨 크기." - -msgid "Source for Initial State" -msgstr "초기 상태 원본" - -msgid "Specify a new flavor for the database instance." -msgstr "데이터베이스 인스턴스에 대한 새로운 flavor을 지정하라" - -msgid "Specify a new name, new password or new host name for the user." -msgstr "유저에 대한 새로운 이름, 패스워드, 호스트이름을 명시하라" - -msgid "Specify the details for launching an instance." -msgstr "인스턴스 실행에 대한 세부 정보를 지정하십시오." - -msgid "Specify the details for the database backup." -msgstr "데이터베이스 백업에 대한 세부 사항을 지정합니다." - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "클러스터에 추가하는 인스턴스의 세부 사항을 지정합니다." - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"지정한 인스턴스를 클러스터에 추가합니다. 'Grow Cluster'를 눌러 모든 인스턴스" -"에 확장 작업을 진행할 수 있습니다." - -msgid "Specify the name of the new database." -msgstr "새 데이터베이스의 이름을 지정하십시오." - -msgid "Specify the name of the new user and password." -msgstr "새로운 유저의 이름과 패스워드를 명시하라" - -msgid "Specify the new root password for vertica cluster." -msgstr "vertica 클러스터에 대한 새로운 root 암호를 지정합니다." - -msgid "Specify the new volume size for the database instance." -msgstr "데이터베이스 인스터스에 사용할 새로운 볼륨 크기를 지정합니다." - -msgid "Specify the number of replicas to be created" -msgstr "생성할 복제 개수를 지정합니다" - -msgid "" -"Specify whether future replicated instances will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity). This " -"value is ignored if the instance to be launched is a replica." -msgstr "" -"향후 복제된 인스턴스를 동일한 하이퍼바이저 (affinity) 또는 다른 하이퍼바이저 " -"(anti-affinity)에 생성할 것인지를 지정합니다. 해당 값은 구동되는 인스턴스가 " -"복제일 경우 무시되어질 수 있습니다." - -msgid "" -"Specify whether instances in the cluster will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity)." -msgstr "" -"클러스터 내 인스턴스를 동일한 하이퍼바이저 (affinity) 또는 다른 하이퍼바이저 " -"(anti-affinity)에 생성할 것인지를 지정합니다." - -msgid "Specs" -msgstr "사양" - -msgid "Status" -msgstr "상태" - -msgid "Status if root was ever enabled for an instance." -msgstr "인스턴스에 대해 root가 사용으로 설정된 경우 상태입니다." - -msgid "Successfully added parameter" -msgstr "매개 변수 추가를 완료하였습니다" - -msgid "Successfully disabled root access." -msgstr "루트 액세스 비활성화 성공" - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"'Instance Type'와 'Related To' 필드는 datastore를 지정하거나 옵션으로 설정할 " -"수 있습니다. 필드 사용에대한 자세한 내용은 Trove 문서를 참고하십시오." - -msgid "The flavor must be specified." -msgstr "Flabor가 지정되어야 합니다." - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "" -"이름 필드는 옵션입니다. 필드를 비워두면 클러스터를 키울때 이름을 생성합니" -"다." - -msgid "The number of instances must be greater than 1." -msgstr "인스턴스는 1개 이상이어야 합니다." - -msgid "The number of shards must be greater than 1." -msgstr "Shard는 1개 이상이어야 합니다." - -msgid "There was a problem enabling root." -msgstr "Root 계정 활성화에 문제가 발생했습니다." - -msgid "This action cannot be undone." -msgstr "이 작업은 취소할 수 없습니다." - -msgid "Type" -msgstr "타입" - -msgid "Type and version of datastore." -msgstr "Datastore 타입과 버전" - -msgid "USERNAME" -msgstr "USERNAME" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "%(action)s 할 수 없습니다: %(objs)s" - -#, python-format -msgid "Unable to add new parameter: %s" -msgstr "새로운 매개 변수: %s 를 추가할 수 없습니다" - -#, python-format -msgid "Unable to attach configuration group. %s" -msgstr "구성 그룹을 연결할 수 없습니다. %s" - -#, python-format -msgid "Unable to create configuration group. %s" -msgstr "구성 그룹을 생성할 수 없습니다. %s" - -#, python-format -msgid "Unable to create database. %s" -msgstr "데이터베이스 %s를 생성할 수 없음" - -msgid "Unable to create list of parameters." -msgstr "매개 변수 목록을 생성할 수 없습니다." - -#, python-format -msgid "Unable to create user. %s" -msgstr "\"%s\" 사용자를 생성할 수 없습니다." - -msgid "Unable to determine if instance root is enabled." -msgstr "만약 인스턴스 루트가 이용 가능하다면 결정이 불가능하다" - -msgid "Unable to find backup!" -msgstr "백업을 찾을 수 없습니다!" - -msgid "Unable to find configuration group!" -msgstr "구성 그룹을 찾을 수 없습니다!" - -msgid "Unable to find master instance!" -msgstr "마스터 인스턴스를 찾기가 불가능합니다!" - -msgid "Unable to get configuration data." -msgstr "구성 데이터를 가져올 수 없습니다." - -msgid "Unable to get database backup data." -msgstr "데이터베이스 백업 데이터를 가져올 수 없습니다." - -msgid "Unable to get databases data." -msgstr "데이터베이스 데이터를 가져올 수 없습니다." - -msgid "Unable to get instances data." -msgstr "인스턴스 데이터를 가져올 수 없습니다." - -msgid "Unable to get user access data." -msgstr "사용자 접속 데이터를 가져올 수 없습니다." - -msgid "Unable to get user data." -msgstr "사용자 데이터를 가져올 수 없습니다." - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "클러스터를 늘릴 수 없습니다. %s" - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "클러스터를 늘릴 수 없습니다: %s" - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "%(count)s 개의 \"%(name)s\"을 구동할 수 없습니다." - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "클러스터 \"%s\"를 구동할 수 없습니다." - -msgid "Unable to list database backups for parent." -msgstr "부모 데이터베이스 백업을 나열할 수 없습니다." - -msgid "Unable to list database instances to backup." -msgstr "백업 데이터베이스 인스턴스를 나열할 수 없습니다." - -msgid "" -"Unable to load {0} log\n" -"{1}" -msgstr "" -"{0} 로그를 불러올 수 없습니다\n" -"{1}" - -msgid "Unable to load {0} log for instance \"{1}\"." -msgstr "인스턴스 \"{1}\" 에 대한 {0} 로그를 불러올 수 없습니다." - -msgid "Unable to obtain datastore versions." -msgstr "Datastore 버전을 가져올 수 없습니다." - -msgid "Unable to obtain datastores." -msgstr "Datastore를 가져올 수 없습니다." - -msgid "Unable to obtain flavors." -msgstr "Flavor을 가져올 수 없습니다." - -msgid "Unable to obtain information on root user" -msgstr "Root 사용자의 정보를 얻을 수 없습니다" - -msgid "Unable to obtain list of parameters." -msgstr "매개 변수 목록을 가져올 수 없습니다." - -#, python-format -msgid "Unable to promote replica as the new replica source. \"%s\"" -msgstr "복제를 새로운 복제 원본으로 승격할 수 없습니다. \"%s\"" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "클러스터에서 인스턴스를 제거하지 못 하였습니다: %s" - -#, python-format -msgid "Unable to reset password. %s" -msgstr "암호를 재설정하지 못하였습니다. %s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "인스턴스 크기 재조정 실패. %s" - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "볼륨 크기를 변경할 수 없습니다. %s" - -msgid "Unable to retrieve accessible databases." -msgstr "접근 가능한 데이터베이스를 찾지 못 했습니다." - -msgid "Unable to retrieve availability zones." -msgstr "가용 구역을 가져올 수 없습니다." - -msgid "Unable to retrieve cluster details." -msgstr "클러스터 세부 정보를 찾지 못했습니다." - -msgid "Unable to retrieve database clusters." -msgstr "클러스터 데이터베이스를 찾지 못했습니다." - -msgid "Unable to retrieve database instances." -msgstr "인스턴스 데이터베이스를 찾지 못 했습니다." - -msgid "Unable to retrieve database size information." -msgstr "데이터베이스 크기 정보를 찾지 못했습니다." - -msgid "Unable to retrieve databases." -msgstr "데이터베이스를 찾지 못 했습니다." - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "백업에 대한 세부 정보를 찾지 못했습니다: %s" - -#, python-format -msgid "Unable to retrieve details for configuration group: %s" -msgstr "구성 그룹: %s 에 대한 세부 사항을 가져올 수 없습니다" - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "클러스터 데이터베이스에 대한 세부 정보를 찾지 못했습니다: %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "인스턴스 데이터베이스에 대한 세부 정보를 찾지 못 했습니다: %s" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "원본 백업에 대한 세부 정보를 찾지 못했습니다: %s" - -msgid "Unable to retrieve flavors." -msgstr "Flavor를 찾지 못 했습니다." - -msgid "Unable to retrieve instance details." -msgstr "인스턴스 세부 정보를 찾지 못 했습니다." - -#, python-format -msgid "" -"Unable to retrieve list of logs.\n" -"%s" -msgstr "" -"로그 목록을 가져올 수 없습니다.\n" -"%s" - -msgid "Unable to retrieve networks." -msgstr "네트워크를 찾지 못 했습니다." - -#, python-format -msgid "Unable to update user. %s" -msgstr "\"%s\" 사용자를 업데이트할 수 없습니다." - -msgid "Unknown" -msgstr "알 수 없음" - -msgid "Updated" -msgstr "업데이트 완료" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "\"%s\" 사용자 업데이트 되었습니다." - -msgid "User Name" -msgstr "사용자 이름" - -msgid "Username (required)" -msgstr "사용자이름(필수)" - -msgid "Users" -msgstr "사용자" - -msgid "Value" -msgstr "값" - -msgid "Value must be \"true\" or \"false\"." -msgstr "값은 \"true\" 또는 \"false\" 여야 합니다." - -#, python-format -msgid "Value must be a number between %(min)s and %(max)s." -msgstr "값은 %(min)s 에서 %(max)s 사이 숫자여야 합니다." - -#, python-format -msgid "Value must be a number greater than or equal to %s." -msgstr "값은 %s 보다 크거나 같은 숫자여야 합니다." - -#, python-format -msgid "Value must be a number less than or equal to %s." -msgstr "값은 %s 보다 작거나 같은 숫자여야 합니다." - -msgid "Value must be a number." -msgstr "값은 숫자여야 합니다." - -#, python-format -msgid "Value must be of type %s." -msgstr "값은 %s 유형이어야 합니다." - -msgid "Values" -msgstr "값" - -msgid "View Full Log" -msgstr "전체 로그 보기" - -msgid "View Log" -msgstr "로그 보기" - -msgid "Volume" -msgstr "볼륨" - -msgid "Volume Size" -msgstr "볼륨 크기" - -msgid "Volume Type" -msgstr "볼륨 타입" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "%(action)s 이(가) 허용되지 않았습니다: %(objs)s " - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"부모 백업을 지정하여 증분 백업으로 작업을 진행할 수 있습니다. 그러나" -", 모든 데이터베이스에서 오류가 발생되는 경우에는 증분 백업을 지원하" -"지 않습니다." - -msgid "You must select a datastore type and version." -msgstr "Datastore 타입과 버전을 선택해야 합니다." - -msgid "You must select a flavor." -msgstr "Flavor를 선택해야 합니다." - -msgid "You must specify a password if you create a user." -msgstr "사용자 생성을 하려면 패스워드를 입력하세요" - -msgid "You must specify at least one database if you create a user." -msgstr "사용자 생성을 하려면 적어도 하나의 데이터베이스를 정하세요" - -#, python-format -msgid "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" -msgstr "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" - -msgid "instance" -msgstr "인스턴스" diff --git a/trove_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po b/trove_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po deleted file mode 100644 index 82611a3..0000000 --- a/trove_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,39 +0,0 @@ -# Ian Y. Choi , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 7.0.0.0b4.dev15\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-09-13 18:48+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-09-14 05:49+0000\n" -"Last-Translator: \n" -"Language-Team: Korean (South Korea)\n" -"Language: ko-KR\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=1; plural=0\n" - -msgid "Created" -msgstr "생성됨" - -msgid "Database" -msgstr "데이터베이스" - -msgid "Datastore" -msgstr "데이터 저장소" - -msgid "Datastore Version" -msgstr "데이버 저장소 버전" - -msgid "Incremental" -msgstr "증분" - -msgid "Name" -msgstr "이름" - -msgid "Unable to retrieve the Backups." -msgstr "백업을 가져올 수 없습니다." - -msgid "status" -msgstr "상태" diff --git a/trove_dashboard/locale/pt_BR/LC_MESSAGES/django.po b/trove_dashboard/locale/pt_BR/LC_MESSAGES/django.po deleted file mode 100644 index 04eaa0f..0000000 --- a/trove_dashboard/locale/pt_BR/LC_MESSAGES/django.po +++ /dev/null @@ -1,1035 +0,0 @@ -# Andreas Jaeger , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 8.0.0.0b3.dev9\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-01-10 19:59+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-03-15 04:05+0000\n" -"Last-Translator: Marcelo Dieder \n" -"Language-Team: Portuguese (Brazil)\n" -"Language: pt-BR\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s RAM | %(instances)s instâncias" - -msgid "-" -msgstr "-" - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -"Por favor observe: O valor especificado no campo Tamanho do " -"Volume deve ser maior que 0, entretanto, algumas configurações não suportam " -"especificar o tamanho de volume. Se especificar o volume resultar em um erro " -"dizendo que o suporte de volume não está habilitado, digite 0." - -msgid "A backup must be selected!" -msgstr "Um backup deve ser selecionado!" - -msgid "A master instance must be selected!" -msgstr "Uma instância mestre deve ser selecionada!" - -msgid "A new name or new password or new host must be specified." -msgstr "Um novo nome ou uma nova senha ou um novo host deve ser especificado." - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "Acesso Removido para" -msgstr[1] "Acessos Removidos para" - -msgid "Accessible" -msgstr "Acessível" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "Ativo" - -msgid "Add" -msgstr "Adicionar" - -msgid "Add Instance" -msgstr "Adicionar Instância" - -msgid "Advanced" -msgstr "Avançado" - -msgid "Allowed Host" -msgstr "Host Permitido" - -msgid "Allowed Host (optional)" -msgstr "Host Permitido (opcional)" - -msgid "Applicable only if the volume size is specified." -msgstr "Aplicável apenas se o tamanho do volume é especificado." - -msgid "At least one of the new fields must be changed." -msgstr "Pelo menos um dos novos campos deve ser alterado." - -msgid "Available networks" -msgstr "Redes disponíveis" - -msgid "Backup" -msgstr "Backup" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "Backup" - -msgid "Backup Database" -msgstr "Fazer Backup da Base de Dados" - -msgid "Backup Details" -msgstr "Detalhes do Backup" - -msgid "Backup Details: {{ backup.name }}" -msgstr "Detalhes do Backup: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "Duração do Backup" - -msgid "Backup File" -msgstr "Arquivo de Backup" - -msgid "Backup File Location" -msgstr "Localização do Arquivo de Backup" - -msgid "Backup Name" -msgstr "Nome do Backup" - -msgid "Backup Overview" -msgstr "Visão Geral do Backup" - -msgid "Backups" -msgstr "Backups" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "Bloqueado" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "Construindo" - -msgid "Cancel" -msgstr "Cancelar" - -msgid "Cannot grow cluster. No instances specified." -msgstr "Não é possível aumentar Cluster. Nenhuma instância especificada." - -msgid "Character Set" -msgstr "Codificação de Caracteres" - -msgid "Choose a new instance flavor." -msgstr "Escolha um novo Flavor para a instância." - -msgid "Choose initial state." -msgstr "Escolha o estado inicial" - -msgid "Cluster Name" -msgstr "Nome do Cluster" - -msgid "Cluster Size" -msgstr "Tamanho do Cluster" - -msgid "Clusters" -msgstr "Clusters" - -msgid "Collation" -msgstr "Regras de comparação" - -msgid "Comma separated list of databases to create" -msgstr "Lista separada por vírgula de bases de dados a se criar." - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "Completo" - -msgid "Connection Examples" -msgstr "Exemplos de Conexão" - -msgid "Connection Information" -msgstr "Informação de Conexão" - -msgid "Create Backup" -msgstr "Criar Backup" - -msgid "Create Database" -msgstr "Criar Banco de Dados" - -msgid "Create User" -msgstr "Criar Usuário" - -msgid "Created" -msgstr "Criado" - -#, python-format -msgid "Created database \"%s\"." -msgstr "Criada base de dados \"%s\"." - -#, python-format -msgid "Created user \"%s\"." -msgstr "Criado usuário \"%s\"." - -msgid "Current Size (GB)" -msgstr "Tamanho Atual (GB)" - -msgid "Current Task" -msgstr "Tarefa Atual" - -msgid "DATABASE" -msgstr "BANCO DE DADOS" - -msgid "Database" -msgstr "Base de dados" - -msgid "Database Access" -msgstr "Acesso ao Banco de Dados" - -msgid "Database Access for: {{ user_name }}" -msgstr "Acesso ao Banco de Dados para: {{user_name}}" - -msgid "Database Backups" -msgstr "Backups da Base de Dados" - -msgid "Database Info" -msgstr "Informações da Base de Dados" - -msgid "Database Instance" -msgstr "Instância de Base de Dados" - -msgid "Database Name" -msgstr "Nome da Base de Dados" - -msgid "Database Port" -msgstr "Porta da Base de Dados" - -msgid "Databases" -msgstr "Bases de Dados" - -msgid "Datastore" -msgstr "Datastore" - -msgid "Datastore Version" -msgstr "Versão Datastore" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "Excluir Backup" -msgstr[1] "Excluir Backups" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "Excluir Cluster" -msgstr[1] "Excluir Clusters" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "Excluir Banco de Dados" -msgstr[1] "Excluir Bancos de Dados" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "Falha na Exclusão." - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "Excluir Instância" -msgstr[1] "Excluir Instâncias" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "Excluir Usuário" -msgstr[1] "Excluir Usuários" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "Backup Excluído" -msgstr[1] "Backups Excluídos" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "Banco de Dados Excluídos" -msgstr[1] "Bancos de Dados Excluídos" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "Usuário Excluído" -msgstr[1] "Usuários Excluídos" - -msgid "Deleted cluster is not recoverable." -msgstr "Cluster excluído não é recuperável." - -msgid "Deleted instances are not recoverable." -msgstr "Instâncias excluídas não são recuperáveis." - -msgid "Description" -msgstr "Descrição" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "Desanexar Réplica" -msgstr[1] "Desanexar Réplicas" - -msgid "Details" -msgstr "Detalhes" - -msgid "Download" -msgstr "Baixar" - -msgid "Download Backup" -msgstr "Download do Backup" - -msgid "Edit User" -msgstr "Editar Usuário" - -msgid "Enable Root" -msgstr "Habilitar Raiz" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "Erro" - -msgid "Error creating database backup." -msgstr "Erro criando backup da base de dados." - -msgid "Error deleting database on instance." -msgstr "Erro excluindo base de dados na instância." - -msgid "Error getting database backup list." -msgstr "Erro buscando lista de backup da base de dados." - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "Falhou" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "Falhou" - -msgid "Flavor" -msgstr "Flavor" - -msgid "GB" -msgstr "GB" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "Conceder Acesso" -msgstr[1] "Conceder Acessos" - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "Acesso Concedido para" -msgstr[1] "Acessos Concedidos para" - -msgid "Grow Cluster" -msgstr "Aumentar Cluster" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "Aumentar Cluster: {{cluster_name}}" - -msgid "Host" -msgstr "Host" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "Host ou IP através do qual o usuário pode conectar-se." - -msgid "ID" -msgstr "ID" - -msgid "Incremental" -msgstr "Incremental" - -msgid "Incremental Backup" -msgstr "Incremental Backup" - -msgid "Information" -msgstr "Informação" - -msgid "Initial Admin User" -msgstr "Usuário Inicial Admin" - -msgid "Initial Databases" -msgstr "Bancos de dados iniciais" - -msgid "Initial Volume Size" -msgstr "Tamanho do Volume Inicial" - -msgid "Initial admin user to add" -msgstr "Usuário admin inicial a se adicionar" - -msgid "Initialize Databases" -msgstr "Inicializar Bases de dados" - -msgid "Instance Name" -msgstr "Nome da instância" - -msgid "Instance Type" -msgstr "Tipo da Instância" - -msgid "Instances" -msgstr "Instâncias" - -msgid "Is a Replica Of" -msgstr "É uma réplica do" - -msgid "Launch" -msgstr "Disparar" - -msgid "Launch Cluster" -msgstr "Iniciar Cluster" - -msgid "Launch Database" -msgstr "Disparar Base de Dados" - -msgid "Launch Instance" -msgstr "Disparar Instância" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "Disparadas %(count)s chamadas \"%(name)s\"." - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "Cluster iniciado \"%s\"" - -msgid "Manage Access" -msgstr "Gerenciar Acesso" - -msgid "Manage Root" -msgstr "Gerenciar Root" - -msgid "Manage Root Access" -msgstr "Gerenciar Acesso Raiz" - -msgid "Management Console" -msgstr "Console de Gerenciamento" - -msgid "Master Instance Name" -msgstr "Nome da Instância Mestre" - -msgid "Name" -msgstr "Nome" - -msgid "Network" -msgstr "Rede" - -msgid "Network attached to instance." -msgstr "Rede anexada para a instância." - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "Novo" - -msgid "New Flavor" -msgstr "Flavor Novo" - -msgid "New Host" -msgstr "Novo Host" - -msgid "New Name" -msgstr "Novo Nome" - -msgid "New Password" -msgstr "Nova Senha" - -msgid "New Size (GB)" -msgstr "Novo Tamanho (GB)" - -msgid "New password for cluster access." -msgstr "Nova senha para o acesso ao cluster." - -msgid "New size for volume must be greater than current size." -msgstr "Novo tamanho para o volume tem de ser maior do que o tamanho atual." - -msgid "No backups available" -msgstr "Não há backups disponíveis" - -msgid "No flavors available" -msgstr "Nenhum flavor disponível." - -msgid "No instances available" -msgstr "Não há instâncias disponíveis" - -msgid "No volume type" -msgstr "Nenhum tipo de volume" - -msgid "None" -msgstr "Nenhum" - -msgid "Not Assigned" -msgstr "Não Atribuído" - -msgid "Not Found" -msgstr "Não encontrado" - -msgid "Not available" -msgstr "Não disponível" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "" -"Nota: Habilite o acesso root em uma instância. Se o acesso root já estiver " -"habilitado um novo password será gerado." - -msgid "Number of Instances" -msgstr "Número de Instâncias" - -msgid "Number of Shards" -msgstr "Numero de Shards" - -msgid "Number of instances in the cluster." -msgstr "Número de Instâncias no cluster." - -msgid "Number of instances in the cluster. (Read only)" -msgstr "Número de instâncias no cluster. (Somente leitura)" - -msgid "Number of shards. (Read only)" -msgstr "Numero de Shards. (Somente leitura)" - -msgid "Old Flavor" -msgstr "Flavor antigo" - -msgid "Optional Backup Description" -msgstr "Descrição Opcional de Backup" - -msgid "Optional character set for the database." -msgstr "Codificação de caracteres opcional para a base de dados." - -msgid "Optional collation type for the database." -msgstr "Tipo de regra de comparação opcional para a base de dados." - -msgid "Optional comma separated list of databases user has access to." -msgstr "" -"Lista opcional de bancos de dados, separada por vírgula, que o usuário tem " -"acesso." - -msgid "Optional datastore specific type of the instance." -msgstr "Tipo específico de datastore opcional da instância." - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "" -"Valor específico de datastore opcional, que define a relação entre uma " -"instância no cluster com outra instância" - -msgid "Optional host of user." -msgstr "Host opcional do usuário." - -msgid "Optional name of the instance." -msgstr "Nome opcional da instância" - -msgid "Optional parent backup" -msgstr "Backup pai Opcional" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "" -"Opcionalmente pode-se optar por criar esse banco de dados usando um backup " -"anterior, ou como uma réplica de outra instância de banco de dados." - -msgid "Optionally provide a character set and collation for the database." -msgstr "" -"Forneça opcionalmente um conjunto de caracteres e regras de ordenação para a " -"base de dados." - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "" -"Opcionalmente forneça uma lista separada por vírgula das bases de dados a " -"criar:" - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "" -"Opcionalmente, forneça o host do usuário e uma lista de bases de dados que o " -"usuário possui acesso." - -msgid "Overview" -msgstr "Visão Geral" - -msgid "PASSWORD" -msgstr "SENHA" - -msgid "Parent Backup" -msgstr "Backup pai" - -msgid "Password" -msgstr "Senha" - -msgid "Password (required)" -msgstr "Senha (requerido)" - -msgid "Password for root user must be specified." -msgstr "Senha para o usuário de root deve ser especificada." - -msgid "Password for root user." -msgstr "Senha para o usuário root." - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "" -"A senha é apenas visível imediatamente após o root ser habilitado ou " -"redefinido." - -msgid "RAM" -msgstr "RAM" - -msgid "Related To" -msgstr "Relacionado a" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "Remover Instância" -msgstr[1] "Remover Instâncias" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "Instância Removida" -msgstr[1] "Instâncias Removidas" - -msgid "Removed instances from cluster." -msgstr "Removido instâncias do Cluster" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "Réplica Desanexada" -msgstr[1] "Réplicas Desanexadas" - -msgid "Replicas" -msgstr "Réplicas" - -msgid "Replicate from Instance" -msgstr "Replicar da Instância" - -msgid "Replication" -msgstr "Replicação" - -msgid "Reset Root Password" -msgstr "Redefinição da Senha Root" - -msgid "Resize Database Instance" -msgstr "Redimensionar Instância de Banco de Dados" - -msgid "Resize Database Volume" -msgstr "Redimensionar Volume de banco de dados" - -msgid "Resize Instance" -msgstr "Redimensionar Instância" - -msgid "Resize Volume" -msgstr "Redimensionar volume" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "Redimensionando a instância \"%s\"" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "Redimensionando volume \"%s\"" - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "Reiniciar Instância" -msgstr[1] "Reiniciar Instâncias" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "Reinicio Requerido" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "Instância Reiniciada" -msgstr[1] "Instâncias Reiniciadas" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "" -"Instâncias reiniciadas perderão todos os dados não salvos no armazenamento " -"persistente." - -msgid "Restore Backup" -msgstr "Restaurar Backup" - -msgid "Restore from Backup" -msgstr "Recuperar do Backup" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "Remover Acesso" -msgstr[1] "Remover Acessos" - -msgid "Root Enabled" -msgstr "Root Habilitado" - -msgid "Root Password" -msgstr "Senha Root" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "Senha de Root atualizada para o cluster \"%s\"" - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "Salvando" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "Agendamento de encolhimento do Cluster" -msgstr[1] "Agendamento de encolhimento dos Clusters" - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "Backup \"%(name)s\" agendado." - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "Exclusão agendada de Cluster" -msgstr[1] "Exclusão agendada de Clusters" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "Exclusão agendada de Instância" -msgstr[1] "Exclusão agendada de Instâncias" - -msgid "Scheduled growing of cluster." -msgstr "Agendado o aumento do cluster." - -msgid "Select a backup to restore" -msgstr "Selecione um Backup para Restaurar" - -msgid "Select a master instance" -msgstr "Selecione a instância mestre" - -msgid "Select a new flavor" -msgstr "Selecione um novo flavor" - -msgid "Select backup" -msgstr "Selecionar Backup" - -msgid "Select datastore type and version" -msgstr "Selecione o tipo de armazenamento de dados e versão" - -msgid "Select instance" -msgstr "Selecione uma instância" - -msgid "Select parent backup" -msgstr "Selecione o backup pai" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "Selecione a(s) intância(s) que serão removidas do cluster." - -msgid "Selected networks" -msgstr "Redes Selecionadas" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "Encolher Cluster" -msgstr[1] "Encolher Clusters" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "Encolher Cluster: {{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "Cluster encolhido não é recuperável." - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "Desligar" - -msgid "Size" -msgstr "Tamanho" - -msgid "Size of image to launch." -msgstr "Tamanho da imagem a disparar." - -msgid "Size of instance to launch." -msgstr "Tamanho da instância para iniciar." - -msgid "Size of the volume in GB." -msgstr "Tamanho do volume em GB." - -msgid "Source for Initial State" -msgstr "Origem do Estado inicial" - -msgid "Specify a new flavor for the database instance." -msgstr "Especifique um novo sabor para a instância do banco de dados." - -msgid "Specify a new name, new password or new host name for the user." -msgstr "" -"Especifique um novo nome, nova senha ou novo nome de host para o usuário." - -msgid "Specify the details for launching an instance." -msgstr "Especifique os detalhes para disparar uma instância." - -msgid "Specify the details for the database backup." -msgstr "Especifique os detalhes para o backup do banco de dados." - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "Especifique os detalhes da instância a ser adicionada ao cluster." - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"Especifique as instâncias que serão adicionadas ao cluster. Quando todas as " -"instâncias estiverem especificadas, clique em 'Aumentar Cluster' para " -"executar a operação de aumento." - -msgid "Specify the name of the new database." -msgstr "Especifique o nome da nova base de dados." - -msgid "Specify the name of the new user and password." -msgstr "Especifique o nome e senha o novo usuário." - -msgid "Specify the new root password for vertica cluster." -msgstr "Especifique a nova senha de root para o vertica cluster." - -msgid "Specify the new volume size for the database instance." -msgstr "" -"Especifique o novo tamanho do volume para a instância de banco de dados." - -msgid "Specs" -msgstr "Especificações" - -msgid "Status" -msgstr "Status" - -msgid "Status if root was ever enabled for an instance." -msgstr "Situação se o root sempre foi habilitado para uma instância." - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"O 'Tipo de Instância' e 'Relacionados' campos são armazenamento de dados " -"específico e opcional. Consulte a documentação do Trove para obter mais " -"informações sobre como usar esses campos." - -msgid "The flavor must be specified." -msgstr "O flavor deve ser especificado." - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "" -"O campo de nome é opcional. Se o campo ficar em branco um nome será gerado " -"quando o cluster for criado." - -msgid "The number of instances must be greater than 1." -msgstr "O número de instâncias precisa ser maior que 1." - -msgid "The number of shards must be greater than 1." -msgstr "O número de shards precisar ser maior que 1." - -msgid "There was a problem enabling root." -msgstr "Houve um problema ao habilitar raiz." - -msgid "Type" -msgstr "Tipo" - -msgid "Type and version of datastore." -msgstr "Tipo e versão do armazenamento de dados." - -msgid "USERNAME" -msgstr "USUÁRIO" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Não foi possível %(action)s: %(objs)s" - -#, python-format -msgid "Unable to create database. %s" -msgstr "Não foi possível criar base de dados: %s" - -#, python-format -msgid "Unable to create user. %s" -msgstr "Não é possível criar usuário. %s" - -msgid "Unable to determine if instance root is enabled." -msgstr "Não foi possível determinar se o root está habilitado na instância" - -msgid "Unable to find backup!" -msgstr "Não foi possível encontrar o backup!" - -msgid "Unable to find master instance!" -msgstr "Incapaz de encontrar instância mestre!" - -msgid "Unable to get database backup data." -msgstr "Não é possível obter dados de backup de banco de dados." - -msgid "Unable to get databases data." -msgstr "Não é possível obter dados de bancos de dados." - -msgid "Unable to get instances data." -msgstr "Não foi possível obter dados de instâncias." - -msgid "Unable to get user access data." -msgstr "Não foi possível obter os dados de acesso do usuário." - -msgid "Unable to get user data." -msgstr "Não foi possível obter os dados do usuário." - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "Não é possível aumentar cluster. %s" - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "Não é possível aumentar cluster: %s" - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "Não foi possível disparar %(count)s chamadas \"%(name)s\"." - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "Não é possível iniciar cluster. %s" - -msgid "Unable to list database backups for parent." -msgstr "Não foi possível listar os backups de banco de dados para o pai." - -msgid "Unable to list database instances to backup." -msgstr "Não foi possível listar as instâncias de banco de dados para backup." - -msgid "Unable to obtain datastore versions." -msgstr "Não é possível obter versões de datastores." - -msgid "Unable to obtain datastores." -msgstr "Não é possível obter datastores." - -msgid "Unable to obtain flavors." -msgstr "Não é possível obter flavors." - -msgid "Unable to obtain information on root user" -msgstr "Não é possível obter informação do usuário root" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "Não é possível remover instâncias do cluster: %s" - -#, python-format -msgid "Unable to reset password. %s" -msgstr "Não é possível redefinir a senha. %s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "Não é possível redimensionar instância. %s" - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "Não é possível redimensionar volume. %s" - -msgid "Unable to retrieve accessible databases." -msgstr "Não foi possível obter as bases de dados acessíveis." - -msgid "Unable to retrieve cluster details." -msgstr "Não foi possível recuperar os detalhes do cluster." - -msgid "Unable to retrieve database clusters." -msgstr "Não é possível recuperar os clusters de banco de dados." - -msgid "Unable to retrieve database instances." -msgstr "Não foi possível obter instâncias da base de dados." - -msgid "Unable to retrieve database size information." -msgstr "Não foi possível obter informações de tamanho da base de dados." - -msgid "Unable to retrieve databases." -msgstr "Não foi possível obter as bases de dados." - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "Não foi possível obter detalhes do backup: %s" - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "Não foi possível obter detalhes para a base de dados do Cluster: %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "Não foi possível obter detalhes para a instância da base de dados: %s" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "Não é possível recuperar detalhes do Backup: %s" - -msgid "Unable to retrieve flavors." -msgstr "Não foi possível recuperar flavors." - -msgid "Unable to retrieve instance details." -msgstr "Não foi possível recuperar os detalhes da instância." - -msgid "Unable to retrieve networks." -msgstr "Não é possível recuperar redes." - -#, python-format -msgid "Unable to update user. %s" -msgstr "Não é possível atualizar usuário. %s" - -msgid "Updated" -msgstr "Atualizado" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "Atualizado usuário \"%s\"." - -msgid "User Name" -msgstr "Nome do Usuário" - -msgid "Username (required)" -msgstr "Nome de usuário (requerido)" - -msgid "Users" -msgstr "Usuários" - -msgid "Volume" -msgstr "Volume" - -msgid "Volume Size" -msgstr "Tamanho do Volume" - -msgid "Volume Type" -msgstr "Tipo de Volume" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "Você não possui permissão para %(action)s: %(objs)s" - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"Você pode realizar um backup incremental, especificando um backup pai. " -" No entanto, nem todos os bancos de dados oferece suporte " -"a backups incrementais, caso em que esta operação irá resultar em um erro." - -msgid "You must select a datastore type and version." -msgstr "Você deve selecionar um tipo de armazenamento de dados e versão." - -msgid "You must specify a password if you create a user." -msgstr "Você deve especificar uma senha se você criar um usuário." - -msgid "You must specify at least one database if you create a user." -msgstr "" -"Você deve especificar ao menos uma base de dados se você criar um usuário." - -msgid "instance" -msgstr "instância" diff --git a/trove_dashboard/locale/ru/LC_MESSAGES/django.po b/trove_dashboard/locale/ru/LC_MESSAGES/django.po deleted file mode 100644 index 5806207..0000000 --- a/trove_dashboard/locale/ru/LC_MESSAGES/django.po +++ /dev/null @@ -1,1473 +0,0 @@ -# Andreas Jaeger , 2016. #zanata -# Artem , 2016. #zanata -# Maxim Bozhenko , 2016. #zanata -# Vladimir Sokolov , 2016. #zanata -# Yulia Ryndenkova , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 8.0.0.0b3.dev9\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-01-10 19:59+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-10-12 02:47+0000\n" -"Last-Translator: Maxim Bozhenko \n" -"Language-Team: Russian\n" -"Language: ru\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s ОЗУ | Инстансов - %(instances)s " - -msgid "-" -msgstr "-" - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -"Обратите внимание: Значение указываемое в поле Размер диска " -"должно быть больше 0, однако некоторые конфигурации не поддерживают указание " -"размера диска. Если при указание размера диска возникает ошибка говорящая о " -"том что поддержка дисков не включена укажите 0." - -msgid "A backup must be selected!" -msgstr "Нужно выбрать резервную копию!" - -msgid "A master instance must be selected!" -msgstr "Должна быть выбран основной инстанс!" - -msgid "A new name or new password or new host must be specified." -msgstr "Новое имя, новый пароль и новый хост должны быть заданы." - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "Отменен доступ к " -msgstr[1] "Отменены доступы к " -msgstr[2] "Отменены доступы к " - -msgid "Accessible" -msgstr "Доступно" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "Активный" - -msgid "Add" -msgstr "Добавить" - -msgid "Add Instance" -msgstr "Добавить инстанс" - -msgid "Add Parameter" -msgstr "Добавить параметр" - -msgid "" -"Add parameters to the configuration group. When all the parameters are " -"added click 'Apply Changes' to persist changes." -msgstr "" -"Добавьте параметры в группу конфигурации. Когда все параметры добавлены " -"нажмите 'Применить изменения' чтобы сохранить изменения." - -msgid "Advanced" -msgstr "Дополнительно" - -msgid "Allowed Host" -msgstr "Разрешенный хост" - -msgid "Allowed Host (optional)" -msgstr "Разрешенный узел (необязательно)" - -msgid "Any Availability Zone" -msgstr "Любая зона доступности" - -msgid "Applicable only if the volume size is specified." -msgstr "Поддерживается только если указан размер диска." - -msgid "Applied changes to server" -msgstr "Изменения применены" - -msgid "Apply Changes" -msgstr "Применить изменения" - -msgid "At least one of the new fields must be changed." -msgstr "Хотя бы одно из новых полей должно быть изменено." - -msgid "Attach Configuration Group" -msgstr "Подключить группу конфигурации" - -#, python-format -msgid "Attaching Configuration group \"%s\"" -msgstr "Подключение группы конфигурации \"%s\"" - -msgid "Availability Zone" -msgstr "Зона доступности" - -msgid "Available networks" -msgstr "Доступные сети" - -msgid "Backup" -msgstr "Резервная копия" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "Резервное копирование" - -msgid "Backup Database" -msgstr "Резервная копия БД" - -msgid "Backup Details" -msgstr "Сведения о резервной копии" - -msgid "Backup Details: {{ backup.name }}" -msgstr "Детали резервной копии: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "Продолжительность резервной копии" - -msgid "Backup File" -msgstr "Файл резервной копии" - -msgid "Backup File Location" -msgstr "Путь к файлу резервной копии" - -msgid "Backup Name" -msgstr "Имя резервной копии" - -msgid "Backup Overview" -msgstr "Обзор резервной копии" - -msgid "Backups" -msgstr "Резервные копии" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "Заблокирован" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "Создание" - -msgctxt "Current status of a Database Instance" -msgid "Building" -msgstr "Создание" - -msgid "Cancel" -msgstr "Отмена" - -#, python-format -msgid "Cannot disable root access: %s" -msgstr "Невозможно отключить доступ к root: %s" - -msgid "Cannot grow cluster. No instances specified." -msgstr "Не могу увеличить кластер. Инстансы не заданы." - -msgid "Character Set" -msgstr "Кодировка" - -msgid "Choose a new instance flavor." -msgstr "Выберите новый тип для инстанса." - -msgid "Choose initial state." -msgstr "Выберите первоначальное наполнение" - -msgid "Close" -msgstr "Закрыть" - -msgid "Cluster Name" -msgstr "Имя кластера" - -msgid "Cluster Size" -msgstr "Размер кластера" - -msgid "Clusters" -msgstr "Кластеры" - -msgid "Collation" -msgstr "Параметры сортировки" - -msgid "Comma separated list of databases to create" -msgstr "Список баз данных для создания разделенный запятыми" - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "Завершено" - -msgid "Configuration Defaults" -msgstr "Установки по умолчанию" - -msgid "Configuration Group" -msgstr "Группа конфигурации" - -msgid "Configuration Group Details: {{configuration.name}}" -msgstr "Детали группы конфигурации: {{configuration.name}}" - -msgid "Configuration Group Instances" -msgstr "Инстансы группы конфигурации" - -msgid "Configuration Group Name" -msgstr "Имя группы конфигурации" - -msgid "Configuration Group Overview" -msgstr "Обзор группы конфигурации" - -msgid "Configuration Group Values" -msgstr "Значения группы конфигурации" - -msgid "Configuration Groups" -msgstr "Группы конфигураций" - -msgid "" -"Confirm the current replica is to be promoted as the new replica source." -msgstr "Подтвердите назначение текущей реплики источником реплик." - -msgid "Connection Examples" -msgstr "Примеры соединений" - -msgid "Connection Information" -msgstr "Параметры соединения" - -msgid "Container" -msgstr "Контейнер" - -msgid "Create Backup" -msgstr "Создать резервную копию" - -msgid "Create Configuration Group" -msgstr "Создать группу конфигурации" - -msgid "Create Database" -msgstr "Создать базу данных" - -msgid "Create User" -msgstr "Создать пользователя" - -msgid "Created" -msgstr "Создано" - -msgid "Created configuration group" -msgstr "Группа конфигурации создана" - -#, python-format -msgid "Created database \"%s\"." -msgstr "Создана БД \"%s\"." - -#, python-format -msgid "Created user \"%s\"." -msgstr "Создан пользователь \"%s\"." - -msgid "Current Replica" -msgstr "Текущая реплика" - -msgid "Current Replica Source" -msgstr "Текущий источник реплик" - -msgid "Current Size (GB)" -msgstr "Текущий размер (ГБ)" - -msgid "Current Task" -msgstr "Текущая задача" - -msgid "DATABASE" -msgstr "DATABASE" - -msgid "Database" -msgstr "База данных" - -msgid "Database Access" -msgstr "Доступ к БД" - -msgid "Database Access for: {{ user_name }}" -msgstr "Доступ к БД для: {{ user_name }}" - -msgid "Database Backups" -msgstr "Резервные копии БД" - -msgid "Database Info" -msgstr "Информация БД" - -msgid "Database Instance" -msgstr "Инстанс БД" - -msgid "Database Name" -msgstr "Имя базы данных" - -msgid "Database Port" -msgstr "Порт базы данных" - -msgid "Databases" -msgstr "Базы данных" - -msgid "Datastore" -msgstr "Хранилище данных" - -msgid "Datastore Version" -msgstr "Версия хранилища данных" - -msgid "Defaults" -msgstr "Установки по умолчанию" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "Удалить резервную копию" -msgstr[1] "Удалить резервные копии" -msgstr[2] "Удалить резервные копии" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "Удалить кластер" -msgstr[1] "Удалить кластеры" -msgstr[2] "Удалить кластеры" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "Удалить базу данных" -msgstr[1] "Удалить базы данных" -msgstr[2] "Удалить базы данных" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "Ошибка удаления" - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "Удалить инстанс" -msgstr[1] "Удалить инстансы" -msgstr[2] "Удалить инстансы" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "Удалить пользователя" -msgstr[1] "Удалить пользователей" -msgstr[2] "Удалить пользователей" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "Удаленная резервная копия" -msgstr[1] "Удаленные резервные копии" -msgstr[2] "Удаленные резервные копии" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "База данных удалена" -msgstr[1] "Базы данных удалены" -msgstr[2] "Базы данных удалены" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "Удаленный пользователь" -msgstr[1] "Удаленные пользователи" -msgstr[2] "Удаленные пользователи" - -msgid "Deleted cluster is not recoverable." -msgstr "Удаленный кластер не подлежит восстановлению" - -msgid "Deleted instances are not recoverable." -msgstr "Удаленные инстансы нельзя восстановить." - -msgid "Description" -msgstr "Описание" - -msgid "Detach Configuration Group" -msgid_plural "Detach Configuration Groups" -msgstr[0] "Отключить группу конфигурации" -msgstr[1] "Отключить группы конфигураций" -msgstr[2] "Отключить группы конфигураций" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "Отключить реплику" -msgstr[1] "Отключить реплики" -msgstr[2] "Отключить реплики" - -msgid "Detached Configuration Group" -msgid_plural "Detached Configuration Groups" -msgstr[0] "Отключенная группа конфигурации" -msgstr[1] "Отключенные группы конфигураций" -msgstr[2] "Отключенные группы конфигураций" - -msgid "Details" -msgstr "Подробности" - -msgid "Disable Log" -msgid_plural "Disable Logs" -msgstr[0] "Выключить лог" -msgstr[1] "Выключить логи" -msgstr[2] "Выключить логи" - -msgid "Disable Root" -msgstr "Отключить root" - -msgid "Disabled Log" -msgid_plural "Disabled Logs" -msgstr[0] "Выключенный лог" -msgstr[1] "Выключенные логи" -msgstr[2] "Выключенные логи" - -msgid "Discard Changes" -msgstr "Отменить изменения" - -msgid "Discard Log" -msgid_plural "Discard Logs" -msgstr[0] "Удалить лог" -msgstr[1] "Удалить логи" -msgstr[2] "Удалить логи" - -msgid "Discarded Log" -msgid_plural "Discarded Logs" -msgstr[0] "Удаленный лог" -msgstr[1] "Удаленные логи" -msgstr[2] "Удаленные логи" - -msgid "Download" -msgstr "Скачать" - -msgid "Download Backup" -msgstr "Скачать резервную копию" - -msgid "Edit User" -msgstr "Редактировать пользователя" - -msgid "Eject Replica Source" -msgid_plural "Eject Replica Sources" -msgstr[0] "Отключить источник реплик" -msgstr[1] "Отключить источники реплик" -msgstr[2] "Отключить источники реплик" - -msgid "Ejected Replica Source" -msgid_plural "Ejected Replica Sources" -msgstr[0] "Отключенный источник реплик" -msgstr[1] "Отключенные источники реплик" -msgstr[2] "Отключенные источники реплик" - -msgid "Enable Log" -msgid_plural "Enable Logs" -msgstr[0] "Включить лог" -msgstr[1] "Включить логи" -msgstr[2] "Включить логи" - -msgid "Enable Root" -msgstr "Разрешить пользователя root" - -msgid "Enabled Log" -msgid_plural "Enabled Logs" -msgstr[0] "Включенный лог" -msgstr[1] "Включенные логи" -msgstr[2] "Включенные логи" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "Ошибка" - -msgid "Error applying changes" -msgstr "Ошибка при применении изменений" - -msgid "Error creating database backup." -msgstr "Ошибка создания резервной копии БД." - -msgid "Error deleting database on instance." -msgstr "Ошибка удаления БД на инстансе." - -#, python-format -msgid "Error downloading log file: %s" -msgstr "Ошибка загрузки файла лога: %s" - -msgid "Error getting configuration group list." -msgstr "Ошибка получения списка групп конфигурации." - -msgid "Error getting database backup list." -msgstr "Ошибка получения списка резервных копий БД." - -#, python-format -msgid "Error resetting parameters: %s" -msgstr "Ошибка при очистке параметров: %s" - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "Произошла ошибка" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "Произошла ошибка" - -msgid "Fault" -msgstr "Ошибка" - -msgid "Flavor" -msgstr "Тип инстанса" - -msgid "GB" -msgstr "ГБ" - -msgid "Go" -msgstr "Выполнить" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "Дать доступ" -msgstr[1] "Дать доступы" -msgstr[2] "Дать доступы" - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "Дан доступ к " -msgstr[1] "Даны доступы к " -msgstr[2] "Даны доступы к " - -msgid "Grow Cluster" -msgstr "Увеличить кластер" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "Увеличить кластер: {{cluster_name}}" - -msgid "Has Root Ever Been Enabled" -msgstr "Был ли когда-то включен root" - -msgid "Host" -msgstr "Хост" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "Хост или IP через который пользователю разрешено подключиться." - -msgid "ID" -msgstr "ID" - -msgid "Incremental" -msgstr "Инкрементное" - -msgid "Incremental Backup" -msgstr "Инкрементное резервное копирование" - -msgid "Info" -msgstr "Информация" - -msgid "Information" -msgstr "Информация" - -msgid "Initial Admin User" -msgstr "Начальный администратор" - -msgid "Initial Databases" -msgstr "Начальные базы данных" - -msgid "Initial Volume Size" -msgstr "Изначальный размер диска" - -msgid "Initial admin user to add" -msgstr "Начальный пользователь-администратор для добавления" - -msgid "Initialize Databases" -msgstr "Инициализировать базы данных" - -msgid "Instance Name" -msgstr "Имя инстанса" - -msgid "Instance Type" -msgstr "Тип инстанса" - -msgid "Instances" -msgstr "Инстансы" - -msgid "Is a Replica Of" -msgstr "Является репликой" - -msgid "Launch" -msgstr "Запустить" - -msgid "Launch Cluster" -msgstr "Запустить кластер" - -msgid "Launch Database" -msgstr "Запустить БД" - -msgid "Launch Instance" -msgstr "Запустить инстанс" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "Запущено %(count)s названных \"%(name)s\"." - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "Запущен кластер %s" - -msgid "Locality" -msgstr "Окрестность" - -msgid "Log" -msgstr "Лог" - -msgid "Log Contents" -msgstr "Содержимое лога" - -msgid "Log Length" -msgstr "Длина лога" - -msgid "Log length must be a nonnegative integer." -msgstr "Длина журнала должна быть неотрицательным целым числом. " - -msgid "Log: " -msgstr "Лог:" - -msgid "Logs" -msgstr "Логи" - -msgid "Manage Access" -msgstr "Управление доступом" - -msgid "Manage Root" -msgstr "Управление root" - -msgid "Manage Root Access" -msgstr "Управление правами root" - -msgid "Management Console" -msgstr "Консоль управления" - -msgid "Master Instance Name" -msgstr "Имя основного инстанса" - -msgid "Message" -msgstr "Сообщение" - -msgid "Name" -msgstr "Имя" - -msgid "Network" -msgstr "Сеть" - -msgid "Network attached to instance." -msgstr "Сеть подключенная к инстансу." - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "Новая копия" - -msgid "New Flavor" -msgstr "Новый тип инстанса" - -msgid "New Host" -msgstr "Новый хост" - -msgid "New Name" -msgstr "Новое имя" - -msgid "New Password" -msgstr "Новый пароль" - -msgid "New Size (GB)" -msgstr "Новый размер (Гб)" - -msgid "New password for cluster access." -msgstr "Новый пароль для доступа к кластеру." - -msgid "New size for volume must be greater than current size." -msgstr "Новый размер диска должен быть больше текущего размера." - -msgid "No availability zones found" -msgstr "Не найдены зоны доступности." - -msgid "No backups available" -msgstr "Нет доступных резервных копий" - -msgid "No configuration groups available" -msgstr "Нет доступных групп конфигураций" - -msgid "No configurations available" -msgstr "Нет доступных конфигураций" - -msgid "No flavors available" -msgstr "Нет доступных типов инстанса" - -msgid "No instances available" -msgstr "Нет доступных инстансов" - -msgid "No volume type" -msgstr "Нет типа диска" - -msgid "None" -msgstr "Нет" - -msgid "Not Assigned" -msgstr "Не назначено" - -msgid "Not Found" -msgstr "Не найдено" - -msgid "Not available" -msgstr "Недоступно" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "" -"Замечание: Разрешите root доступ к инстансу. Если root доступ уже разрешен, " -"тогда будет сгенерирован новый пароль." - -msgid "Number of Instances" -msgstr "Количество инстансов" - -msgid "Number of Shards" -msgstr "Количество шардов" - -msgid "Number of instances in the cluster." -msgstr "Количество инстансов в кластере." - -msgid "Number of instances in the cluster. (Read only)" -msgstr "Количество инстансов в кластере. (Только чтение)" - -msgid "Number of shards. (Read only)" -msgstr "Количество шардов. (Только чтение)" - -msgid "Old Flavor" -msgstr "Старый тип инстанса" - -msgid "Optional Backup Description" -msgstr "Опциональное описание резервной копии" - -msgid "Optional character set for the database." -msgstr "Опциональная кодировка для БД" - -msgid "Optional collation type for the database." -msgstr "Опциональные параметры сортировки для БД" - -msgid "Optional comma separated list of databases user has access to." -msgstr "" -"Опциональный список БД, разделенный запятыми, к которым пользователь имеет " -"доступ." - -msgid "Optional datastore specific type of the instance." -msgstr "Опциональный тип инстанса для хранилища данных." - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "" -"Опциональное значение для хранилища данных которое определяет отношение " -"между инстансами в кластере" - -msgid "Optional host of user." -msgstr "Опциональный хост пользователя" - -msgid "Optional name of the instance." -msgstr "Опциональное имя инстанса." - -msgid "Optional parent backup" -msgstr "Необязательная материнская резервная копия" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "" -"Дополнительно можно выбрать создание этой базы данных из резервной копии или " -"в качестве реплики другого экземпляра БД." - -msgid "Optionally provide a character set and collation for the database." -msgstr "Опционально укажите кодировку и параметры сортировки для БД." - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "" -"Опционально введите список баз данных для создания, разделенный запятыми: " - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "" -"Опционально предоставьте хост для пользователя и список БД к которым " -"пользователь имеет доступ." - -msgid "Overview" -msgstr "Обзор" - -msgid "PASSWORD" -msgstr "PASSWORD" - -msgid "Parameter" -msgstr "Параметр" - -msgid "Parameters" -msgstr "Параметры" - -msgid "Parent Backup" -msgstr "Материнская резервная копия" - -msgid "Password" -msgstr "Пароль" - -msgid "Password (required)" -msgstr "Пароль (обязательно)" - -msgid "Password for root user must be specified." -msgstr "Должен быть указан пароль для пользователя root." - -msgid "Password for root user." -msgstr "Пароль пользователя root" - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "Пароль видим сразу только после разрешения или сброса root." - -msgid "" -"Please note: The new value must be greater than the existing volume " -"size." -msgstr "" -"Пожалуйста, обратите внимание: Новое значение должно быть больше " -"чем текущего размер диска." - -msgid "Promote" -msgstr "Повысить" - -msgid "Promote to Replica Source" -msgstr "Сделать источником реплик" - -#, python-format -msgid "Promoted replica \"%s\" as the new replica source." -msgstr "Реплика \"%s\" теперь источник реплик." - -msgid "Property" -msgstr "Свойство" - -msgid "Publish" -msgstr "Опубликовать" - -msgid "Publish Log" -msgid_plural "Publish Logs" -msgstr[0] "Опубликовать лог" -msgstr[1] "Опубликовать логи" -msgstr[2] "Опубликовать логи" - -msgid "Publishable (bytes)" -msgstr "Может быть опубликовано (байт)" - -msgid "Published (bytes)" -msgstr "Опубликовано (байт)" - -msgid "Published Log" -msgid_plural "Published Logs" -msgstr[0] "Опубликованный лог" -msgstr[1] "Опубликованные логи" -msgstr[2] "Опубликованные логи" - -msgid "RAM" -msgstr "RAM" - -msgctxt "Current status of a Database Instance" -msgid "Rebooting" -msgstr "Перезагрузка" - -msgid "Related To" -msgstr "Относится к" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "Удалить инстанс" -msgstr[1] "Удалить инстансы" -msgstr[2] "Удалить инстансы" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "Удаленный инстанс" -msgstr[1] "Удаленные инстансы" -msgstr[2] "Удаленные инстансы" - -msgid "Removed instances from cluster." -msgstr "Удаленные инстансы из кластера" - -msgid "Replica Count" -msgstr "Количество реплик" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "Реплика отключена" -msgstr[1] "Реплики отключены" -msgstr[2] "Реплики отключены" - -msgid "Replicas" -msgstr "Реплики" - -msgid "Replicate from Instance" -msgstr "Реплицировать с инстанса" - -msgid "Replication" -msgstr "Репликация" - -msgid "Reset Parameters" -msgstr "Очистить параметры" - -msgid "Reset Root Password" -msgstr "Сбросить пароль для root" - -msgid "Resize Database Instance" -msgstr "Изменить размер инстанса БД" - -msgid "Resize Database Volume" -msgstr "Изменить размер диска базы данных" - -msgid "Resize Instance" -msgstr "Изменить размер инстанса" - -msgid "Resize Volume" -msgstr "Изменить размер диска" - -msgctxt "Current status of a Database Instance" -msgid "Resizing" -msgstr "Изменение размера" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "Изменить размер инстанса \"%s\"" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "Изменяем размер диска \"%s\" " - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "Перезапустить инстанс" -msgstr[1] "Перезапустить инстансы" -msgstr[2] "Перезапустить инстансы" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "Требуется перезагрузка" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "Перезапущен инстанс" -msgstr[1] "Перезапущены инстансы" -msgstr[2] "Перезапущены инстансы" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "" -"Перезапущенные инстансы потеряют все данных не сохраненные в постоянном " -"хранилище." - -msgid "Restore Backup" -msgstr "Восстановить из резервной копии" - -msgid "Restore from Backup" -msgstr "Восстановить из резервной копии" - -msgid "Return to Log List" -msgstr "Вернуться к списку логов" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "Отменить доступ" -msgstr[1] "Отменить доступы" -msgstr[2] "Отменить доступы" - -msgid "Root Enabled" -msgstr "Root разрешен" - -msgid "Root Password" -msgstr "Пароль root" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "Пароль root обновлён для кластера \"%s\"" - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "Сохранение" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "Запланировано уменьшение кластера" -msgstr[1] "Запланировано уменьшение кластеров" -msgstr[2] "Запланировано уменьшение кластеров" - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "Запланированная резервная копия \"%(name)s\"." - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "Запланировано удаление кластера" -msgstr[1] "Запланировано удаление кластеров" -msgstr[2] "Запланировано удаление кластеров" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "Запланировано удаление инстанса" -msgstr[1] "Запланировано удаление инстансов" -msgstr[2] "Запланировано удаление инстансов" - -msgid "Scheduled growing of cluster." -msgstr "Запланировано увеличение кластера" - -msgid "Select a backup to restore" -msgstr "Выбрать резервную копию для восстановления" - -msgid "Select a configuration group" -msgstr "Выберите группу конфигурации" - -msgid "Select a configuration group to attach to the database instance." -msgstr "Выберите группу конфигурации для подключения к инстансу базы данных." - -msgid "Select a master instance" -msgstr "Выберите основной инстанс" - -msgid "Select a new flavor" -msgstr "Выберите новый тип инстанса" - -msgid "Select a parameter and provide a value for the configuration parameter." -msgstr "Выберите параметр и предоставьте значение для параметра конфигурации." - -msgid "Select backup" -msgstr "Выбрать резервную копию" - -msgid "Select configuration" -msgstr "Выбрать конфигурацию" - -msgid "Select configuration group" -msgstr "Выберите группу конфигурации" - -msgid "Select datastore type and version" -msgstr "Выбрать тип и версию хранилища данных." - -msgid "Select instance" -msgstr "Выберите инстанс" - -msgid "Select parent backup" -msgstr "Выбрать материнскую резервную копию" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "Выберите инстанс(ы) который будет удален из кластера." - -msgid "Selected networks" -msgstr "Выбранные сети" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "Уменьшить кластер" -msgstr[1] "Уменьшить кластеры" -msgstr[2] "Уменьшить кластеры" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "Уменьшать кластер: {{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "Уменьшение кластер не подлежит восстановлению." - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "Выключен" - -msgid "Size" -msgstr "Размер" - -msgid "Size of image to launch." -msgstr "Размер образа для запуска" - -msgid "Size of instance to launch." -msgstr "Размер инстанса для запуска." - -msgid "Size of the volume in GB." -msgstr "Размер диска в ГБ" - -msgid "Source for Initial State" -msgstr "Источник для первоначального наполнения" - -msgid "Specify a new flavor for the database instance." -msgstr "Укажите новый тип инстанса для инстанса БД." - -msgid "Specify a new name, new password or new host name for the user." -msgstr "Укажите новое имя, новой пароль или новый хост для пользователя." - -msgid "Specify the details for launching an instance." -msgstr "Задайте детали запуска инстанса." - -msgid "Specify the details for the database backup." -msgstr "Указать данные для резервной копии базы данных." - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "Задайте параметры инстанса для добавления в кластер." - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"Укажите инстансы для добавления в кластер. Когда все инстансы указаны, " -"нажмите 'Увеличить кластер' для выполнения операции увеличения." - -msgid "Specify the name of the new database." -msgstr "Укажите имя новой базы данных." - -msgid "Specify the name of the new user and password." -msgstr "Укажите имя нового пользователя и пароль." - -msgid "Specify the new root password for vertica cluster." -msgstr "Укажите новый root пароль для кластера vertica." - -msgid "Specify the new volume size for the database instance." -msgstr "Указать новый размер диска для инстанса БД." - -msgid "Specify the number of replicas to be created" -msgstr "Укажите количество создаваемых реплик" - -msgid "" -"Specify whether future replicated instances will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity). This " -"value is ignored if the instance to be launched is a replica." -msgstr "" -"Укажите будут ли реплицированные инстансы создаваться на одном и том же " -"гипервизоре (аффинированность) или на разных гипервизорах (анти-" -"аффинитивность). Это значение будет проигнорировано если запускаемый инстанс " -"является репликой." - -msgid "" -"Specify whether instances in the cluster will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity)." -msgstr "" -"Укажите будут ли инстансы кластера создаваться на одном и том же гипервизоре " -"(аффинированность) или на разных (анти-аффинированность)" - -msgid "Specs" -msgstr "Спеки" - -msgid "Status" -msgstr "Статус" - -msgid "Status if root was ever enabled for an instance." -msgstr "Статус если root когда либо был разрешен для инстанса." - -msgid "Successfully added parameter" -msgstr "Параметр успешно добавлен" - -msgid "Successfully disabled root access." -msgstr "Доступ к root отключен." - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"Поля 'Тип инстанса' и 'Относится к' опциональны и зависят от хранилища. " -"Смотрите документацию Trove для подробной информации об этих полях." - -msgid "The flavor must be specified." -msgstr "Должен быть указан тип инстанса." - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "" -"Поле имя опциональное. Если это поле оставить пустым, то имя будет " -"сгенерировано при увеличении кластера." - -msgid "The number of instances must be greater than 1." -msgstr "Количество инстансов должно быть больше 1." - -msgid "The number of shards must be greater than 1." -msgstr "Количество шардов должно быть больше 1." - -msgid "There was a problem enabling root." -msgstr "Возникла проблема с разрешением пользователя root." - -msgid "This action cannot be undone." -msgstr "Это действие не может быть отменено." - -msgid "Type" -msgstr "Тип" - -msgid "Type and version of datastore." -msgstr "Тип и версия хранилища данных." - -msgid "USERNAME" -msgstr "USERNAME" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "Невозможно выполнить %(action)s: %(objs)s" - -#, python-format -msgid "Unable to add new parameter: %s" -msgstr "Невозможно добавить новый параметр: %s" - -#, python-format -msgid "Unable to attach configuration group. %s" -msgstr "Невозможно подключить группу конфигурации. %s" - -#, python-format -msgid "Unable to create configuration group. %s" -msgstr "Невозможно создать группу конфигурации. %s" - -#, python-format -msgid "Unable to create database. %s" -msgstr "Невозможно создать базу данных. %s" - -msgid "Unable to create list of parameters." -msgstr "Невозможно создать список параметров." - -#, python-format -msgid "Unable to create user. %s" -msgstr "Невозможно создать пользователя. %s" - -msgid "Unable to determine if instance root is enabled." -msgstr "Не удалось определить разрешен ли root для инстанса." - -msgid "Unable to find backup!" -msgstr "Не удалось найти резервную копию!" - -msgid "Unable to find configuration group!" -msgstr "Невозможно найти группу конфигурации!" - -msgid "Unable to find master instance!" -msgstr "Не удалось найти основной инстанс!" - -msgid "Unable to get configuration data." -msgstr "Невозможно получить данные конфигурации." - -msgid "Unable to get database backup data." -msgstr "Не удалось получить данные резервной копии базы данных" - -msgid "Unable to get databases data." -msgstr "Не удалось получить информацию о базах данных" - -msgid "Unable to get instances data." -msgstr "Невозможно получить данные инстансов." - -msgid "Unable to get user access data." -msgstr "Не удалось получить данные доступа пользователя" - -msgid "Unable to get user data." -msgstr "Не удалось получить данные пользователя" - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "Не удалось увеличить кластер. %s" - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "Не удалось увеличить кластер: %s" - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "Не удалось запустить %(count)s названных \"%(name)s\"." - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "Не удалось запустить кластер. %s" - -msgid "Unable to list database backups for parent." -msgstr "Не удалось перечислить резервные копии базы для родителя." - -msgid "Unable to list database instances to backup." -msgstr "" -"Не удалось получить список инстансов баз данных для резервного копирования." - -msgid "" -"Unable to load {0} log\n" -"{1}" -msgstr "" -"Невозможно загрузить лог {0}\n" -"{1}" - -msgid "Unable to load {0} log for instance \"{1}\"." -msgstr "Невозможно загрузить лог {0} для инстанса \"{1}\"." - -msgid "Unable to obtain datastore versions." -msgstr "Невозможно получить версии хранилищ данных." - -msgid "Unable to obtain datastores." -msgstr "Невозможно получить список хранилищ данных." - -msgid "Unable to obtain flavors." -msgstr "Не удалось получить типы инстансов." - -msgid "Unable to obtain information on root user" -msgstr "Невозможно получить информацию о пользователе root" - -msgid "Unable to obtain list of parameters." -msgstr "Невозможно получить список параметров." - -#, python-format -msgid "Unable to promote replica as the new replica source. \"%s\"" -msgstr "Невозможно сделать реплику новым источником реплик. \"%s\"" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "Невозможно удалить инстансы их кластера: %s" - -#, python-format -msgid "Unable to reset password. %s" -msgstr "Не удаётся сбросить пароль. %s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "Не удалось изменить размер инстанса. %s" - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "Не удалось изменить размер диска. %s" - -msgid "Unable to retrieve accessible databases." -msgstr "Не удалось получить доступные базы данных." - -msgid "Unable to retrieve availability zones." -msgstr "Не удалось получить список зон доступности." - -msgid "Unable to retrieve cluster details." -msgstr "Невозможно получить сведения для кластера." - -msgid "Unable to retrieve database clusters." -msgstr "Невозможно получить кластеры БД." - -msgid "Unable to retrieve database instances." -msgstr "Не удалось получить инстансы БД." - -msgid "Unable to retrieve database size information." -msgstr "Не удалось получить информацию о размере БД." - -msgid "Unable to retrieve databases." -msgstr "Не удалось получить базы данных." - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "Не удалось получить подробную информацию о резервной копии: %s" - -#, python-format -msgid "Unable to retrieve details for configuration group: %s" -msgstr "Не удалось получить подробную информацию о группе конфигурации: %s" - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "Невозможно получить сведения для кластера БД: %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "Не удалось получить детальную информацию для инстанса БД: %s" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "Не удалось получить данные о материнской резервной копии: %s" - -msgid "Unable to retrieve flavors." -msgstr "Не удалось получить типы инстанса." - -msgid "Unable to retrieve instance details." -msgstr "Не удалось получить подробную информацию об инстансе." - -#, python-format -msgid "" -"Unable to retrieve list of logs.\n" -"%s" -msgstr "" -"Невозможно получить список логов.\n" -"%s" - -msgid "Unable to retrieve networks." -msgstr "Не удалось получить сети." - -#, python-format -msgid "Unable to update user. %s" -msgstr "Невозможно обновить пользователя. %s" - -msgid "Unknown" -msgstr "Неизвестно" - -msgid "Updated" -msgstr "Обновлено" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "Обновлен пользователь \"%s\"." - -msgid "User Name" -msgstr "Имя пользователя" - -msgid "Username (required)" -msgstr "Имя пользователя (обязательно)" - -msgid "Users" -msgstr "Пользователи" - -msgid "Value" -msgstr "Значение" - -msgid "Value must be \"true\" or \"false\"." -msgstr "Значение должно быть \"true\" или \"false\"." - -#, python-format -msgid "Value must be a number between %(min)s and %(max)s." -msgstr "Значение должно быть числом между %(min)s и %(max)s." - -#, python-format -msgid "Value must be a number greater than or equal to %s." -msgstr "Значение должно быть больше или равно %s." - -#, python-format -msgid "Value must be a number less than or equal to %s." -msgstr "Значение должно быть меньше или равно %s." - -msgid "Value must be a number." -msgstr "Значение должно быть числом." - -#, python-format -msgid "Value must be of type %s." -msgstr "Значение должно быть типа %s." - -msgid "Values" -msgstr "Значения" - -msgid "View Full Log" -msgstr "Просмотр полного лога" - -msgid "View Log" -msgstr "Просмотреть лог" - -msgid "Volume" -msgstr "Диск" - -msgid "Volume Size" -msgstr "Размер диска" - -msgid "Volume Type" -msgstr "Тип диска" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "Вам не разрешено выполнение: %(action)s: %(objs)s" - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"Вы можете выполнить инкрементное резервное копирование, указав материнскую " -"резервную копию. Однако, не все базы данных поддерживают " -"инкрементное резервное копирование, в этом случае операция приведёт к ошибке." - -msgid "You must select a datastore type and version." -msgstr "Вы должны выбрать тип и версию хранилища данных." - -msgid "You must select a flavor." -msgstr "Необходимо выбрать тип инстанса." - -msgid "You must specify a password if you create a user." -msgstr "Вы должны задать пароль если хотите создать пользователя." - -msgid "You must specify at least one database if you create a user." -msgstr "Вы должны создать по крайней мере одну БД если создаете пользователя." - -#, python-format -msgid "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" -msgstr "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" - -msgid "instance" -msgstr "инстанс" diff --git a/trove_dashboard/locale/ru/LC_MESSAGES/djangojs.po b/trove_dashboard/locale/ru/LC_MESSAGES/djangojs.po deleted file mode 100644 index 5ca4145..0000000 --- a/trove_dashboard/locale/ru/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,40 +0,0 @@ -# Maxim Bozhenko , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 7.0.0.0rc2.dev7\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-10-07 13:57+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-09-28 02:47+0000\n" -"Last-Translator: Maxim Bozhenko \n" -"Language-Team: Russian\n" -"Language: ru\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" - -msgid "Created" -msgstr "Создано" - -msgid "Database" -msgstr "База данных" - -msgid "Datastore" -msgstr "Хранилище" - -msgid "Datastore Version" -msgstr "Версия хранилища" - -msgid "Incremental" -msgstr "Инкрементальный" - -msgid "Name" -msgstr "Имя" - -msgid "Unable to retrieve the Backups." -msgstr "Невозможно получить резервные копии." - -msgid "status" -msgstr "Статус" diff --git a/trove_dashboard/locale/tr_TR/LC_MESSAGES/django.po b/trove_dashboard/locale/tr_TR/LC_MESSAGES/django.po deleted file mode 100644 index 0c8b4f7..0000000 --- a/trove_dashboard/locale/tr_TR/LC_MESSAGES/django.po +++ /dev/null @@ -1,1487 +0,0 @@ -# işbaran akçayır , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 9.0.0.0b2.dev2\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-05-12 11:33+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 09:22+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 3.9.6\n" -"X-POOTLE-MTIME: 1495704069.000000\n" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s RAM | %(instances)s sunucu" - -msgid "-" -msgstr "-" - -msgid "" -"Please note: It may be necessary to reboot the database " -"instance for this new configuration group to take effect." -msgstr "" -"Lütfen dikkat:Bu yeni yapılandırma grubunun uygulanabilmsei " -"için veritabanını yeniden başlatmanız gerekecek olabilir." - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -"Lütfen dikkat:Birim Boyutu alanındaki değer 0'dan büyük " -"olmalı, ama bazı yapılandırmalar birim boyutu belirtmeyi desteklemezler. " -"Eğer birim boyutunu belirtmek birim desteğinin etkin olmadığını söyleyen bir " -"hata verirse, 0 girin." - -msgid "A backup must be selected!" -msgstr "Bir yedek seçilmeli!" - -msgid "A master instance must be selected!" -msgstr "Bir ana sunucu seçilmeli!" - -msgid "A new name or new password or new host must be specified." -msgstr "Yeni isim veya yeni parola veya yeni sunucu belirtilmeli." - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "Erişim Kaldırıldı" -msgstr[1] "Erişim Kaldırıldı" - -msgid "Accessible" -msgstr "Erişilebilir" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "Etkin" - -msgid "Add" -msgstr "Ekle" - -msgid "Add Instance" -msgstr "Sunucu Ekle" - -msgid "Add Parameter" -msgstr "Parametre Ekle" - -msgid "" -"Add parameters to the configuration group. When all the parameters are " -"added click 'Apply Changes' to persist changes." -msgstr "" -"Yapılandırma grubuna parametreler ekle. Tüm parametreler eklendiğinde " -"değişiklikleri kalıcı yapmak için 'Değişiklikleri Uygula'ya tıklayın." - -msgid "Advanced" -msgstr "Gelişmiş" - -msgid "" -"Allow the user to connect from this host only. If not provided this user " -"will be allowed to connect from anywhere." -msgstr "" -"Kullanıcının yalnızca bu istemciden bağlanmasına izin ver. Verilmezse " -"kullanıcı her yerden bağlanabilecek." - -msgid "Allowed Host" -msgstr "İzinli Makine" - -msgid "Allowed Host (optional)" -msgstr "İzinli İstemci (isteğe bağlı)" - -msgid "Any Availability Zone" -msgstr "Herhangi Bir Kullanılırlık Bölgesi" - -msgid "Applicable only if the volume size is specified." -msgstr "Yalnızca birim boyutu belirtilmişse uygulanabilir." - -msgid "Applied changes to server" -msgstr "Değişiklikler sunucuya uygulandı" - -msgid "Apply Changes" -msgstr "Değişiklikleri Uygula" - -msgid "At least one of the new fields must be changed." -msgstr "Yeni alanların en az biri değişmeli." - -msgid "Attach Configuration Group" -msgstr "Yapılandırma Grubu Ekle" - -#, python-format -msgid "Attaching Configuration group \"%s\"" -msgstr "Yapılandırma grubu \"%s\" ekleniyor" - -msgid "Availability Zone" -msgstr "Kullanılırlık Bölgesi" - -msgid "Available networks" -msgstr "Kullanılabilir ağlar" - -msgid "Backup" -msgstr "Yedek" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "Yedekleme" - -msgid "Backup Database" -msgstr "Veritabanını Yedekle" - -msgid "Backup Details" -msgstr "Yedek Ayrıntıları" - -msgid "Backup Details: {{ backup.name }}" -msgstr "Yedek Ayrıntıları: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "Yedek Süresi" - -msgid "Backup File" -msgstr "Yedek Dosyası" - -msgid "Backup File Location" -msgstr "Yedek Dosyası Konumu" - -msgid "Backup Name" -msgstr "Yedek İsmi" - -msgid "Backup Overview" -msgstr "Yedek Genel Görünümü" - -msgid "Backups" -msgstr "Yedekler" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "Engellendi" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "İnşa Ediliyor" - -msgctxt "Current status of a Database Instance" -msgid "Building" -msgstr "İnşa Ediliyor" - -msgid "Cancel" -msgstr "İptal" - -#, python-format -msgid "Cannot disable root access: %s" -msgstr "Kök erişimi kapatılamıyor: %s" - -msgid "Cannot grow cluster. No instances specified." -msgstr "Küme büyütülemiyor. Sunucu belirtilmemiş." - -msgid "Character Set" -msgstr "Karakter Kümesi" - -msgid "Choose a new instance flavor." -msgstr "Yeni bir sunucu niteliği seçin." - -msgid "Choose initial state." -msgstr "İlk durumu seçin." - -msgid "Close" -msgstr "Kapat" - -msgid "Cluster Name" -msgstr "Küme İsmi" - -msgid "Cluster Size" -msgstr "Küme Boyutu" - -msgid "Clusters" -msgstr "Kümeler" - -msgid "Collation" -msgstr "Harmanlama" - -msgid "Comma separated list of databases to create" -msgstr "Oluşturulacak veritabanlarının virgülle ayrılmış listesi" - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "Tamamlandı" - -msgid "Configuration Defaults" -msgstr "Yapılandırma Öntanımları" - -msgid "Configuration Group" -msgstr "Yapılandırma Grubu" - -msgid "Configuration Group Details: {{configuration.name}}" -msgstr "Yapılandırma Grubu Ayrıntıları: {{configuration.name}}" - -msgid "Configuration Group Instances" -msgstr "Yapılandırma Grubu Sunucuları" - -msgid "Configuration Group Name" -msgstr "Yapılandırma Grup İsmi" - -msgid "Configuration Group Overview" -msgstr "Yapılandırma Grubu Genel Görünümü" - -msgid "Configuration Group Values" -msgstr "Yapılandırma Grup Değerleri" - -msgid "Configuration Groups" -msgstr "Yapılandırma Grupları" - -msgid "" -"Confirm the current replica is to be promoted as the new replica source." -msgstr "Mevcut kopyanın yeni kopya kaynağı olarak terfisini onayla." - -msgid "Connection Examples" -msgstr "Bağlantı Örnekleri" - -msgid "Connection Information" -msgstr "Bağlantı Bilgisi" - -msgid "Container" -msgstr "Kapsayıcı" - -msgid "Create Backup" -msgstr "Yedek Oluştur" - -msgid "Create Configuration Group" -msgstr "Yapılandırma Grubu Oluştur" - -msgid "Create Database" -msgstr "Veritabanı Oluştur" - -msgid "Create User" -msgstr "Kullanıcı Oluştur" - -msgid "" -"Create an optional initial user. This user will have access to all databases " -"you create." -msgstr "" -"İsteğe bağlı bir ilk kullanıcı oluşturun. Bu kullanıcının oluşturduğunuz tüm " -"veritabanlarına erişimi olacak." - -msgid "Created" -msgstr "Oluşturuldu" - -msgid "Created configuration group" -msgstr "Yapılandırma grubu oluşturuldu" - -#, python-format -msgid "Created database \"%s\"." -msgstr "\"%s\" veritabanı oluşturuldu." - -#, python-format -msgid "Created user \"%s\"." -msgstr "\"%s\" kullanıcısı oluşturuldu." - -msgid "Current Replica" -msgstr "Mevcut Kopya" - -msgid "Current Replica Source" -msgstr "Mevcut Kopya Kaynağı" - -msgid "Current Size (GB)" -msgstr "Mevcut Boyut (GB)" - -msgid "Current Task" -msgstr "Mevcut Görev" - -msgid "DATABASE" -msgstr "VERİTABANI" - -msgid "Database" -msgstr "Veritabanı" - -msgid "Database Access" -msgstr "Veritabanı Erişimi" - -msgid "Database Access for: {{ user_name }}" -msgstr "Veritabanı Erişimi: {{ user_name }}" - -msgid "Database Backups" -msgstr "Veritabanı Yedekleri" - -msgid "Database Info" -msgstr "Veritabanı Bilgisi" - -msgid "Database Instance" -msgstr "Veritabanı Sunucusu" - -msgid "Database Name" -msgstr "Veritabanı Adı" - -msgid "Database Port" -msgstr "Veritabanı Bağlantı Noktası" - -msgid "Databases" -msgstr "Veritabanları" - -msgid "Datastore" -msgstr "Verideposu" - -msgid "Datastore Version" -msgstr "Verideposu Sürümü" - -msgid "Defaults" -msgstr "Öntanımlılar" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "Yedeği Sil" -msgstr[1] "Yedekleri Sil" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "Kümeyi Sil" -msgstr[1] "Kümeleri Sil" - -msgid "Delete Configuration Group" -msgid_plural "Delete Configuration Groups" -msgstr[0] "Yapılandırma Grubunu Sil" -msgstr[1] "Yapılandırma Gruplarını Sil" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "Veritabanını Sil" -msgstr[1] "Veritabanlarını Sil" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "Silme Başarısız" - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "Sunucuyu Sil" -msgstr[1] "Sunucuları Sil" - -msgid "Delete Parameter" -msgid_plural "Delete Parameters" -msgstr[0] "Parametreyi Sil" -msgstr[1] "Parametreleri Sil" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "Kullanıcıyı Sil" -msgstr[1] "Kullanıcıları Sil" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "Yedek Silindi" -msgstr[1] "Yedekler Silindi" - -msgid "Deleted Configuration Group" -msgid_plural "Deleted Configuration Groups" -msgstr[0] "Yapılandırma Grubu Silindi" -msgstr[1] "Yapılandırma Grupları Silindi" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "Veritabanı Silindi" -msgstr[1] "Veritabanları Silindi" - -msgid "Deleted Parameter" -msgid_plural "Deleted Parameters" -msgstr[0] "Parametre Silindi" -msgstr[1] "Parametreler Silindi" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "Kullanıcı Silindi" -msgstr[1] "Kullanıcılar Silindi" - -msgid "Deleted cluster is not recoverable." -msgstr "Silinen küme geri getirilebilir değil." - -msgid "Deleted instances are not recoverable." -msgstr "Silinen sunucular geri getirilemez." - -msgid "Description" -msgstr "Açıklama" - -msgid "Detach Configuration Group" -msgid_plural "Detach Configuration Groups" -msgstr[0] "Yapılandırma Grubunu Ayır" -msgstr[1] "Yapılandırma Gruplarını Ayır" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "Kopyayı Ayır" -msgstr[1] "Kopyaları Ayır" - -msgid "Detached Configuration Group" -msgid_plural "Detached Configuration Groups" -msgstr[0] "Yapılandırma Grubu Ayrıldı" -msgstr[1] "Yapılandırma Grupları Ayrıldı" - -msgid "Details" -msgstr "Ayrıntılar" - -msgid "Disable Log" -msgid_plural "Disable Logs" -msgstr[0] "Günlüğü Kapat" -msgstr[1] "Günlükleri Kapat" - -msgid "Disable Root" -msgstr "Root'u Kapat" - -msgid "Disabled Log" -msgid_plural "Disabled Logs" -msgstr[0] "Günlük Kapatıldı" -msgstr[1] "Günlükler Kapatıldı" - -msgid "Discard Changes" -msgstr "Değişikliklerden Vazgeç" - -msgid "Discard Log" -msgid_plural "Discard Logs" -msgstr[0] "Günlüğü Sil" -msgstr[1] "Günlükleri Sil" - -msgid "Discarded Log" -msgid_plural "Discarded Logs" -msgstr[0] "Günlük Silindi" -msgstr[1] "Günlükler Silindi" - -msgid "Download" -msgstr "İndir" - -msgid "Download Backup" -msgstr "Yedeği İndir" - -msgid "Edit User" -msgstr "Kullanıcı Düzenle" - -msgid "Eject Replica Source" -msgid_plural "Eject Replica Sources" -msgstr[0] "Kopya Kaynağını Çıkar" -msgstr[1] "Kopya Kaynaklarını Çıkar" - -msgid "Ejected Replica Source" -msgid_plural "Ejected Replica Sources" -msgstr[0] "Kopya Kaynağı Çıkarıldı" -msgstr[1] "Kopya Kaynakları Çıkarıldı" - -msgid "Enable Log" -msgid_plural "Enable Logs" -msgstr[0] "Günlüğü Etkinleştir" -msgstr[1] "Günlükleri Etkinleştir" - -msgid "Enable Root" -msgstr "Root'u Etkinleştir" - -msgid "Enabled Log" -msgid_plural "Enabled Logs" -msgstr[0] "Günlük Etkinleştirildi" -msgstr[1] "Günlükler Etkinleştirildi" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "Hata" - -msgid "Error applying changes" -msgstr "Değişiklikleri uygulamada hata" - -msgid "Error creating database backup." -msgstr "Veritabanı yedeği oluşturmada hata." - -msgid "Error deleting database on instance." -msgstr "Sunucudaki veritabanının silinmesinde hata." - -#, python-format -msgid "Error downloading log file: %s" -msgstr "Günlük dosyası indirilirken hata: %s" - -msgid "Error getting configuration group list." -msgstr "Yapılandırma grubu listesi alınamıyor." - -msgid "Error getting database backup list." -msgstr "Veritabanı yedek listesi alınırken hata." - -#, python-format -msgid "Error resetting parameters: %s" -msgstr "Parametreler yeniden ayarlanırken hata: %s" - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "Başarısız" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "Başarısız" - -msgid "Fault" -msgstr "Arıza" - -msgid "Flavor" -msgstr "Nitelik" - -msgid "GB" -msgstr "GB" - -msgid "Go" -msgstr "Git" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "Erişim İzni Ver" -msgstr[1] "Erişim İzni Ver" - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "Erişim Verildi" -msgstr[1] "Erişim Verildi" - -msgid "Grow Cluster" -msgstr "Kümeyi Büyüt" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "Kümeyi Büyüt: {{cluster_name}}" - -msgid "Has Root Ever Been Enabled" -msgstr "Root Hiç Etkinleştirilmiş mi" - -msgid "Host" -msgstr "Sunucu" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "Kullanıcının bağlanmasına izni olan İstemci veya IP." - -msgid "ID" -msgstr "Kimlik" - -msgid "Incremental" -msgstr "Artan" - -msgid "Incremental Backup" -msgstr "Artırma Yedeklemesi" - -msgid "Info" -msgstr "Bilgi" - -msgid "Information" -msgstr "Bilgi" - -msgid "Initial Admin User" -msgstr "İlk Yönetici Kullanıcı" - -msgid "Initial Databases" -msgstr "İlk Veritabanları" - -msgid "Initial Volume Size" -msgstr "Birim Başlangıç Boyutu" - -msgid "Initial admin user to add" -msgstr "Eklenecek ilk yönetici kullanıcı" - -msgid "Initialize Databases" -msgstr "Veritabanlarını İlklendir" - -msgid "Instance Name" -msgstr "Sunucu Adı" - -msgid "Instance Type" -msgstr "Sunucu Türü" - -msgid "Instances" -msgstr "Sunucular" - -msgid "Is a Replica Of" -msgstr "Şunun Kopyası" - -msgid "Launch" -msgstr "Başlat" - -msgid "Launch Cluster" -msgstr "Kümeyi Başlat" - -msgid "Launch Database" -msgstr "Veritabanını Başlat" - -msgid "Launch Instance" -msgstr "Sunucu Başlat" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "%(count)s \"%(name)s\" isimli başlatıldı." - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "\"%s\" kümesi başlatıldı" - -msgid "Locality" -msgstr "Çevre" - -msgid "Log" -msgstr "Günlük" - -msgid "Log Contents" -msgstr "Günlük İçeriği" - -msgid "Log Length" -msgstr "Günlük Uzunluğu" - -msgid "Log length must be a nonnegative integer." -msgstr "Günlük uzunluğu negatif olmayan tam sayı olmalı." - -msgid "Log: " -msgstr "Günlük: " - -msgid "Logs" -msgstr "Günlükler" - -msgid "Manage Access" -msgstr "Erişimi Yönet" - -msgid "Manage Root" -msgstr "Root'u Yönet" - -msgid "Manage Root Access" -msgstr "Kök Erişimini Yönet" - -msgid "Management Console" -msgstr "Yönetim Konsolu" - -msgid "Master Instance Name" -msgstr "Ana Sunucu İsmi" - -msgid "Message" -msgstr "İleti" - -msgid "" -"Move networks from 'Available Networks' to 'Selected Networks' by clicking " -"the button, or dragging and dropping. You can change the NIC order by " -"dragging and dropping as well." -msgstr "" -"Ağlar 'Kullanılabilri Ağlar'dan 'Seçili Ağlar'a düğmeye tıklayarak, ya da " -"sürükleyip bırakarak taşıyın. NIC sırasını da sürükleyip bırakarak " -"değiştirebilirsiniz." - -msgid "Name" -msgstr "İsim" - -msgid "Network" -msgstr "Ağ" - -msgid "Network attached to instance." -msgstr "Ağ sunucuya eklendi." - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "Yeni" - -msgid "New Flavor" -msgstr "Yeni Nitelik" - -msgid "New Host" -msgstr "Yeni Sunucu" - -msgid "New Name" -msgstr "Yeni İsim" - -msgid "New Password" -msgstr "Yeni Parola" - -msgid "New Size (GB)" -msgstr "Yeni Boyut (GB)" - -msgid "New password for cluster access." -msgstr "Küme erişimi için yeni parola." - -msgid "New size for volume must be greater than current size." -msgstr "Birimin yeni boyutu mevcut boyutundan büyük olmalıdır." - -msgid "No availability zones found" -msgstr "Kullanılırlık bölgesi bulunamadı" - -msgid "No backups available" -msgstr "Kullanılabilir yedek yok" - -msgid "No configuration groups available" -msgstr "Kullanılabilir yapılandırma grubu yok" - -msgid "No configurations available" -msgstr "Kullanılabilir yapılandırma yok" - -msgid "No flavors available" -msgstr "Kullanılabilir nitelik yok" - -msgid "No instances available" -msgstr "Kullanılabilir sunucu yok" - -msgid "No volume type" -msgstr "Birim türü yok" - -msgid "None" -msgstr "Hiçbiri" - -msgid "Not Assigned" -msgstr "Atanmamış" - -msgid "Not Found" -msgstr "Bulunamadı" - -msgid "Not available" -msgstr "Kullanılabilir değil" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "" -"Not: Bir sunucuya kök erişimini etkinleştir. Root kullanıcı zaten etkinse " -"yeni parola üretilir." - -msgid "Number of Instances" -msgstr "Sunucu Sayısı" - -msgid "Number of Shards" -msgstr "Parça Sayısı" - -msgid "Number of instances in the cluster." -msgstr "Kümedeki sunucu sayısı." - -msgid "Number of instances in the cluster. (Read only)" -msgstr "Kümedeki sunucu sayısı. (Salt okunur)" - -msgid "Number of shards. (Read only)" -msgstr "Parça sayısı. (Salt okunur)" - -msgid "Old Flavor" -msgstr "Eski Nitelik" - -msgid "Optional Backup Description" -msgstr "İsteğe Bağlı Yedek Tanımı" - -msgid "Optional character set for the database." -msgstr "Veritabanı için isteğe bağlı karakter kümesi." - -msgid "Optional collation type for the database." -msgstr "Veritabanı için isteğe bağlı harmanlama türü." - -msgid "Optional comma separated list of databases user has access to." -msgstr "" -"İsteğe bağlı, kullanıcının erişimi olan veritabanlarının virgülle ayrılmış " -"listesi." - -msgid "Optional datastore specific type of the instance." -msgstr "İsteğe bağlı, sunucunun verideposuna özel türü." - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "" -"Kümedeki bir sunucudan diğerine ilişkiyi tanımlayan isteğe bağlı " -"verideposuna özel değer." - -msgid "Optional host of user." -msgstr "İsteğe bağlı, kullanıcı istemcisi." - -msgid "Optional name of the instance." -msgstr "Sunucunun isteğe bağlı ismi." - -msgid "Optional parent backup" -msgstr "İsteğe bağlı üst yedek" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "" -"İsteğe bağlı olarak bu veritebanını önceki bir yedekten, ya da başka bir " -"veritabanı sunucusunun kopyası olarak başlat." - -msgid "Optionally provide a character set and collation for the database." -msgstr "" -"İsteğe bağlı olarak veritabanı için bir karakter kümesi ve harman sağlayın." - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "" -"İsteğe bağlı olarak oluşturulacak veritabanlarının virgülle ayrılmış " -"listesini sağlayın:" - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "" -"İsteğe bağlı olarak kullanıcı sunucusunu ve erişim olan veritabanlarının " -"listesini sağlayın." - -msgid "Overview" -msgstr "Genel Görünüm" - -msgid "PASSWORD" -msgstr "PAROLA" - -msgid "Parameter" -msgstr "Parametre" - -msgid "Parameters" -msgstr "Parametreler" - -msgid "Parent Backup" -msgstr "Üst Yedek" - -msgid "Password" -msgstr "Parola" - -msgid "Password (required)" -msgstr "Parola (gerekli)" - -msgid "Password for root user must be specified." -msgstr "Root kullanıcı için parola belirtilmeli." - -msgid "Password for root user." -msgstr "Root kullanıcısı için parola." - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "" -"Parola yalnızca root etkinleştirildiğinde ya da sıfırlandığında görünür." - -msgid "" -"Please note: The new value must be greater than the existing volume " -"size." -msgstr "" -"Lütfen dikkat.Yeni değer mevcut birim boyutundan büyük olmalı." - -msgid "Promote" -msgstr "Terfi et" - -msgid "Promote to Replica Source" -msgstr "Kopya Kaynağı olarak yükselt" - -#, python-format -msgid "Promoted replica \"%s\" as the new replica source." -msgstr "Kopya \"%s\" yeni kopya kaynağı olarak yükseltildi." - -msgid "Property" -msgstr "Özellike" - -msgid "Publish" -msgstr "Yayımla" - -msgid "Publish Log" -msgid_plural "Publish Logs" -msgstr[0] "Günlüğü Yayımla" -msgstr[1] "Günlükleri Yayımla" - -msgid "Publishable (bytes)" -msgstr "Yayımlanabilir (bayt)" - -msgid "Published (bytes)" -msgstr "Yayımlandı (bayt)" - -msgid "Published Log" -msgid_plural "Published Logs" -msgstr[0] "Günlük Yayımlandı" -msgstr[1] "Günlükler Yayımlandı" - -msgid "RAM" -msgstr "RAM" - -msgctxt "Current status of a Database Instance" -msgid "Rebooting" -msgstr "Yeniden başlatılıyor" - -msgid "Related To" -msgstr "Bununla İlişkili" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "Sunucuyu Kaldır" -msgstr[1] "Sunucuları Kaldır" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "Sunucu Kaldırıldı" -msgstr[1] "Sunucular Kaldırıldı" - -msgid "Removed instances from cluster." -msgstr "Sunucular kümeden kaldırıldı." - -msgid "Replica Count" -msgstr "Kopya Sayısı" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "Kopya Ayrıldı" -msgstr[1] "Kopyalar Ayrıldı" - -msgid "Replicas" -msgstr "Koypalar" - -msgid "Replicate from Instance" -msgstr "Sunucudan Geri Yükle" - -msgid "Replication" -msgstr "Çoğaltma" - -msgid "Reset Parameters" -msgstr "Parametreleri Sıfırla" - -msgid "Reset Root Password" -msgstr "Kök Parolayı Sıfırla" - -msgid "Resize Database Instance" -msgstr "Veritabanı Sunucusunu Yeniden Boyutlandır" - -msgid "Resize Database Volume" -msgstr "Veritabanı Birimini Yeniden Boyutlandır" - -msgid "Resize Instance" -msgstr "Sunucuyu Yeniden Boyutlandır" - -msgid "Resize Volume" -msgstr "Birimi Yeniden Boyutlandır" - -msgctxt "Current status of a Database Instance" -msgid "Resizing" -msgstr "Yeniden boyutlandırılıyor" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "\"%s\" sunucusu yeniden boyutlandırılıyor" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "\"%s\" birimi yeniden boyutlandırılıyor" - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "Sunucuyu Yeniden Başlat" -msgstr[1] "Sunucuları Yeniden Başlat" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "Yeniden Başlatma Gerekiyor" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "Sunucu Yeniden Başlatıldı" -msgstr[1] "Sunucular Yeniden Başlatıldı" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "" -"Yeniden başlatılan sunucular kalıcı depolamaya kaydedilmemiş tüm veriyi " -"kaybeder." - -msgid "Restore Backup" -msgstr "Yedeği Geri Yükle" - -msgid "Restore from Backup" -msgstr "Yedekten Geri Yükle" - -msgid "Return to Log List" -msgstr "Günlük Listesine Dön" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "Erişimi Kaldır" -msgstr[1] "Erişimi Kaldır" - -msgid "Root Enabled" -msgstr "Root Etkin" - -msgid "Root Password" -msgstr "Kök Parolası" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "\"%s\" kümesi için kök parolası güncellendi" - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "Kaydediliyor" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "Kümenin Daraltılması Zamanlandı" -msgstr[1] "Kümenin Daraltılması Zamanlandı" - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "Yedek \"%(name)s\" zamanlandı." - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "Kümenin silinmesi zamanlandı" -msgstr[1] "Kümelerin silinmesi zamanlandı" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "Sunucunun silinmesi zamanlandı" -msgstr[1] "Sunucuların silinmesi zamanlandı" - -msgid "Scheduled growing of cluster." -msgstr "Kümenin genişletilmesi zamanlandı." - -msgid "Select a backup to restore" -msgstr "Geri yüklenecek bir yedek seçin" - -msgid "Select a configuration group" -msgstr "Bir yapılandırma grubu seçin" - -msgid "Select a configuration group to attach to the database instance." -msgstr "Veritabanı sunucusuna eklemek için bir yapılandırma grubu seçin." - -msgid "Select a master instance" -msgstr "Bir ana sunucu seçin" - -msgid "Select a new flavor" -msgstr "Yeni bir nitelik seçin" - -msgid "Select a parameter and provide a value for the configuration parameter." -msgstr "" -"Bir parametre seçin ve yapılandırma parametresi için bir değer sağlayın." - -msgid "Select backup" -msgstr "Yedek seç" - -msgid "Select configuration" -msgstr "Yapılandırma seçin" - -msgid "Select configuration group" -msgstr "Yapılandırma grubunu seçin" - -msgid "Select datastore type and version" -msgstr "Verideposu türü ve sürümü seçin" - -msgid "Select instance" -msgstr "Sunucu seçin" - -msgid "Select parent backup" -msgstr "Üst yedeği seçin" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "Kümeden kaldırılacak sunucu(lar)ı seçin." - -msgid "Selected networks" -msgstr "Seçili ağlar" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "Kümeyi Daralt" -msgstr[1] "Kümeyi Daralt" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "Kümeyi Daralt: {{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "Kümeyi daraltmak geri dönülebilir değildir." - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "Kapalı" - -msgid "Size" -msgstr "Boyut" - -msgid "Size of image to launch." -msgstr "Başlatılacak imajın boyutu." - -msgid "Size of instance to launch." -msgstr "Başlatılacak sunucunun boyutu." - -msgid "Size of the volume in GB." -msgstr "Birimin GB olarak boyutu." - -msgid "Source for Initial State" -msgstr "İlk Durum için Kaynak" - -msgid "Specify a new flavor for the database instance." -msgstr "Veritabanı sunucusu için yeni nitelik belirt." - -msgid "Specify a new name, new password or new host name for the user." -msgstr "Kullanıcı için yeni bir isim, yeni parola veya yeni istemci belirtin." - -msgid "Specify the details for launching an instance." -msgstr "Sunucu başlatmak için ayrıntıları belirtin." - -msgid "Specify the details for the database backup." -msgstr "Veritabanı yedeği için ayrıntıları belirtin." - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "Kümeye eklenecek sunucu ayrıntılarını belirtin." - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"Kümeye eklenecek sunucuları belirtin. Tüm sunucular belirtildiğinde büyütme " -"işlemini başlatmak için 'Kümeyi Büyüt'e tıklayın." - -msgid "Specify the name of the new database." -msgstr "Yeni veritabanı ismini belirtin." - -msgid "Specify the name of the new user and password." -msgstr "Yeni kullanıcının ismini ve parolasını belirtin." - -msgid "Specify the new root password for vertica cluster." -msgstr "Vertica kümesi için yeni root parolasını belirtin." - -msgid "Specify the new volume size for the database instance." -msgstr "Veritabanı sunucusu için yeni birim belirt." - -msgid "Specify the number of replicas to be created" -msgstr "Oluşturulacak kopya sayısını belirtin" - -msgid "" -"Specify whether future replicated instances will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity). This " -"value is ignored if the instance to be launched is a replica." -msgstr "" -"İlerde kopyalanan sunucuların aynı hipervizörde mi (benzeşim) farklı " -"hipervizörlerde mi (anti-benzeşim) oluşturulacağını belirt. Bu değer " -"başlatılacak sunucu bir kopya ise göz ardı edilir." - -msgid "" -"Specify whether instances in the cluster will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity)." -msgstr "" -"Kümedeki sunucuların aynı hipervizör (benzeşim) üzerinde mi farklı " -"hipervizörler üzerinde mi (anti-benzeşim) oluşturulacağını belirtin." - -msgid "Specs" -msgstr "Özellikler" - -msgid "Status" -msgstr "Durum" - -msgid "Status if root was ever enabled for an instance." -msgstr "Root daha önce sunucu için etkinleştirilmiş mi durumu." - -msgid "Successfully added parameter" -msgstr "Parametre başarıyla eklendi" - -msgid "Successfully disabled root access." -msgstr "Root erişimi başarıyla kapatıldı." - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"'Sunucu Türü' ve 'İlişkili' alanları verideposuna özeldir ve isteğe " -"bağlıdır. Bu alanların kullanımıyla ilgili ek bilgi için Trove " -"belgelendirmesine göz atın." - -msgid "The flavor must be specified." -msgstr "Nitelik belirtilmeli." - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "" -"İsim alanı isteğe bağlıdır. Alan boş bırakılırsa küme büyütüldüğünde bir " -"isim üretilir." - -msgid "The number of instances must be greater than 1." -msgstr "Sunucu sayısı 1'den büyük olmalı." - -msgid "The number of shards must be greater than 1." -msgstr "Parça sayısı 1'den büyük olmalı." - -msgid "There was a problem enabling root." -msgstr "Root etkinleştirilirken bir sorun oldu." - -msgid "This action cannot be undone." -msgstr "Bu eylem geri alınamaz." - -msgid "Type" -msgstr "Tür" - -msgid "Type and version of datastore." -msgstr "Verideposunun türü ve sürümü." - -msgid "USERNAME" -msgstr "KULLANICIADI" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "%(action)s yapılamadı: %(objs)s" - -#, python-format -msgid "Unable to add new parameter: %s" -msgstr "Yeni parametre eklenemiyor: %s" - -#, python-format -msgid "Unable to attach configuration group. %s" -msgstr "Yapılandırma grubu eklenemiyor. %s" - -#, python-format -msgid "Unable to create configuration group. %s" -msgstr "Yapılandırma grubu oluşturulamadı. %s" - -#, python-format -msgid "Unable to create database. %s" -msgstr "Veritabanı oluşturulamadı. %s" - -msgid "Unable to create list of parameters." -msgstr "Parametre listesi oluşturulamadı." - -#, python-format -msgid "Unable to create user. %s" -msgstr "Kullanıcı oluşturulamıyor. %s" - -msgid "Unable to determine if instance root is enabled." -msgstr "Sunucu root'unun etkin olup olmadığı belirlenemiyor." - -msgid "Unable to find backup!" -msgstr "Yedek bulunamadı!" - -msgid "Unable to find configuration group!" -msgstr "Yapılandırma grubu bulunamadı!" - -msgid "Unable to find master instance!" -msgstr "Ana sunucu bulunamadı!" - -msgid "Unable to get configuration data." -msgstr "Yapılandırma verisi alınamıyor." - -msgid "Unable to get database backup data." -msgstr "Veritabanı yedek verisi alınamadı." - -msgid "Unable to get databases data." -msgstr "Veritabanı verisi alınamadı." - -msgid "Unable to get instances data." -msgstr "Sunucunun verisi alınamıyor." - -msgid "Unable to get user access data." -msgstr "Kullanıcı erişim verisi alınamadı." - -msgid "Unable to get user data." -msgstr "Kullanıcı verisi alınamadı." - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "Küme büyütülemiyor. %s" - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "Küme büyütülemiyor: %s" - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "%(count)s \"%(name)s\" isimli başlatılamadı." - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "Küme başlatılamadı. %s" - -msgid "Unable to list database backups for parent." -msgstr "Üst için veritabanı yedekleri listelenemedi." - -msgid "Unable to list database instances to backup." -msgstr "Yedek alınacak veritabanı sunucuları listelenemedi." - -msgid "" -"Unable to load {0} log\n" -"{1}" -msgstr "" -"{0} günlüğü yüklenemedi\n" -"{1}" - -msgid "Unable to load {0} log for instance \"{1}\"." -msgstr "\"{1}\" sunucusu için {0} günlüğü yüklenemedi." - -msgid "Unable to obtain datastore versions." -msgstr "Verideposu sürümleri edinilemedi." - -msgid "Unable to obtain datastores." -msgstr "Veridepoları edinilemedi." - -msgid "Unable to obtain flavors." -msgstr "Nitelikler edinilemedi." - -msgid "Unable to obtain information on root user" -msgstr "Kök kullanıcı hakkında bilgi edinilemedi" - -msgid "Unable to obtain list of parameters." -msgstr "Parametre listesi edinilemedi." - -#, python-format -msgid "Unable to promote replica as the new replica source. \"%s\"" -msgstr "Kopya yeni kopya kaynağı olarak yükseltilemedi. \"%s\"" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "Sunucular kümeden kaldırılamadı: %s" - -#, python-format -msgid "Unable to reset password. %s" -msgstr "Parola sıfırlanamadı. %s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "Sunucu yeniden boyutlandırılamıyor. %s" - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "Birim yeniden boyutlandırılamıyor. %s" - -msgid "Unable to retrieve accessible databases." -msgstr "Erişilebilir veritabanları alınamıyor." - -msgid "Unable to retrieve availability zones." -msgstr "Kullanılırlık bölgesi alınamadı." - -msgid "Unable to retrieve cluster details." -msgstr "Küme ayrıntıları alınamıyor." - -msgid "Unable to retrieve database clusters." -msgstr "Veritabanı kümeleri alınamıyor." - -msgid "Unable to retrieve database instances." -msgstr "Veritabanı sunucuları alınamadı." - -msgid "Unable to retrieve database size information." -msgstr "Veritabanı boyut bilgisi alınamıyor." - -msgid "Unable to retrieve databases." -msgstr "Veritabanları alınamadı." - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "Yedek için ayrıntılar alınamadı: %s" - -#, python-format -msgid "Unable to retrieve details for configuration group: %s" -msgstr "Yapılandırma grubu için ayrıntılar alınamadı: %s" - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "Veritabanı kümesi için ayrıntılar alınamıyor: %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "Veritabanı sunucusu için ayrıntılar alınamadı: %s" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "Üst yedek için ayrıntılar alınamadı: %s" - -msgid "Unable to retrieve flavors." -msgstr "Nitelikler alınamadı." - -msgid "Unable to retrieve instance details." -msgstr "Sunucu ayrıntıları alınamadı." - -#, python-format -msgid "" -"Unable to retrieve list of logs.\n" -"%s" -msgstr "" -"Günlüklerin listesi alınamadı.\n" -"%s" - -msgid "Unable to retrieve networks." -msgstr "Ağlar alınamadı." - -#, python-format -msgid "Unable to update user. %s" -msgstr "Kullanıcı güncellenemedi. %s" - -msgid "Unknown" -msgstr "Bilinmiyor" - -msgid "Updated" -msgstr "Güncellendi" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "\"%s\" kullanıcısı güncellendi." - -msgid "User Name" -msgstr "Kullanıcı Adı" - -msgid "Username (required)" -msgstr "Kullanıcı adı (gerekli)" - -msgid "Users" -msgstr "Kullanıcılar" - -msgid "Value" -msgstr "Değer" - -msgid "Value must be \"true\" or \"false\"." -msgstr "Değer \"doğru\" ya da \"yanlış\" olmalı." - -#, python-format -msgid "Value must be a number between %(min)s and %(max)s." -msgstr "Değer %(min)s ve %(max)s arasında bir sayı olmalı." - -#, python-format -msgid "Value must be a number greater than or equal to %s." -msgstr "Değer %s'e eşit ya da daha büyük bir sayı olmalı." - -#, python-format -msgid "Value must be a number less than or equal to %s." -msgstr "Değer %s'e eşit ya da daha küçük bir sayı olmalı." - -msgid "Value must be a number." -msgstr "Değer bir sayı olmalı." - -#, python-format -msgid "Value must be of type %s." -msgstr "Değer %s türünde olmalı." - -msgid "Values" -msgstr "Değerler" - -msgid "View Full Log" -msgstr "Tam Günlüğü Göster" - -msgid "View Log" -msgstr "Günlüğü Görüntüle" - -msgid "Volume" -msgstr "Birim" - -msgid "Volume Size" -msgstr "Birim Boyutu" - -msgid "Volume Type" -msgstr "Birim Türü" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "%(action)s için yetkili değilsiniz: %(objs)s" - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"Bir üst yedek seçerek artımlı yedek alabilirsiniz. Ancak, " -"tüm veritabanları artarak yedek alımını desteklemiyor, bu durumda bu işlem " -"hatayla sonlanır." - -msgid "You must select a datastore type and version." -msgstr "Bir verideposu türü ve sürümü seçmelisiniz." - -msgid "You must select a flavor." -msgstr "Bir nitelik seçmelisiniz." - -msgid "You must specify a password if you create a user." -msgstr "Kullanıcı oluşturursanız bir parola belirtmelisiniz." - -msgid "You must specify at least one database if you create a user." -msgstr "Kullanıcı oluşturursanız en az bir veritabanı belirtmelisiniz." - -#, python-format -msgid "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" -msgstr "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" - -msgid "instance" -msgstr "sunucu" diff --git a/trove_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po b/trove_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po deleted file mode 100644 index f14cf22..0000000 --- a/trove_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,40 +0,0 @@ -# işbaran akçayır , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 9.0.0.0b2.dev2\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-05-12 11:33+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-24 02:16+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 3.9.6\n" -"X-POOTLE-MTIME: 1495635326.000000\n" - -msgid "Created" -msgstr "Oluşturuldu" - -msgid "Database" -msgstr "Veri tabanı" - -msgid "Datastore" -msgstr "Veri deposu" - -msgid "Datastore Version" -msgstr "Veri Deposu Sürümü" - -msgid "Incremental" -msgstr "Artan" - -msgid "Name" -msgstr "İsim" - -msgid "Unable to retrieve the Backups." -msgstr "Yedekler alınamıyor." - -msgid "status" -msgstr "durum" diff --git a/trove_dashboard/locale/zh_CN/LC_MESSAGES/django.po b/trove_dashboard/locale/zh_CN/LC_MESSAGES/django.po deleted file mode 100644 index 87aaf93..0000000 --- a/trove_dashboard/locale/zh_CN/LC_MESSAGES/django.po +++ /dev/null @@ -1,1404 +0,0 @@ -# Andreas Jaeger , 2016. #zanata -# BillXiang <1138647106@qq.com>, 2016. #zanata -# Yu Long , 2016. #zanata -# sunanchen , 2016. #zanata -# Gaoxiao Zhu , 2017. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 8.0.0.0rc2.dev4\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2017-02-09 07:58+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2017-02-09 02:24+0000\n" -"Last-Translator: Gaoxiao Zhu \n" -"Language-Team: Chinese (China)\n" -"Language: zh-CN\n" -"X-Generator: Zanata 3.9.6\n" -"Plural-Forms: nplurals=1; plural=0\n" - -#, python-format -msgid "%(name)s | %(RAM)s RAM" -msgstr "%(name)s | %(RAM)s RAM" - -#, python-format -msgid "%(name)s | %(RAM)s RAM | %(instances)s instances" -msgstr "%(name)s | %(RAM)s 内存 | %(instances)s 实例" - -msgid "-" -msgstr "-" - -msgid "" -"Please note: It may be necessary to reboot the database " -"instance for this new configuration group to take effect." -msgstr "请注意:可能需要重启数据库实例来使新配置组生效。" - -msgid "" -"Please note: The value specified in the Volume Size field " -"should be greater than 0, however, some configurations do not support " -"specifying volume size. If specifying the volume size results in an error " -"stating volume support is not enabled, enter 0." -msgstr "" -"请注意: 云硬盘大小字段中指定的数字必须大于零,但是,有一些" -"配置不支持指定云硬盘大小。如果指定云硬盘大小会导致不支持云硬盘的错误,则输入" -"0。" - -msgid "A backup must be selected!" -msgstr "必须选择一个备份!" - -msgid "A master instance must be selected!" -msgstr "必须选择一个主实例!" - -msgid "A new name or new password or new host must be specified." -msgstr "必须指定新名称、新密码或新主机。" - -msgid "Access Revoked to" -msgid_plural "Access Revoked to" -msgstr[0] "撤销访问" - -msgid "Accessible" -msgstr "可访问的" - -msgctxt "Current status of a Database Instance" -msgid "Active" -msgstr "激活" - -msgid "Add" -msgstr "添加" - -msgid "Add Instance" -msgstr "添加实例" - -msgid "Add Parameter" -msgstr "增加参数" - -msgid "" -"Add parameters to the configuration group. When all the parameters are " -"added click 'Apply Changes' to persist changes." -msgstr "" -"给配置组增加参数。当所有参数都增加之后点击'Apply Changes'来应用这些改变" - -msgid "Advanced" -msgstr "高级" - -msgid "" -"Allow the user to connect from this host only. If not provided this user " -"will be allowed to connect from anywhere." -msgstr "" -"只允许用户从本机进行连接。如果不提供主机信息,用户将被允许从任何位置进行连" -"接。" - -msgid "Allowed Host" -msgstr "允许的主机" - -msgid "Allowed Host (optional)" -msgstr "允许主机(可选)" - -msgid "Any Availability Zone" -msgstr "所有可用区" - -msgid "Applicable only if the volume size is specified." -msgstr "只有卷大小指定后才可以应用。" - -msgid "Applied changes to server" -msgstr "对主机应用这些改变" - -msgid "Apply Changes" -msgstr "应用改变" - -msgid "At least one of the new fields must be changed." -msgstr "至少修改一个新的字段。" - -msgid "Attach Configuration Group" -msgstr "连接配置组" - -#, python-format -msgid "Attaching Configuration group \"%s\"" -msgstr "正在连接配置组\"%s\"" - -msgid "Availability Zone" -msgstr "可用区" - -msgid "Available networks" -msgstr "可用网络" - -msgid "Backup" -msgstr "备份" - -msgctxt "Current status of a Database Instance" -msgid "Backup" -msgstr "备份" - -msgid "Backup Database" -msgstr "备份数据库" - -msgid "Backup Details" -msgstr "备份详情" - -msgid "Backup Details: {{ backup.name }}" -msgstr "备份详情: {{ backup.name }}" - -msgid "Backup Duration" -msgstr "备份周期" - -msgid "Backup File" -msgstr "备份文件" - -msgid "Backup File Location" -msgstr "备份文件位置" - -msgid "Backup Name" -msgstr "备份名称" - -msgid "Backup Overview" -msgstr "备份概览" - -msgid "Backups" -msgstr "备份" - -msgctxt "Current status of a Database Instance" -msgid "Blocked" -msgstr "阻塞" - -msgctxt "Current status of a Database Backup" -msgid "Building" -msgstr "构建中" - -msgctxt "Current status of a Database Instance" -msgid "Building" -msgstr "构建中" - -msgid "Cancel" -msgstr "取消" - -#, python-format -msgid "Cannot disable root access: %s" -msgstr "不能够即你用root用户访问:%s" - -msgid "Cannot grow cluster. No instances specified." -msgstr "无法扩大集群。没有指定实例。" - -msgid "Character Set" -msgstr "字符集" - -msgid "Choose a new instance flavor." -msgstr "选择一新的实例类型。" - -msgid "Choose initial state." -msgstr "选择初始化状态" - -msgid "Close" -msgstr "关闭" - -msgid "Cluster Name" -msgstr "集群名称" - -msgid "Cluster Size" -msgstr "集群大小" - -msgid "Clusters" -msgstr "集群" - -msgid "Collation" -msgstr "排序" - -msgid "Comma separated list of databases to create" -msgstr "逗号分隔的将创建数据库的列表" - -msgctxt "Current status of a Database Backup" -msgid "Completed" -msgstr "完成" - -msgid "Configuration Defaults" -msgstr "默认配置" - -msgid "Configuration Group" -msgstr "配置组" - -msgid "Configuration Group Details: {{configuration.name}}" -msgstr "配置组详情:{{configuration.name}}" - -msgid "Configuration Group Instances" -msgstr "配置组实例" - -msgid "Configuration Group Name" -msgstr "配置组名称" - -msgid "Configuration Group Overview" -msgstr "配置组概览" - -msgid "Configuration Group Values" -msgstr "配置组值" - -msgid "Configuration Groups" -msgstr "配置组" - -msgid "" -"Confirm the current replica is to be promoted as the new replica source." -msgstr "确认设置当前副本为新副本源" - -msgid "Connection Examples" -msgstr "连接举例" - -msgid "Connection Information" -msgstr "连接信息" - -msgid "Container" -msgstr "容器" - -msgid "Create Backup" -msgstr "创建备份" - -msgid "Create Configuration Group" -msgstr "创建配置组" - -msgid "Create Database" -msgstr "创建数据库" - -msgid "Create User" -msgstr "创建用户" - -msgid "" -"Create an optional initial user. This user will have access to all databases " -"you create." -msgstr "创建可选的初始用户。这个用户将可以访问你创建的所有数据库。" - -msgid "Created" -msgstr "已创建" - -msgid "Created configuration group" -msgstr "创建配置组" - -#, python-format -msgid "Created database \"%s\"." -msgstr "创建的数据库 \"%s\"。" - -#, python-format -msgid "Created user \"%s\"." -msgstr "创建用户\"%s\"。" - -msgid "Current Replica" -msgstr "当前副本" - -msgid "Current Replica Source" -msgstr "当前副本源" - -msgid "Current Size (GB)" -msgstr "当前大小(GB)" - -msgid "Current Task" -msgstr "当前任务" - -msgid "DATABASE" -msgstr "数据库" - -msgid "Database" -msgstr "数据库" - -msgid "Database Access" -msgstr "数据库访问" - -msgid "Database Access for: {{ user_name }}" -msgstr "数据库访问:{{ user_name }}" - -msgid "Database Backups" -msgstr "数据库备份" - -msgid "Database Info" -msgstr "数据库信息" - -msgid "Database Instance" -msgstr "数据库实例" - -msgid "Database Name" -msgstr "数据库名称" - -msgid "Database Port" -msgstr "数据库端口" - -msgid "Databases" -msgstr "数据库" - -msgid "Datastore" -msgstr "数据存储" - -msgid "Datastore Version" -msgstr "数据存储版本" - -msgid "Defaults" -msgstr "默认值" - -msgid "Delete Backup" -msgid_plural "Delete Backups" -msgstr[0] "删除备份" - -msgid "Delete Cluster" -msgid_plural "Delete Clusters" -msgstr[0] "删除集群" - -msgid "Delete Database" -msgid_plural "Delete Databases" -msgstr[0] "已删除的数据库" - -msgctxt "Current status of a Database Backup" -msgid "Delete Failed" -msgstr "删除失败" - -msgid "Delete Instance" -msgid_plural "Delete Instances" -msgstr[0] "删除实例" - -msgid "Delete User" -msgid_plural "Delete Users" -msgstr[0] "删除用户" - -msgid "Deleted Backup" -msgid_plural "Deleted Backups" -msgstr[0] "已删除的备份" - -msgid "Deleted Database" -msgid_plural "Deleted Databases" -msgstr[0] "已删除的数据库" - -msgid "Deleted User" -msgid_plural "Deleted Users" -msgstr[0] "已删除的用户" - -msgid "Deleted cluster is not recoverable." -msgstr "删除的集群无法恢复。" - -msgid "Deleted instances are not recoverable." -msgstr "删除实例是不可恢复的。" - -msgid "Description" -msgstr "描述" - -msgid "Detach Configuration Group" -msgid_plural "Detach Configuration Groups" -msgstr[0] "分离配置组" - -msgid "Detach Replica" -msgid_plural "Detach Replicas" -msgstr[0] "分离镜像" - -msgid "Detached Configuration Group" -msgid_plural "Detached Configuration Groups" -msgstr[0] "已分离的配置组" - -msgid "Details" -msgstr "详情" - -msgid "Disable Log" -msgid_plural "Disable Logs" -msgstr[0] "禁用日志" - -msgid "Disable Root" -msgstr "禁用root" - -msgid "Disabled Log" -msgid_plural "Disabled Logs" -msgstr[0] "已禁用日志" - -msgid "Discard Changes" -msgstr "放弃改变" - -msgid "Discard Log" -msgid_plural "Discard Logs" -msgstr[0] "废弃日志" - -msgid "Discarded Log" -msgid_plural "Discarded Logs" -msgstr[0] "已废弃日志" - -msgid "Download" -msgstr "下载" - -msgid "Download Backup" -msgstr "下载备份" - -msgid "Edit User" -msgstr "编辑用户" - -msgid "Eject Replica Source" -msgid_plural "Eject Replica Sources" -msgstr[0] "删除副本源" - -msgid "Ejected Replica Source" -msgid_plural "Ejected Replica Sources" -msgstr[0] "已删除的副本源" - -msgid "Enable Log" -msgid_plural "Enable Logs" -msgstr[0] "启用日志" - -msgid "Enable Root" -msgstr "启动root" - -msgid "Enabled Log" -msgid_plural "Enabled Logs" -msgstr[0] "已启用日志" - -msgctxt "Current status of a Database Instance" -msgid "Error" -msgstr "错误" - -msgid "Error applying changes" -msgstr "应用改变错误" - -msgid "Error creating database backup." -msgstr "创建数据库备份错误" - -msgid "Error deleting database on instance." -msgstr "在实例上删除数据库出错。" - -#, python-format -msgid "Error downloading log file: %s" -msgstr "下载日志文件: %s错误" - -msgid "Error getting configuration group list." -msgstr "获取配置组列表错误" - -msgid "Error getting database backup list." -msgstr "获取数据库备份列表错误。" - -#, python-format -msgid "Error resetting parameters: %s" -msgstr "重置参数:%s错误" - -msgctxt "Current status of a Database Backup" -msgid "Failed" -msgstr "失败" - -msgctxt "Current status of a Database Instance" -msgid "Failed" -msgstr "失败" - -msgid "Fault" -msgstr "故障" - -msgid "Flavor" -msgstr "云主机类型" - -msgid "GB" -msgstr "GB" - -msgid "Go" -msgstr "执行" - -msgid "Grant Access" -msgid_plural "Grant Access" -msgstr[0] "授权" - -msgid "Granted Access to" -msgid_plural "Granted Access to" -msgstr[0] "授权给" - -msgid "Grow Cluster" -msgstr "扩大集群" - -msgid "Grow Cluster: {{cluster_name}}" -msgstr "扩大集群:{{cluster_name}}" - -msgid "Has Root Ever Been Enabled" -msgstr "启用Root" - -msgid "Host" -msgstr "主机" - -msgid "Host or IP that the user is allowed to connect through." -msgstr "允许用户用于连接的主机或者IP。" - -msgid "ID" -msgstr "ID" - -msgid "Incremental" -msgstr "增量" - -msgid "Incremental Backup" -msgstr "增量备份" - -msgid "Info" -msgstr "信息" - -msgid "Information" -msgstr "信息" - -msgid "Initial Admin User" -msgstr "初始管理员" - -msgid "Initial Databases" -msgstr "初始化数据库" - -msgid "Initial Volume Size" -msgstr "初始云硬盘大小" - -msgid "Initial admin user to add" -msgstr "增加初始管理员" - -msgid "Initialize Databases" -msgstr "初始化数据库" - -msgid "Instance Name" -msgstr "实例名字" - -msgid "Instance Type" -msgstr "实例类型" - -msgid "Instances" -msgstr "实例" - -msgid "Is a Replica Of" -msgstr "副本" - -msgid "Launch" -msgstr "启动" - -msgid "Launch Cluster" -msgstr "启动集群" - -msgid "Launch Database" -msgstr "启动数据库" - -msgid "Launch Instance" -msgstr "启动实例" - -#, python-format -msgid "Launched %(count)s named \"%(name)s\"." -msgstr "启动了%(count)s 名称\"%(name)s\"。" - -#, python-format -msgid "Launched cluster \"%s\"" -msgstr "启动集群\"%s\"" - -msgid "Locality" -msgstr "地域" - -msgid "Log" -msgstr "日志" - -msgid "Log Contents" -msgstr "日志内容" - -msgid "Log Length" -msgstr "日志长度" - -msgid "Log length must be a nonnegative integer." -msgstr "日志长度必须为非负整数值。" - -msgid "Log: " -msgstr "日志:" - -msgid "Logs" -msgstr "日志" - -msgid "Manage Access" -msgstr "管理访问" - -msgid "Manage Root" -msgstr "管理Root" - -msgid "Manage Root Access" -msgstr "管理Root访问" - -msgid "Management Console" -msgstr "管理控制台" - -msgid "Master Instance Name" -msgstr "主实例名称" - -msgid "Message" -msgstr "消息" - -msgid "" -"Move networks from 'Available Networks' to 'Selected Networks' by clicking " -"the button, or dragging and dropping. You can change the NIC order by " -"dragging and dropping as well." -msgstr "" -"通过点击按钮来把网络从“可用网络”移动到“选中网络”,或者通过拖放。当然你也可以" -"通过拖放来改变网卡顺序。" - -msgid "Name" -msgstr "名称" - -msgid "Network" -msgstr "网络" - -msgid "Network attached to instance." -msgstr "附加到实例的网络。" - -msgctxt "Current status of a Database Backup" -msgid "New" -msgstr "新建" - -msgid "New Flavor" -msgstr "新的云主机类型" - -msgid "New Host" -msgstr "新主机" - -msgid "New Name" -msgstr "新名称" - -msgid "New Password" -msgstr "新密码" - -msgid "New Size (GB)" -msgstr "新大小(GB)" - -msgid "New password for cluster access." -msgstr "访问集群的新密码。" - -msgid "New size for volume must be greater than current size." -msgstr "卷的新大小必须大于当前的大小。" - -msgid "No availability zones found" -msgstr "未找到可用区" - -msgid "No backups available" -msgstr "没有可用的备份" - -msgid "No configuration groups available" -msgstr "没有可用的配置组" - -msgid "No configurations available" -msgstr "没有可用的配置" - -msgid "No flavors available" -msgstr "没有可用的云主机类型" - -msgid "No instances available" -msgstr "无可用云主机" - -msgid "No volume type" -msgstr "没有卷类型" - -msgid "None" -msgstr "无" - -msgid "Not Assigned" -msgstr "没有分配" - -msgid "Not Found" -msgstr "找不到" - -msgid "Not available" -msgstr "不可用" - -msgid "" -"Note: Enable root access on an instance. If the root user is already " -"enabled then a new password is generated." -msgstr "备注:在实例上启用root访问。如果root用户已经启用,那么生成一个新密码。" - -msgid "Number of Instances" -msgstr "云主机数量" - -msgid "Number of Shards" -msgstr "Shard数" - -msgid "Number of instances in the cluster." -msgstr "集群中的云主机数量。" - -msgid "Number of instances in the cluster. (Read only)" -msgstr "集群中的实例数。(只读)" - -msgid "Number of shards. (Read only)" -msgstr "Shard数。(只读)" - -msgid "Old Flavor" -msgstr "旧的云主机类型" - -msgid "Optional Backup Description" -msgstr "数据库备份描述" - -msgid "Optional character set for the database." -msgstr "数据库的可选字符集。" - -msgid "Optional collation type for the database." -msgstr "数据库的可选排序规则。" - -msgid "Optional comma separated list of databases user has access to." -msgstr "可选,逗号分隔的可以访问的数据库用户列表。" - -msgid "Optional datastore specific type of the instance." -msgstr "可选,实例的数据存储类型" - -msgid "" -"Optional datastore specific value that defines the relationship from one " -"instance in the cluster to another." -msgstr "可选,数据存储确定值,这个值定义了集群中的实例与另一个实例的关系。" - -msgid "Optional host of user." -msgstr "可选用户的主机" - -msgid "Optional name of the instance." -msgstr "实例的可选名称。" - -msgid "Optional parent backup" -msgstr "可选父备份" - -msgid "" -"Optionally choose to create this database using a previous backup, or as a " -"replica of another database instance." -msgstr "可选择使用之前的备份来创建数据库,或使用另一个数据库实例的复制。" - -msgid "Optionally provide a character set and collation for the database." -msgstr "可选,提供数据库字符集设置和字符序collation" - -msgid "Optionally provide a comma separated list of databases to create:" -msgstr "也可以提供用逗号分隔的列表来创建数据库:" - -msgid "" -"Optionally provide the host of the user and a list of databases the user is " -"granted access to." -msgstr "可选,提供用户主机和授权用户可访问的数据库列表。" - -msgid "Overview" -msgstr "概览" - -msgid "PASSWORD" -msgstr "密码" - -msgid "Parameter" -msgstr "参数" - -msgid "Parameters" -msgstr "参数" - -msgid "Parent Backup" -msgstr "父备份" - -msgid "Password" -msgstr "密码" - -msgid "Password (required)" -msgstr "密码(必填)" - -msgid "Password for root user must be specified." -msgstr "必须指定root用户密码。" - -msgid "Password for root user." -msgstr "root用户密码" - -msgid "" -"Password is only visible immediately after the root is enabled or reset." -msgstr "在root启用或重置时,密码只能临时可用。" - -msgid "" -"Please note: The new value must be greater than the existing volume " -"size." -msgstr "请注意:新卷容量大小必须大于当前卷容量大小" - -msgid "Promote" -msgstr "设置" - -msgid "Promote to Replica Source" -msgstr "设置副本源" - -#, python-format -msgid "Promoted replica \"%s\" as the new replica source." -msgstr "设置副本\"%s\" 为新副本源。" - -msgid "Property" -msgstr "属性" - -msgid "Publish" -msgstr "发布" - -msgid "Publish Log" -msgid_plural "Publish Logs" -msgstr[0] "发行日志" - -msgid "Publishable (bytes)" -msgstr "可发布的(字节)" - -msgid "Published (bytes)" -msgstr "发布(字节)" - -msgid "Published Log" -msgid_plural "Published Logs" -msgstr[0] "已发行日志" - -msgid "RAM" -msgstr "内存" - -msgctxt "Current status of a Database Instance" -msgid "Rebooting" -msgstr "重启中" - -msgid "Related To" -msgstr "相关" - -msgid "Remove Instance" -msgid_plural "Remove Instances" -msgstr[0] "移除实例" - -msgid "Removed Instance" -msgid_plural "Removed Instances" -msgstr[0] "移除实例" - -msgid "Removed instances from cluster." -msgstr "从集群中移除实例" - -msgid "Replica Count" -msgstr "副本数量" - -msgid "Replica Detached" -msgid_plural "Replicas Detached" -msgstr[0] "镜像已经分离" - -msgid "Replicas" -msgstr "副本" - -msgid "Replicate from Instance" -msgstr "从实例复制" - -msgid "Replication" -msgstr "复制" - -msgid "Reset Parameters" -msgstr "重置参数" - -msgid "Reset Root Password" -msgstr "重置root密码" - -msgid "Resize Database Instance" -msgstr "调整数据库实例大小" - -msgid "Resize Database Volume" -msgstr "调整数据库卷大小" - -msgid "Resize Instance" -msgstr "调整云主机大小" - -msgid "Resize Volume" -msgstr "调整卷大小" - -msgctxt "Current status of a Database Instance" -msgid "Resizing" -msgstr "正在调整大小" - -#, python-format -msgid "Resizing instance \"%s\"" -msgstr "调整实例 \"%s\" 的大小" - -#, python-format -msgid "Resizing volume \"%s\"" -msgstr "正在调整卷 \"%s\" 的大小" - -msgid "Restart Instance" -msgid_plural "Restart Instances" -msgstr[0] "重启实例" - -msgctxt "Current status of a Database Instance" -msgid "Restart Required" -msgstr "需要重启" - -msgid "Restarted Instance" -msgid_plural "Restarted Instances" -msgstr[0] "已重启的实例" - -msgid "Restarted instances will lose any data not saved in persistent storage." -msgstr "重启实例会丢失所有尚未保存到永久存储上的数据。" - -msgid "Restore Backup" -msgstr "恢复备份" - -msgid "Restore from Backup" -msgstr "从备份中恢复" - -msgid "Return to Log List" -msgstr "返回日志列表" - -msgid "Revoke Access" -msgid_plural "Revoke Access" -msgstr[0] "回收权限" - -msgid "Root Enabled" -msgstr "启用Root" - -msgid "Root Password" -msgstr "Root密码" - -#, python-format -msgid "Root password updated for cluster \"%s\"" -msgstr "集群\"%s\"的root密码已经更新" - -msgctxt "Current status of a Database Backup" -msgid "Saving" -msgstr "保存" - -msgid "Scheduled Shrinking of Cluster" -msgid_plural "Scheduled Shrinking of Cluster" -msgstr[0] "已计划缩小集群" - -#, python-format -msgid "Scheduled backup \"%(name)s\"." -msgstr "已为备份\"%(name)s\"排期." - -msgid "Scheduled deletion of Cluster" -msgid_plural "Scheduled deletion of Clusters" -msgstr[0] "已计划删除集群" - -msgid "Scheduled deletion of Instance" -msgid_plural "Scheduled deletion of Instances" -msgstr[0] "已安排删除实例" - -msgid "Scheduled growing of cluster." -msgstr "已安排扩大集群" - -msgid "Select a backup to restore" -msgstr "选择一个备份来恢复" - -msgid "Select a configuration group" -msgstr "选择一个配置组" - -msgid "Select a configuration group to attach to the database instance." -msgstr "选择一个连接到数据库实例的配置组" - -msgid "Select a master instance" -msgstr "选择一主实例" - -msgid "Select a new flavor" -msgstr "选择一个新的云主机类型" - -msgid "Select a parameter and provide a value for the configuration parameter." -msgstr "选择一个参数并且为这个参数的配置提供一个值" - -msgid "Select backup" -msgstr "选择备份" - -msgid "Select configuration" -msgstr "选择配置" - -msgid "Select configuration group" -msgstr "选择配置组" - -msgid "Select datastore type and version" -msgstr "选择数据存储类型和版本" - -msgid "Select instance" -msgstr "选择云主机" - -msgid "Select parent backup" -msgstr "选择父备份" - -msgid "Select the instance(s) that will be removed from the cluster." -msgstr "选择将从集群中移除的实例。" - -msgid "Selected networks" -msgstr "已选择的网络" - -msgid "Shrink Cluster" -msgid_plural "Shrink Cluster" -msgstr[0] "缩小集群" - -msgid "Shrink Cluster: {{cluster_name}}" -msgstr "缩小集群:{{cluster_name}}" - -msgid "Shrinking a cluster is not recoverable." -msgstr "缩小集群是无法恢复的" - -msgctxt "Current status of a Database Instance" -msgid "Shutdown" -msgstr "关闭" - -msgid "Size" -msgstr "大小" - -msgid "Size of image to launch." -msgstr "要启动的镜像大小。" - -msgid "Size of instance to launch." -msgstr "启动实例的大小" - -msgid "Size of the volume in GB." -msgstr "以GB为单位的云硬盘大小。" - -msgid "Source for Initial State" -msgstr "初始状态来源" - -msgid "Specify a new flavor for the database instance." -msgstr "指定数据库实例新的类型。" - -msgid "Specify a new name, new password or new host name for the user." -msgstr "指定新名称、新密码或者用户的新主机名。" - -msgid "Specify the details for launching an instance." -msgstr "指定启动实例的详细信息" - -msgid "Specify the details for the database backup." -msgstr "指定数据库备份详情。" - -msgid "Specify the details of the instance to be added to the cluster." -msgstr "指定将要添加到集群的实例详情。" - -msgid "" -"Specify the instances to be added to the cluster. When all the instances " -"are specified click 'Grow Cluster' to perform the grow operation." -msgstr "" -"指定将要添加到集群的实例。当指定完所有实例后,点击“扩大集群”执行扩大操作。" - -msgid "Specify the name of the new database." -msgstr "指定新数据库实例名称。" - -msgid "Specify the name of the new user and password." -msgstr "指定新用户名称和密码。" - -msgid "Specify the new root password for vertica cluster." -msgstr "为vertica集群指定新的root密码。" - -msgid "Specify the new volume size for the database instance." -msgstr "指定数据库实例新的卷大小。" - -msgid "Specify the number of replicas to be created" -msgstr "指定创建副本的数量" - -msgid "" -"Specify whether future replicated instances will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity). This " -"value is ignored if the instance to be launched is a replica." -msgstr "" -"验证同一hypervisor(关联)或不同hypervisor(非关联)中是否创建了实例副本。如" -"果实例创建了一个副本,该值可忽略" - -msgid "" -"Specify whether instances in the cluster will be created on the same " -"hypervisor (affinity) or on different hypervisors (anti-affinity)." -msgstr "" -"验证同一hypervisor(关联)或不同hypervisor(非关联)中是否创建了集群的实例" - -msgid "Specs" -msgstr "规格" - -msgid "Status" -msgstr "状态" - -msgid "Status if root was ever enabled for an instance." -msgstr "如果实例的root被启用,状态。" - -msgid "Successfully added parameter" -msgstr "成功增加参数" - -msgid "Successfully disabled root access." -msgstr "成功禁用root用户访问。" - -msgid "" -"The 'Instance Type' and 'Related To' fields are datastore specific and " -"optional. See the Trove documentation for more information on using these " -"fields." -msgstr "" -"‘实例类型’和‘关联’字段是具体的存储和可选。参考Trove手册了解更多使用这些字段的" -"信息。" - -msgid "The flavor must be specified." -msgstr "必须指定云主机类型。" - -msgid "" -"The name field is optional. If the field is left blank a name will be " -"generated when the cluster is grown." -msgstr "名称字段是可选的。如果字段不填,当集群扩大时会自动生成名称。" - -msgid "The number of instances must be greater than 1." -msgstr "实例的数量必须大于1。" - -msgid "The number of shards must be greater than 1." -msgstr "shard数必须大于1。" - -msgid "There was a problem enabling root." -msgstr "启用root时,出现问题。" - -msgid "This action cannot be undone." -msgstr "此操作无法撤销。" - -msgid "Type" -msgstr "类型" - -msgid "Type and version of datastore." -msgstr "数据存储的类型和版本。" - -msgid "USERNAME" -msgstr "用户名" - -#, python-format -msgid "Unable to %(action)s: %(objs)s" -msgstr "无法执行 %(action)s: %(objs)s" - -#, python-format -msgid "Unable to add new parameter: %s" -msgstr "无法增加新参数:%s" - -#, python-format -msgid "Unable to attach configuration group. %s" -msgstr "无法连接配置组%s" - -#, python-format -msgid "Unable to create configuration group. %s" -msgstr "无法创建配置组%s" - -#, python-format -msgid "Unable to create database. %s" -msgstr "无法创建的数据库. %s" - -msgid "Unable to create list of parameters." -msgstr "无法创建参数列表" - -#, python-format -msgid "Unable to create user. %s" -msgstr "无法创建用户。%s" - -msgid "Unable to determine if instance root is enabled." -msgstr "无法确定实例root账号是否启用。" - -msgid "Unable to find backup!" -msgstr "无法找到备份!" - -msgid "Unable to find configuration group!" -msgstr "无法找到配置组" - -msgid "Unable to find master instance!" -msgstr "无法找到主实例!" - -msgid "Unable to get configuration data." -msgstr "无法获得配置数据" - -msgid "Unable to get database backup data." -msgstr "无法获取数据库备份数据。" - -msgid "Unable to get databases data." -msgstr "无法获取数据库数据。" - -msgid "Unable to get instances data." -msgstr "无法获取实例数据。" - -msgid "Unable to get user access data." -msgstr "无法获取用户可用数据。" - -msgid "Unable to get user data." -msgstr "无法获取用户数据。" - -#, python-format -msgid "Unable to grow cluster. %s" -msgstr "无法扩充集群 %s" - -#, python-format -msgid "Unable to grow cluster: %s" -msgstr "无法扩大集群:%s" - -#, python-format -msgid "Unable to launch %(count)s named \"%(name)s\"." -msgstr "无法启动%(count)s 名字 \"%(name)s\"." - -#, python-format -msgid "Unable to launch cluster. %s" -msgstr "无法启动集群\"%s\"" - -msgid "Unable to list database backups for parent." -msgstr "无法获取用来做母版的数据库备份列表" - -msgid "Unable to list database instances to backup." -msgstr "无法获取数据库实例进行备份。" - -msgid "" -"Unable to load {0} log\n" -"{1}" -msgstr "" -"无法加载{0} 日志\n" -"{1}" - -msgid "Unable to load {0} log for instance \"{1}\"." -msgstr "无法加载实例\"{1}\"的日志{0}" - -msgid "Unable to obtain datastore versions." -msgstr "无法获取数据存储版本。" - -msgid "Unable to obtain datastores." -msgstr "无法获取数据存储。" - -msgid "Unable to obtain flavors." -msgstr "无法获取云主机类型。" - -msgid "Unable to obtain information on root user" -msgstr "不能获取root用户的信息" - -msgid "Unable to obtain list of parameters." -msgstr "无法获得参数列表" - -#, python-format -msgid "Unable to promote replica as the new replica source. \"%s\"" -msgstr "无法设置副本为新副本源。\"%s\"" - -#, python-format -msgid "Unable to remove instances from cluster: %s" -msgstr "无法从集群中移除实例 %s" - -#, python-format -msgid "Unable to reset password. %s" -msgstr "无法重置密码。%s" - -#, python-format -msgid "Unable to resize instance. %s" -msgstr "无法调整实例 %s 的大小" - -#, python-format -msgid "Unable to resize volume. %s" -msgstr "无法调整卷 %s 的大小" - -msgid "Unable to retrieve accessible databases." -msgstr "不能获取数据库访问权限" - -msgid "Unable to retrieve availability zones." -msgstr "无法获取可用区" - -msgid "Unable to retrieve cluster details." -msgstr "无法获取集群详细信息。" - -msgid "Unable to retrieve database clusters." -msgstr "无法获取数据库集群。" - -msgid "Unable to retrieve database instances." -msgstr "无法获取数据库实例。" - -msgid "Unable to retrieve database size information." -msgstr "无法获取数据库大小信息。" - -msgid "Unable to retrieve databases." -msgstr "不能获取数据库。" - -#, python-format -msgid "Unable to retrieve details for backup: %s" -msgstr "无法获取备份: %s的详细信息" - -#, python-format -msgid "Unable to retrieve details for configuration group: %s" -msgstr "无法检索配置组:%s详情" - -#, python-format -msgid "Unable to retrieve details for database cluster: %s" -msgstr "无法获取数据库集群的详细信息: %s" - -#, python-format -msgid "Unable to retrieve details for database instance: %s" -msgstr "不能获取数据库实例详情:%s" - -#, python-format -msgid "Unable to retrieve details for parent backup: %s" -msgstr "无法获取父备份 :%s 的详细信息" - -msgid "Unable to retrieve flavors." -msgstr "无法获取云主机类型。" - -msgid "Unable to retrieve instance details." -msgstr "无法获取云主机详情。" - -#, python-format -msgid "" -"Unable to retrieve list of logs.\n" -"%s" -msgstr "" -"无法获取日志列表。\n" -"%s" - -msgid "Unable to retrieve networks." -msgstr "无法获取网络。" - -#, python-format -msgid "Unable to update user. %s" -msgstr "无法更新用户%s" - -msgid "Unknown" -msgstr "未知" - -msgid "Updated" -msgstr "已更新" - -#, python-format -msgid "Updated user \"%s\"." -msgstr "更新用户\"%s\"。" - -msgid "User Name" -msgstr "用户名" - -msgid "Username (required)" -msgstr "用户名(必填)" - -msgid "Users" -msgstr "用户" - -msgid "Value" -msgstr "值" - -msgid "Value must be \"true\" or \"false\"." -msgstr "值必须是\"true\"或者\"false\"。" - -#, python-format -msgid "Value must be a number between %(min)s and %(max)s." -msgstr "值必须是一个在%(min)s和%(max)s之间的数值" - -#, python-format -msgid "Value must be a number greater than or equal to %s." -msgstr "值必须是一个大于等于%s的数值" - -#, python-format -msgid "Value must be a number less than or equal to %s." -msgstr "值必须是一个小于等于%s的数值" - -msgid "Value must be a number." -msgstr "值必须是一个整数" - -#, python-format -msgid "Value must be of type %s." -msgstr "值必须是%s类型" - -msgid "Values" -msgstr "值" - -msgid "View Full Log" -msgstr "查看完整日志" - -msgid "View Log" -msgstr "查看日志" - -msgid "Volume" -msgstr "卷" - -msgid "Volume Size" -msgstr "云硬盘大小" - -msgid "Volume Type" -msgstr "卷类型" - -#, python-format -msgid "You are not allowed to %(action)s: %(objs)s" -msgstr "您被禁止执行 %(action)s: %(objs)s" - -msgid "" -"You can perform an incremental backup by specifying a parent backup. " -"However, not all databases support incremental backups in " -"which case this operation will result in an error." -msgstr "" -"你可以通过指定一个母版来进行增量备份。然而,不是所有的数据库" -"都支持增量备份,有些会导致备份出错。" - -msgid "You must select a datastore type and version." -msgstr "你必须选择数据存储类型和版本。" - -msgid "You must select a flavor." -msgstr "你必须选择一种规格" - -msgid "You must specify a password if you create a user." -msgstr "如果你创建用户,必须指定一个密码。" - -msgid "You must specify at least one database if you create a user." -msgstr "如果你创建用户,你必须选择至少一个数据库。" - -#, python-format -msgid "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" -msgstr "" -"[flavor=%(flavor)s, volume=%(volume)s, name=%(name)s, type=%(type)s, " -"related_to=%(related_to)s, nics=%(nics)s]" - -msgid "instance" -msgstr "实例" diff --git a/trove_dashboard/locale/zh_CN/LC_MESSAGES/djangojs.po b/trove_dashboard/locale/zh_CN/LC_MESSAGES/djangojs.po deleted file mode 100644 index 4f78438..0000000 --- a/trove_dashboard/locale/zh_CN/LC_MESSAGES/djangojs.po +++ /dev/null @@ -1,39 +0,0 @@ -# zzxwill , 2016. #zanata -msgid "" -msgstr "" -"Project-Id-Version: trove-dashboard 7.0.0.0b3.dev13\n" -"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" -"POT-Creation-Date: 2016-08-24 16:43+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-08-25 10:46+0000\n" -"Last-Translator: zzxwill \n" -"Language-Team: Chinese (China)\n" -"Language: zh-CN\n" -"X-Generator: Zanata 3.7.3\n" -"Plural-Forms: nplurals=1; plural=0\n" - -msgid "Created" -msgstr "已创建" - -msgid "Database" -msgstr "数据库" - -msgid "Datastore" -msgstr "数据存储" - -msgid "Datastore Version" -msgstr "数据存储版本" - -msgid "Incremental" -msgstr "增量" - -msgid "Name" -msgstr "名称" - -msgid "Unable to retrieve the Backups." -msgstr "无法检索备份。" - -msgid "status" -msgstr "状态" diff --git a/trove_dashboard/static/app/core/openstack-service-api/trove.service.js b/trove_dashboard/static/app/core/openstack-service-api/trove.service.js deleted file mode 100644 index 7206a97..0000000 --- a/trove_dashboard/static/app/core/openstack-service-api/trove.service.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * 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.ngbackups - * @description Dashboard module for the ngbackups panel. - */ - - angular - .module('horizon.app.core.openstack-service-api') - .factory('horizon.app.core.openstack-service-api.trove', TroveAPI); - - TroveAPI.$inject = [ - 'horizon.framework.util.http.service', - 'horizon.framework.widgets.toast.service' - ]; - - function TroveAPI(apiService, toastService) { - var service = { - getBackups: getBackups - }; - - return service; - - function getBackups() { - return apiService.get('/api/trove/backups/') - .error(function() { - toastService.add('error', gettext('Unable to retrieve the Backups.')); - }); - } - } - -}()); diff --git a/trove_dashboard/static/dashboard/project/ngbackups/backups.module.js b/trove_dashboard/static/dashboard/project/ngbackups/backups.module.js deleted file mode 100644 index ad052d5..0000000 --- a/trove_dashboard/static/dashboard/project/ngbackups/backups.module.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * 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 - * - * @description - * Dashboard module to host various backup panels. - */ - angular - .module('horizon.dashboard.project.backups', []) - .config(config); - - config.$inject = ['$provide', '$windowProvider']; - - function config($provide, $windowProvider) { - var path = $windowProvider.$get().STATIC_URL + 'dashboard/project/'; - $provide.constant('horizon.dashboard.project.basePath', path); - } - -})(); \ No newline at end of file diff --git a/trove_dashboard/static/dashboard/project/ngbackups/backups.module.spec.js b/trove_dashboard/static/dashboard/project/ngbackups/backups.module.spec.js deleted file mode 100644 index b1cbbb8..0000000 --- a/trove_dashboard/static/dashboard/project/ngbackups/backups.module.spec.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * 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'; - - describe('horizon.dashboard.project.backups', function() { - it('should exist', function() { - expect(angular.module('horizon.dashboard.project.backups')).toBeDefined(); - }); - }); - -})(); \ No newline at end of file diff --git a/trove_dashboard/static/dashboard/project/ngbackups/backups.scss b/trove_dashboard/static/dashboard/project/ngbackups/backups.scss deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/static/dashboard/project/ngbackups/table/table.config.js b/trove_dashboard/static/dashboard/project/ngbackups/table/table.config.js deleted file mode 100644 index 3e3cc5b..0000000 --- a/trove_dashboard/static/dashboard/project/ngbackups/table/table.config.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * 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.backups') - .factory('horizon.dashboard.project.backups.tableConfigService', - tableConfigService); - - tableConfigService.$inject = [ - 'horizon.framework.util.extensible.service' - ]; - - /** - * @ngdoc service - * @name horizon.dashboard.project.ngbackups.tableConfigService - * @description Backup table attributes - */ - - function tableConfigService(extensibleService) { - var config = { - selectAll: true, - expand: true, - trackId: 'id', - columns: [{ - id: 'name', - title: gettext('Name'), - priority: 1, - sortDefault: true - }, - { - id: 'datastore', - title: gettext('Datastore'), - priority: 1, - }, - { - id: 'datastoreversion', - title: gettext('Datastore Version'), - priority: 1, - }, - { - id: 'created', - title: gettext('Created'), - priority: 1, - }, - { - id: 'database', - title: gettext('Database'), - priority: 1, - }, - { - id: 'incremental', - title: gettext('Incremental'), - filters: ['yesno'], - priority: 1, - }, - { - id: 'status', - title: gettext('status'), - priority: 1, - }] - }; - extensibleService(config, config.columns); - return config; - } -})(); \ No newline at end of file diff --git a/trove_dashboard/static/dashboard/project/ngbackups/table/table.controller.js b/trove_dashboard/static/dashboard/project/ngbackups/table/table.controller.js deleted file mode 100644 index 9b60f37..0000000 --- a/trove_dashboard/static/dashboard/project/ngbackups/table/table.controller.js +++ /dev/null @@ -1,58 +0,0 @@ -/** - * 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.backups') - .controller('horizon.dashboard.project.backups.tableController', backupsTableController); - - backupsTableController.$inject = [ - '$scope', - 'horizon.app.core.openstack-service-api.trove', - 'horizon.dashboard.project.backups.tableConfigService' - ]; - - /** - * @ngdoc controller - * @name horizon.dashboard.project.backups.tableController - * - * @description - * Controller for the backups table - */ - - function backupsTableController($scope, trove, config) { - - var ctrl = this; - ctrl.config = config; - ctrl.backups = []; - ctrl.backupsSrc = []; - - init(); - - ////////// - - function init() { - trove.getBackups().success(getBackupsSuccess); - } - - function getBackupsSuccess(response) { - ctrl.backups = response; - } - } - -})(); diff --git a/trove_dashboard/static/dashboard/project/ngbackups/table/table.controller.spec.js b/trove_dashboard/static/dashboard/project/ngbackups/table/table.controller.spec.js deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/static/dashboard/project/ngbackups/table/table.html b/trove_dashboard/static/dashboard/project/ngbackups/table/table.html deleted file mode 100644 index 11ca25f..0000000 --- a/trove_dashboard/static/dashboard/project/ngbackups/table/table.html +++ /dev/null @@ -1,7 +0,0 @@ -
      - - -
      \ No newline at end of file diff --git a/trove_dashboard/test/__init__.py b/trove_dashboard/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/test/helpers.py b/trove_dashboard/test/helpers.py deleted file mode 100644 index 59b4aa6..0000000 --- a/trove_dashboard/test/helpers.py +++ /dev/null @@ -1,57 +0,0 @@ -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 troveclient import client as trove_client - -from openstack_dashboard.test import helpers - -from trove_dashboard import api -from trove_dashboard.test.test_data import utils - - -def create_stubs(stubs_to_create={}): - return helpers.create_stubs(stubs_to_create) - - -class TroveTestsMixin(object): - def _setup_test_data(self): - super(TroveTestsMixin, self)._setup_test_data() - utils.load_test_data(self) - - -class TestCase(TroveTestsMixin, helpers.TestCase): - pass - - -class BaseAdminViewTests(TroveTestsMixin, helpers.TestCase): - pass - - -class TroveAPITestCase(helpers.APITestCase): - - def setUp(self): - super(TroveAPITestCase, self).setUp() - - self._original_troveclient = api.trove.client - api.trove.client = lambda request: self.stub_troveclient() - - def tearDown(self): - super(TroveAPITestCase, self).tearDown() - - api.trove.client = self._original_troveclient - - def stub_troveclient(self): - if not hasattr(self, "troveclient"): - self.mox.StubOutWithMock(trove_client, 'Client') - self.troveclient = self.mox.CreateMock(trove_client.Client) - return self.troveclient diff --git a/trove_dashboard/test/settings.py b/trove_dashboard/test/settings.py deleted file mode 100644 index d7a708b..0000000 --- a/trove_dashboard/test/settings.py +++ /dev/null @@ -1,21 +0,0 @@ -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 horizon.test.settings import * # noqa -from openstack_dashboard.test.settings import * # noqa - -INSTALLED_APPS = list(INSTALLED_APPS) -INSTALLED_APPS.append('trove_dashboard.content.database_backups') -INSTALLED_APPS.append('trove_dashboard.content.database_clusters') -INSTALLED_APPS.append('trove_dashboard.content.database_configurations') -INSTALLED_APPS.append('trove_dashboard.content.databases') diff --git a/trove_dashboard/test/test_data/__init__.py b/trove_dashboard/test/test_data/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/trove_dashboard/test/test_data/exceptions.py b/trove_dashboard/test/test_data/exceptions.py deleted file mode 100644 index b8a0fb6..0000000 --- a/trove_dashboard/test/test_data/exceptions.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2016 Tesora Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from openstack_dashboard.test.test_data import exceptions -from openstack_dashboard.test.test_data import utils - -from troveclient import exceptions as trove_exceptions - - -def data(TEST): - if not TEST.exceptions: - TEST.exceptions = utils.TestDataContainer() - - trove_exception = trove_exceptions.ClientException - TEST.exceptions.trove = (exceptions. - create_stubbed_exception(trove_exception)) - - trove_auth = trove_exceptions.Unauthorized - TEST.exceptions.trove_unauthorized = (exceptions. - create_stubbed_exception(trove_auth)) diff --git a/trove_dashboard/test/test_data/keystone_data.py b/trove_dashboard/test/test_data/keystone_data.py deleted file mode 100644 index 491732a..0000000 --- a/trove_dashboard/test/test_data/keystone_data.py +++ /dev/null @@ -1,26 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - - -def data(TEST): - - # Add trove to the keystone data - TEST.service_catalog.append( - {"type": "database", - "name": "Trove", - "endpoints_links": [], - "endpoints": [ - {"region": "RegionOne", - "adminURL": "http://admin.trove.example.com:8779/v1.0", - "publicURL": "http://public.trove.example.com:8779/v1.0", - "internalURL": "http://int.trove.example.com:8779/v1.0"}]} - ) diff --git a/trove_dashboard/test/test_data/trove_data.py b/trove_dashboard/test/test_data/trove_data.py deleted file mode 100644 index dca3f76..0000000 --- a/trove_dashboard/test/test_data/trove_data.py +++ /dev/null @@ -1,588 +0,0 @@ -# Copyright 2013 Rackspace Hosting. -# Copyright 2015 HP Software, LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 troveclient.v1 import backups -from troveclient.v1 import clusters -from troveclient.v1 import configurations -from troveclient.v1 import databases -from troveclient.v1 import datastores -from troveclient.v1 import flavors -from troveclient.v1 import instances -from troveclient.v1 import users - -from openstack_dashboard.test.test_data import utils - - -CLUSTER_DATA_ONE = { - "status": "ACTIVE", - "id": "dfbbd9ca-b5e1-4028-adb7-f78643e17998", - "name": "Test Cluster", - "created": "2014-04-25T20:19:23", - "updated": "2014-04-25T20:19:23", - "links": [], - "datastore": { - "type": "mongodb", - "version": "2.6" - }, - "ip": ["10.0.0.1"], - "instances": [ - { - "id": "416b0b16-ba55-4302-bbd3-ff566032e1c1", - "shard_id": "5415b62f-f301-4e84-ba90-8ab0734d15a7", - "name": "inst1", - "status": "ACTIVE", - "flavor": { - "id": "7", - "links": [] - }, - "volume": { - "size": 100 - } - }, - { - "id": "965ef811-7c1d-47fc-89f2-a89dfdd23ef2", - "shard_id": "5415b62f-f301-4e84-ba90-8ab0734d15a7", - "name": "inst2", - "status": "ACTIVE", - "flavor": { - "id": "7", - "links": [] - }, - "volume": { - "size": 100 - } - }, - { - "id": "3642f41c-e8ad-4164-a089-3891bf7f2d2b", - "shard_id": "5415b62f-f301-4e84-ba90-8ab0734d15a7", - "name": "inst3", - "status": "ACTIVE", - "flavor": { - "id": "7", - "links": [] - }, - "volume": { - "size": 100 - } - } - ], - "task": { - "name": "test_task" - }, - "locality": "anti-affinity" -} - -CLUSTER_DATA_TWO = { - "status": "ACTIVE", - "id": "dfbbd9ca-b5e1-4028-adb7-f78199182122232", - "name": "Test Cluster2", - "created": "2014-04-25T20:19:23", - "updated": "2014-04-25T20:19:23", - "links": [], - "datastore": { - "type": "vertica", - "version": "7.1" - }, - "ip": ["10.0.0.1"], - "instances": [ - { - "id": "416b0b16-ba55-4302-bbd3-ff8199182122232", - "name": "inst1", - "status": "ACTIVE", - "flavor": { - "id": "7", - "links": [] - }, - "volume": { - "size": 100 - } - }, - { - "id": "965ef811-7c1d-47fc-89f2-a88199182122232", - "name": "inst2", - "status": "ACTIVE", - "flavor": { - "id": "7", - "links": [] - }, - "volume": { - "size": 100 - } - }, - { - "id": "3642f41c-e8ad-4164-a089-388199182122232", - "name": "inst3", - "status": "ACTIVE", - "flavor": { - "id": "7", - "links": [] - }, - "volume": { - "size": 100 - } - } - ], - "task": { - "name": "building" - }, -} - -DATABASE_DATA_ONE = { - "status": "ACTIVE", - "updated": "2013-08-12T22:00:09", - "name": "Test Database", - "links": [], - "created": "2013-08-12T22:00:03", - "ip": [ - "10.0.0.3", - ], - "volume": { - "used": 0.13, - "size": 1, - }, - "flavor": { - "id": "1", - "links": [], - }, - "datastore": { - "type": "mysql", - "version": "5.5" - }, - "id": "6ddc36d9-73db-4e23-b52e-368937d72719", - "locality": "anti-affinity" -} - -DATABASE_DATA_TWO = { - "status": "ACTIVE", - "updated": "2013-08-12T22:00:09", - "name": "Test Database With DNS", - "links": [], - "created": "2013-08-12T22:00:03", - "hostname": "trove.instance-2.com", - "volume": { - "used": 0.13, - "size": 1, - }, - "flavor": { - "id": "1", - "links": [], - }, - "datastore": { - "type": "mysql", - "version": "5.6" - }, - "id": "4d7b3f57-44f5-41d2-8e86-36b88cad572a", -} - -DATABASE_DATA_THREE = { - "status": "ACTIVE", - "updated": "2015-01-12T22:00:09", - "name": "Test Database with Config", - "links": [], - "created": "2015-01-12T22:00:03", - "ip": [ - "10.0.0.3", - ], - "volume": { - "used": 0.13, - "size": 1, - }, - "flavor": { - "id": "1", - "links": [], - }, - "datastore": { - "type": "mysql", - "version": "5.5" - }, - "id": "c3369597-b53a-4bd4-bf54-41957c1291b8", - "configuration": { - "id": "0ef978d3-7c83-4192-ab86-b7a0a5010fa0", - "links": [], - "name": "config1" - }, - "replicas": { - "id": "0ef978d3-7c83-4192-ab86-b7a0a5010fa0", - "links": [], - } -} - -BACKUP_ONE = { - "instance_id": "6ddc36d9-73db-4e23-b52e-368937d72719", - "status": "COMPLETED", - "updated": "2013-08-13T19:39:38", - "locationRef": "http://swift/v1/AUTH/database_backups/0edb.tar.gz", - "name": "backup1", - "created": "2013-08-15T18:10:14", - "size": 0.13, - "id": "0edb3c14-8919-4583-9add-00df9e524081", - "description": "Long description of backup", -} - -BACKUP_TWO = { - "instance_id": "4d7b3f57-44f5-41d2-8e86-36b88cad572a", - "status": "COMPLETED", - "updated": "2013-08-10T20:20:44", - "locationRef": "http://swift/v1/AUTH/database_backups/e460.tar.gz", - "name": "backup2", - "created": "2013-08-10T20:20:37", - "size": 0.13, - "id": "e4602a3c-2bca-478f-b059-b6c215510fb4", - "description": "Longer description of backup", -} - -BACKUP_TWO_INC = { - "instance_id": "4d7b3f57-44f5-41d2-8e86-36b88cad572a", - "status": "COMPLETED", - "updated": "2013-08-10T20:20:55", - "locationRef": "http://swift/v1/AUTH/database_backups/f145.tar.gz", - "name": "backup2-Incr", - "created": "2013-08-10T20:20:37", - "size": 0.13, - "id": "e4602a3c-2bca-478f-b059-b6c215510fb5", - "description": "Longer description of backup", - "parent_id": "e4602a3c-2bca-478f-b059-b6c215510fb4", -} - -CONFIG_ONE = { - "updated": "2014-07-11T14:33:35", - "name": "config1", - "created": "2014-07-11T14:33:35", - "instance_count": 1, - "values": { - "collation_server": "latin1_swedish_ci", - "max_connections": 6000 - }, - "id": "0ef978d3-7c83-4192-ab86-b7a0a5010fa0", - "description": "Long description of configuration one", - "datastore_name": "mysql", - "datastore_version_name": "5.5" -} - -CONFIG_TWO = { - "updated": "2014-08-11T14:33:35", - "name": "config2", - "created": "2014-08-11T14:33:35", - "instance_count": 0, - "values": { - "collation_server": "latin1_swedish_ci", - "max_connections": 5000 - }, - "id": "87948232-10e7-4636-a3d3-a5e1593b7d16", - "description": "Long description of configuration two", - "datastore_name": "mysql", - "datastore_version_name": "5.6" -} - -CONFIG_INSTANCE_ONE = { - "id": "c3369597-b53a-4bd4-bf54-41957c1291b8", - "name": "Test Database with Config", -} - -CONFIG_PARAMS_ONE = [ - { - "name": "autocommit", - "restart_required": False, - "max": 1, - "min": 0, - "type": "integer", - }, - { - "name": "connect_timeout", - "restart_required": False, - "max": 65535, - "min": 1, - "type": "integer", - }, - { - "name": "sort_buffer_size", - "restart_required": False, - "max": 18446744073709547520, - "min": 32768, - "type": "integer", - }, - { - "name": "character_set_client", - "restart_required": False, - "type": "string", - }, - { - "name": "character_set_connection", - "restart_required": False, - "type": "string", - }, -] - -USER_ONE = { - "name": "Test_User", - "host": "%", - "databases": [DATABASE_DATA_ONE["name"]], -} - -USER_ROOT_ONE = { - "name": "root", - "rootEnabled": True -} - -USER_DB_ONE = { - "name": "db1", -} - -DATASTORE_ONE = { - "id": "537fb940-b5eb-40d9-bdbd-91a3dcb9c17d", - "links": [], - "name": "mysql" -} - -DATASTORE_TWO = { - "id": "ccb31517-c472-409d-89b4-1a13db6bdd36", - "links": [], - "name": "mysql" -} - -DATASTORE_MONGODB = { - "id": "ccb31517-c472-409d-89b4-1a13db6bdd37", - "links": [], - "name": "mongodb" -} - -DATASTORE_REDIS = { - "id": "ccb31517-c472-409d-89b4-1a13db6bdd38", - "links": [], - "name": "redis" -} - -DATASTORE_VERTICA = { - "id": "ccb31517-c472-409d-89b4-1a13db6bdd39", - "links": [], - "name": "vertica" -} - -VERSION_ONE = { - "name": "5.5", - "links": [], - "image": "b7956bb5-920e-4299-b68e-2347d830d939", - "active": 1, - "datastore": "537fb940-b5eb-40d9-bdbd-91a3dcb9c17d", - "packages": "5.5", - "id": "390a6d52-8347-4e00-8e4c-f4fa9cf96ae9" -} - -VERSION_TWO = { - "name": "5.6", - "links": [], - "image": "c7956bb5-920e-4299-b68e-2347d830d938", - "datastore": "537fb940-b5eb-40d9-bdbd-91a3dcb9c17d", - "packages": "5.6", - "id": "500a6d52-8347-4e00-8e4c-f4fa9cf96ae9" -} - -FLAVOR_ONE = { - "ram": 512, - "id": "1", - "links": [], - "name": "m1.tiny" -} - -FLAVOR_TWO = { - "ram": 768, - "id": "10", - "links": [], - "name": "eph.rd-smaller" -} - -FLAVOR_THREE = { - "ram": 800, - "id": "100", - "links": [], - "name": "test.1" -} - -VERSION_MONGODB_2_6 = { - "name": "2.6", - "links": [], - "image": "c7956bb5-920e-4299-b68e-2347d830d937", - "active": 1, - "datastore": "ccb31517-c472-409d-89b4-1a13db6bdd37", - "packages": "2.6", - "id": "600a6d52-8347-4e00-8e4c-f4fa9cf96ae9" -} - -VERSION_REDIS_3_0 = { - "name": "3.0", - "links": [], - "image": "c7956bb5-920e-4299-b68e-2347d830d938", - "active": 1, - "datastore": "ccb31517-c472-409d-89b4-1a13db6bdd38", - "packages": "3.0", - "id": "600a6d52-8347-4e00-8e4c-f4fa9cf96af0" -} - -VERSION_VERTICA_7_1 = { - "name": "7.1", - "links": [], - "image": "c7956bb5-920e-4299-b68e-2347d830d939", - "active": 1, - "datastore": "ccb31517-c472-409d-89b4-1a13db6bdd39", - "packages": "7.1", - "id": "600a6d52-8347-4e00-8e4c-f4fa9cf96af1" -} - -LOG_1 = { - "name": "guest", - "type": "SYS", - "status": "Partial", - "published": 5000, - "pending": 100, - "container": "guest_container" -} - -LOG_2 = { - "name": "slow_query", - "type": "USER", - "status": "Disabled", - "published": 0, - "pending": 0, - "container": "None" -} - -LOG_3 = { - "name": "error", - "type": "SYS", - "status": "Unavailable", - "published": 0, - "pending": 0, - "container": "None" -} - -LOG_4 = { - "name": "general", - "type": "USER", - "status": "Ready", - "published": 0, - "pending": 1000, - "container": "None" -} - - -def data(TEST): - cluster1 = clusters.Cluster(clusters.Clusters(None), - CLUSTER_DATA_ONE) - cluster2 = clusters.Cluster(clusters.Clusters(None), - CLUSTER_DATA_TWO) - database1 = instances.Instance(instances.Instances(None), - DATABASE_DATA_ONE) - database2 = instances.Instance(instances.Instances(None), - DATABASE_DATA_TWO) - database3 = instances.Instance(instances.Instances(None), - DATABASE_DATA_THREE) - bkup1 = backups.Backup(backups.Backups(None), BACKUP_ONE) - bkup2 = backups.Backup(backups.Backups(None), BACKUP_TWO) - bkup3 = backups.Backup(backups.Backups(None), BACKUP_TWO_INC) - - cfg1 = configurations.Configuration(configurations.Configurations(None), - CONFIG_ONE) - cfg2 = configurations.Configuration(configurations.Configurations(None), - CONFIG_TWO) - - user1 = users.User(users.Users(None), USER_ONE) - user_db1 = databases.Database(databases.Databases(None), - USER_DB_ONE) - user_root1 = databases.Database(databases.Databases(None), - USER_ROOT_ONE) - - datastore1 = datastores.Datastore(datastores.Datastores(None), - DATASTORE_ONE) - version1 = datastores.\ - DatastoreVersion(datastores.DatastoreVersions(None), - VERSION_ONE) - version2 = datastores.\ - DatastoreVersion(datastores.DatastoreVersions(None), - VERSION_TWO) - - flavor1 = flavors.Flavor(flavors.Flavors(None), FLAVOR_ONE) - flavor2 = flavors.Flavor(flavors.Flavors(None), FLAVOR_TWO) - flavor3 = flavors.Flavor(flavors.Flavors(None), FLAVOR_THREE) - datastore_mongodb = datastores.Datastore(datastores.Datastores(None), - DATASTORE_MONGODB) - version_mongodb_2_6 = datastores.\ - DatastoreVersion(datastores.DatastoreVersions(None), - VERSION_MONGODB_2_6) - datastore_redis = datastores.Datastore(datastores.Datastores(None), - DATASTORE_REDIS) - version_redis_3_0 = datastores.\ - DatastoreVersion(datastores.DatastoreVersions(None), - VERSION_REDIS_3_0) - datastore_vertica = datastores.Datastore(datastores.Datastores(None), - DATASTORE_VERTICA) - version_vertica_7_1 = datastores.\ - DatastoreVersion(datastores.DatastoreVersions(None), - VERSION_VERTICA_7_1) - - log1 = instances.DatastoreLog(instances.Instances(None), LOG_1) - log2 = instances.DatastoreLog(instances.Instances(None), LOG_2) - log3 = instances.DatastoreLog(instances.Instances(None), LOG_3) - log4 = instances.DatastoreLog(instances.Instances(None), LOG_4) - - TEST.trove_clusters = utils.TestDataContainer() - TEST.trove_clusters.add(cluster1) - TEST.trove_clusters.add(cluster2) - TEST.databases = utils.TestDataContainer() - TEST.database_backups = utils.TestDataContainer() - TEST.database_configurations = utils.TestDataContainer() - TEST.database_users = utils.TestDataContainer() - TEST.database_user_dbs = utils.TestDataContainer() - TEST.database_user_roots = utils.TestDataContainer() - TEST.database_flavors = utils.TestDataContainer() - - TEST.databases.add(database1) - TEST.databases.add(database2) - TEST.databases.add(database3) - TEST.database_backups.add(bkup1) - TEST.database_backups.add(bkup2) - TEST.database_backups.add(bkup3) - - TEST.database_configurations.add(cfg1) - TEST.database_configurations.add(cfg2) - - TEST.configuration_parameters = utils.TestDataContainer() - for parameter in CONFIG_PARAMS_ONE: - TEST.configuration_parameters.add( - configurations.ConfigurationParameter( - configurations.ConfigurationParameters(None), parameter)) - - TEST.configuration_instances = utils.TestDataContainer() - TEST.configuration_instances.add( - configurations.Configuration( - configurations.Configurations(None), CONFIG_INSTANCE_ONE)) - - TEST.database_users.add(user1) - TEST.database_user_dbs.add(user_db1) - TEST.database_user_roots.add(user_root1) - TEST.datastores = utils.TestDataContainer() - TEST.datastores.add(datastore_mongodb) - TEST.datastores.add(datastore_redis) - TEST.datastores.add(datastore_vertica) - TEST.datastores.add(datastore1) - TEST.database_flavors.add(flavor1, flavor2, flavor3) - TEST.datastore_versions = utils.TestDataContainer() - TEST.datastore_versions.add(version_vertica_7_1) - TEST.datastore_versions.add(version_redis_3_0) - TEST.datastore_versions.add(version_mongodb_2_6) - TEST.datastore_versions.add(version1) - TEST.datastore_versions.add(version2) - - TEST.logs = utils.TestDataContainer() - TEST.logs.add(log1, log2, log3, log4) diff --git a/trove_dashboard/test/test_data/utils.py b/trove_dashboard/test/test_data/utils.py deleted file mode 100644 index c7daf47..0000000 --- a/trove_dashboard/test/test_data/utils.py +++ /dev/null @@ -1,52 +0,0 @@ -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# 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 load_test_data(load_onto=None): - from openstack_dashboard.test.test_data import cinder_data - from openstack_dashboard.test.test_data import exceptions - from openstack_dashboard.test.test_data import glance_data - from openstack_dashboard.test.test_data import heat_data - from openstack_dashboard.test.test_data import keystone_data - from openstack_dashboard.test.test_data import neutron_data - from openstack_dashboard.test.test_data import nova_data - from openstack_dashboard.test.test_data import swift_data - - from trove_dashboard.test.test_data import exceptions \ - as trove_exceptions - from trove_dashboard.test.test_data import keystone_data \ - as trove_keystone_data - from trove_dashboard.test.test_data import trove_data - - # The order of these loaders matters, some depend on others. - loaders = ( - exceptions.data, - trove_exceptions.data, - keystone_data.data, - glance_data.data, - nova_data.data, - cinder_data.data, - neutron_data.data, - swift_data.data, - heat_data.data, - trove_data.data, - trove_keystone_data.data, - ) - if load_onto: - for data_func in loaders: - data_func(load_onto) - return load_onto - else: - return utils.TestData(*loaders) diff --git a/trove_dashboard/test/urls.py b/trove_dashboard/test/urls.py deleted file mode 100644 index cf28475..0000000 --- a/trove_dashboard/test/urls.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -from django.conf import urls -import openstack_dashboard.urls - -urlpatterns = [ - urls.url(r'', urls.include(openstack_dashboard.urls)) -] diff --git a/trove_dashboard/version.py b/trove_dashboard/version.py deleted file mode 100644 index f8294f1..0000000 --- a/trove_dashboard/version.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2016 Tesora, Inc. -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. -# - - -from pbr import version -version_info = version.VersionInfo('trove_dashboard') -__version__ = version_info.cached_version_string()