manila-ui-3.0.0/ 0000775 0001750 0001750 00000000000 13647271736 013430 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/.zuul.yaml 0000664 0001750 0001750 00000002722 13647271543 015370 0 ustar zuul zuul 0000000 0000000 - project:
templates:
- check-requirements
- horizon-non-primary-django-jobs
- openstack-cover-jobs-horizon
- openstack-lower-constraints-jobs-horizon
- openstack-python3-ussuri-jobs-horizon
- publish-openstack-docs-pti
- release-notes-jobs-python3
check:
jobs:
- manila-ui-dsvm:
voting: false
- manila-ui-integration-tests:
voting: false
- job:
name: manila-ui-dsvm
parent: legacy-dsvm-base
run: playbooks/legacy/manila-ui-dsvm/run.yaml
post-run: playbooks/legacy/manila-ui-dsvm/post.yaml
timeout: 6000
required-projects:
- openstack/devstack-gate
- openstack/manila
- openstack/manila-ui
- openstack/python-manilaclient
- openstack/manila-tempest-plugin
- job:
name: manila-ui-integration-tests
parent: horizon-integration-tests
required-projects:
- name: openstack/horizon
- name: openstack/manila
- name: openstack/python-manilaclient
- name: openstack/manila-ui
- name: openstack/manila-tempest-plugin
roles:
- zuul: openstack-infra/devstack
- zuul: openstack/horizon
irrelevant-files:
- ^.*\.rst$
- ^doc/.*$
- ^releasenotes/.*$
vars:
devstack_plugins:
manila: https://opendev.org/openstack/manila
manila-ui: https://opendev.org/openstack/manila-ui
devstack_services:
horizon: true
tox_envlist: integration
manila-ui-3.0.0/.testr.conf 0000664 0001750 0001750 00000000476 13647271543 015521 0 ustar zuul zuul 0000000 0000000 [DEFAULT]
test_command=OS_STDOUT_CAPTURE=${OS_STDOUT_CAPTURE:-1} \
OS_STDERR_CAPTURE=${OS_STDERR_CAPTURE:-1} \
OS_TEST_TIMEOUT=${OS_TEST_TIMEOUT:-60} \
${PYTHON:-python} -m subunit.run discover -t ./ . $LISTOPT $IDOPTION
test_id_option=--load-list $IDFILE
test_list_option=--list manila-ui-3.0.0/doc/ 0000775 0001750 0001750 00000000000 13647271736 014175 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/doc/requirements.txt 0000664 0001750 0001750 00000000627 13647271543 017462 0 ustar zuul zuul 0000000 0000000 # 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.
openstackdocstheme>=2.0.0 # Apache-2.0
reno>=2.5.0 # Apache-2.0
doc8>=0.6.0 # Apache-2.0
sphinx>=2.0.0,!=2.1.0 # BSD
ddt>=1.0.1 # MIT
fixtures>=3.0.0 # Apache-2.0/BSD
oslotest>=3.2.0 # Apache-2.0
manila-ui-3.0.0/doc/source/ 0000775 0001750 0001750 00000000000 13647271736 015475 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/doc/source/conf.py 0000664 0001750 0001750 00000006602 13647271543 016774 0 ustar zuul zuul 0000000 0000000 # -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import sys
sys.path.insert(0, os.path.abspath('../..'))
# -- General configuration ----------------------------------------------------
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = [
'sphinx.ext.autodoc',
#'sphinx.ext.intersphinx',
'openstackdocstheme',
'sphinx.ext.imgconverter',
]
# openstackdocstheme options
repository_name = 'openstack/manila-ui'
bug_project = 'manila-ui'
bug_tag = 'docs'
# autodoc generation is a bit aggressive and a nuisance when doing heavy
# text edit cycles.
# execute "export SPHINX_DEBUG=1" in your terminal to disable
# The suffix of source filenames.
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'manila-ui'
copyright = u'2013, OpenStack Foundation'
# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
add_module_names = True
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# -- Options for HTML output --------------------------------------------------
# The theme to use for HTML and HTML Help pages. Major themes that come with
# Sphinx are currently 'default' and 'sphinxdoc'.
# html_theme_path = ["."]
html_theme = 'openstackdocs'
# html_static_path = ['static']
# Output file base name for HTML help builder.
htmlhelp_basename = '%sdoc' % project
# Example configuration for intersphinx: refer to the Python standard library.
#intersphinx_mapping = {'http://docs.python.org/': None}
# -- Options for LaTeX output -------------------------------------------------
# The paper size ('letter' or 'a4').
# latex_paper_size = 'letter'
# The font size ('10pt', '11pt' or '12pt').
# latex_font_size = '10pt'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass
# [howto/manual]).
latex_documents = [
('index',
'doc-%s.tex' % project,
u'%s Documentation' % project,
u'OpenStack Foundation', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
# latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
# latex_use_parts = False
# Additional stuff for the LaTeX preamble.
# latex_preamble = ''
# Documents to append as an appendix to all manuals.
# latex_appendices = []
# If false, no module index is generated.
# latex_use_modindex = True
latex_domain_indices = False
latex_elements = {
'makeindex': '',
'printindex': '',
'preamble': r'\setcounter{tocdepth}{3}',
'maxlistdepth': 10,
}
manila-ui-3.0.0/doc/source/index.rst 0000664 0001750 0001750 00000001034 13647271543 017330 0 ustar zuul zuul 0000000 0000000 .. manila-ui documentation master file, created by
sphinx-quickstart on Tue Jul 9 22:26:36 2013.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
.. the main title comes from README.rst
.. include:: ../../README.rst
Contents
--------
.. toctree::
:maxdepth: 2
install/installation
configuration/index
user/index
admin/index
contributor/index
.. only:: html
Indices and tables
------------------
* :ref:`genindex`
* :ref:`search`
manila-ui-3.0.0/doc/source/admin/ 0000775 0001750 0001750 00000000000 13647271736 016565 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/doc/source/admin/index.rst 0000664 0001750 0001750 00000010257 13647271543 020427 0 ustar zuul zuul 0000000 0000000 ====================
Administration Guide
====================
Shares are file storage that instances can access. Users can
allow or deny a running instance to have access to a share at any time.
For information about using the Dashboard to create and manage shares as
an end user, see the :doc:`User Guide `.
As an administrative user, you can manage shares and share types for users
in various projects. You can create and delete share types, and view
or delete shares.
Create a share type
-------------------
#. Log in to the Dashboard and choose the :guilabel:`admin`
project from the drop-down list.
#. On the :guilabel:`Admin` tab, open the :guilabel:`System` tab
and click the :guilabel:`Shares` category.
#. Click the :guilabel:`Share Types` tab, and click
:guilabel:`Create Share Type` button. In the
:guilabel:`Create Share Type` window, enter or select the
following values.
:guilabel:`Name`: Enter a name for the share type.
:guilabel:`Driver handles share servers`: Choose True or False
:guilabel:`Extra specs`: To add extra specs, use key=value.
#. Click :guilabel:`Create Share Type` button to confirm your changes.
.. note::
A message indicates whether the action succeeded.
Update share type
-----------------
#. Log in to the Dashboard and choose the :guilabel:`admin` project from
the drop-down list.
#. On the :guilabel:`Admin` tab, open the :guilabel:`System` tab
and click the :guilabel:`Shares` category.
#. Click the :guilabel:`Share Types` tab, select the share type
that you want to update.
#. Select :guilabel:`Update Share Type` from Actions.
#. In the :guilabel:`Update Share Type` window, update extra specs.
:guilabel:`Extra specs`: To add extra specs, use key=value.
To unset extra specs, use key.
#. Click :guilabel:`Update Share Type` button to confirm your changes.
.. note::
A message indicates whether the action succeeded.
Delete share types
------------------
When you delete a share type, shares of that type are not deleted.
#. Log in to the Dashboard and choose the :guilabel:`admin` project from
the drop-down list.
#. On the :guilabel:`Admin` tab, open the :guilabel:`System` tab
and click the :guilabel:`Shares` category.
#. Click the :guilabel:`Share Types` tab, select the share type
or types that you want to delete.
#. Click :guilabel:`Delete Share Types` button.
#. In the :guilabel:`Confirm Delete Share Types` window, click the
:guilabel:`Delete Share Types` button to confirm the action.
.. note::
A message indicates whether the action succeeded.
Delete shares
-------------
#. Log in to the Dashboard and choose the :guilabel:`admin` project
from the drop-down list.
#. On the :guilabel:`Admin` tab, open the :guilabel:`System` tab
and click the :guilabel:`Shares` category.
#. Select the share or shares that you want to delete.
#. Click :guilabel:`Delete Shares` button.
#. In the :guilabel:`Confirm Delete Shares` window, click the
:guilabel:`Delete Shares` button to confirm the action.
.. note::
A message indicates whether the action succeeded.
Delete share server
-------------------
#. Log in to the Dashboard and choose the :guilabel:`admin` project
from the drop-down list.
#. On the :guilabel:`Admin` tab, open the :guilabel:`System` tab
and click the :guilabel:`Share Servers` category.
#. Select the share that you want to delete.
#. Click :guilabel:`Delete Share Server` button.
#. In the :guilabel:`Confirm Delete Share Server` window, click the
:guilabel:`Delete Share Server` button to confirm the action.
.. note::
A message indicates whether the action succeeded.
Delete share networks
---------------------
#. Log in to the Dashboard and choose the :guilabel:`admin` project
from the drop-down list.
#. On the :guilabel:`Admin` tab, open the :guilabel:`System` tab
and click the :guilabel:`Share Networks` category.
#. Select the share network or share networks that you want to delete.
#. Click :guilabel:`Delete Share Networks` button.
#. In the :guilabel:`Confirm Delete Share Networks` window, click the
:guilabel:`Delete Share Networks` button to confirm the action.
.. note::
A message indicates whether the action succeeded.
manila-ui-3.0.0/doc/source/contributor/ 0000775 0001750 0001750 00000000000 13647271736 020047 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/doc/source/contributor/index.rst 0000664 0001750 0001750 00000000224 13647271543 021702 0 ustar zuul zuul 0000000 0000000 =========================
Contributor Documentation
=========================
.. toctree::
:maxdepth: 2
contributing
testing
features
manila-ui-3.0.0/doc/source/contributor/testing.rst 0000664 0001750 0001750 00000001523 13647271543 022253 0 ustar zuul zuul 0000000 0000000 =======
Testing
=======
Starting the app
----------------
If everything has gone according to plan, you should be able to run:
.. code-block:: console
./run_tests.sh --runserver 0.0.0.0:8080
and have the application start on port 8080. The horizon dashboard will
be located at http://localhost:8080/
Running unit tests
------------------
The unit tests can be executed directly from within this Manila UI plugin
project directory by using::
$ cd ../manila-ui
$ tox
This is made possible by the dependency in test-requirements.txt upon the
horizon source, which pulls down all of the horizon and openstack_dashboard
modules that the plugin uses.
To run only py3 unit tests, use following command::
$ tox -e py3
To run unit tests using specific Django version use the following::
$ tox -e py3-dj22
$ tox -e py3-dj110
manila-ui-3.0.0/doc/source/contributor/features.rst 0000664 0001750 0001750 00000002033 13647271543 022411 0 ustar zuul zuul 0000000 0000000 ============
New Features
============
When implementing a new feature, you may think about making it optional,
so it could be enabled or disabled in different deployments.
How to use it:
.. code-block:: python
from django.conf import settings
manila_config = getattr(settings, 'OPENSTACK_MANILA_FEATURES', {})
manila_config.get('your_new_config_option', 'value_of_config_option')
See :doc:`/configuration/index` section for more configuration details.
It is also expected that each addition of new logic to Manila UI is covered by
unit tests.
Test modules should be located under "manila_ui/tests", satisfying
the following template when tests are written for a specific module:
.. code-block:: none
manila_ui[/tests]/path/to/[test_]modulename.py
However, when testing the flow between different modules (using test app),
the tests can be added to a test module that can satisfy
the following template:
.. code-block:: none
manila_ui[/tests]/path/to/directory/tests.py
Manila UI tests use the mock library for testing.
manila-ui-3.0.0/doc/source/contributor/contributing.rst 0000664 0001750 0001750 00000000116 13647271543 023302 0 ustar zuul zuul 0000000 0000000 ============
Contributing
============
.. include:: ../../../CONTRIBUTING.rst
manila-ui-3.0.0/doc/source/configuration/ 0000775 0001750 0001750 00000000000 13647271736 020344 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/doc/source/configuration/index.rst 0000664 0001750 0001750 00000002205 13647271543 022200 0 ustar zuul zuul 0000000 0000000 =============
Configuration
=============
It is possible to enable or disable some Manila UI features. To do so,
look for files located in "manila_ui/local/local_settings.d/" directory,
where you can redefine the values of the OPENSTACK_MANILA_FEATURES dict:
* enable_share_groups
* enable_replication
* enable_migration
* enable_public_share_type_creation
* enable_public_share_group_type_creation
* enable_public_shares
* enabled_share_protocols
By default, enabled_share_protocols within the OPENSTACK_MANILA_FEATURES
dict contains a list with all the supported protocols. The operator can
change this to display to users only those protocols that has been deployed
and are available to use. E.g. if only NFS is available, the operator is
expected to redefine enabled_share_protocols as follows:
.. code-block:: python
OPENSTACK_MANILA_FEATURES = {
'enable_share_groups': True,
'enable_replication': True,
'enable_migration': True,
'enable_public_share_type_creation': True,
'enable_public_share_group_type_creation': True,
'enable_public_shares': True,
'enabled_share_protocols': ['NFS'],
}
manila-ui-3.0.0/doc/source/user/ 0000775 0001750 0001750 00000000000 13647271736 016453 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/doc/source/user/index.rst 0000664 0001750 0001750 00000015203 13647271543 020311 0 ustar zuul zuul 0000000 0000000 ==========
User Guide
==========
Shares are file storage that you provide access to instances. You can allow
access to a share to a running instance or deny access to a share and allow
access to it to another instance at any time. You can also delete a share.
You can create snapshot from a share if the driver supports it. Only
administrative users can create share types.
Create a share
--------------
#. Log in to the dashboard, choose a project, and click :guilabel:`Shares`.
#. Click :guilabel:`Create Share`.
In the dialog box that opens, enter or select the following values.
:guilabel:`Share Name`: Specify a name for the share.
:guilabel:`Description`: Optionally, provide a brief description for the
share.
:guilabel:`Share Type`: Choose a share type.
:guilabel:`Size (GB)`: The size of the share in gibibytes (GiB).
:guilabel:`Share Protocol`: Select NFS, CIFS, GlusterFS, or HDFS.
:guilabel:`Share Network`: Choose a share network.
:guilabel:`Metadata`: Enter metadata for the share creation if needed.
#. Click :guilabel:`Create Share`.
The dashboard shows the share on the :guilabel:`Shares` tab.
Delete a share
--------------
#. Log in to the dashboard, choose a project, and click :guilabel:`Shares`.
#. Select the check boxes for the shares that you want to delete.
#. Click :guilabel:`Delete Shares` and confirm your choice.
A message indicates whether the action was successful.
Allow access
------------
#. Log in to the dashboard, choose a project, and click :guilabel:`Shares`.
#. Go to the share that you want to allow access and choose
:guilabel:`Manage Rules` from Actions.
#. Click :guilabel:`Add rule`.
:guilabel:`Access Type`: Choose ip, user, or cert.
:guilabel:`Access Level`: Choose read-write or read-only.
:guilabel:`Access To`: Fill in Access To field.
#. Click :guilabel:`Add Rule`.
A message indicates whether the action was successful.
Deny access
-----------
#. Log in to the dashboard, choose a project, and click :guilabel:`Shares`.
#. Go to the share that you want to deny access and choose
:guilabel:`Manage Rules` from Actions.
#. Choose the rule you want to delete.
#. Click :guilabel:`Delete rule` and confirm your choice.
A message indicates whether the action was successful.
Edit share metadata
-------------------
#. Log in to the dashboard, choose a project, and click :guilabel:`Shares`.
#. Go to the share that you want to edit and choose
:guilabel:`Edit Share Metadata` from Actions.
#. :guilabel:`Metadata`: To add share metadata, use key=value. To unset
metadata, use key.
#. Click :guilabel:`Edit Share Metadata`.
A message indicates whether the action was successful.
Edit share
----------
#. Log in to the dashboard, choose a project, and click :guilabel:`Shares`.
#. Go to the share that you want to edit and choose :guilabel:`Edit Share` from
Actions.
#. :guilabel:`Share Name`: Enter a new share name.
#. :guilabel:`Description`: Enter a new description.
#. Click :guilabel:`Edit Share`.
A message indicates whether the action was successful.
Extend share
------------
#. Log in to the dashboard, choose a project, and click :guilabel:`Shares`.
#. Go to the share that you want to edit and choose :guilabel:`Extend Share`
from Actions.
#. :guilabel:`New Size (GB)`: Enter new size.
#. Click :guilabel:`Extend Share`.
A message indicates whether the action was successful.
Create share network
--------------------
#. Log in to the dashboard, choose a project, click :guilabel:`Shares`,
and click :guilabel:`Share Networks`.
#. Click :guilabel:`Create Share Network`.
In the dialog box that opens, enter or select the following values.
:guilabel:`Name`: Specify a name for the share network.
:guilabel:`Description`: Optionally, provide a brief description for the
share network.
:guilabel:`Neutron Net`: Choose a neutron network.
:guilabel:`Neutron Subnet`: Choose a neutron subnet.
#. Click :guilabel:`Create Share Network`.
The dashboard shows the share network on the :guilabel:`Share Networks` tab.
Delete a share network
----------------------
#. Log in to the dashboard, choose a project, click :guilabel:`Shares`, and
click :guilabel:`Share Networks`.
#. Select the check boxes for the share networks that you want to delete.
#. Click :guilabel:`Delete Share Networks` and confirm your choice.
A message indicates whether the action was successful.
Edit share network
------------------
#. Log in to the dashboard, choose a project, click :guilabel:`Shares`, and
click :guilabel:`Share Networks`.
#. Go to the share network that you want to edit and choose
:guilabel:`Edit Share Network` from Actions.
#. :guilabel:`Name`: Enter a new share network name.
#. :guilabel:`Description`: Enter a new description.
#. Click :guilabel:`Edit Share Network`.
A message indicates whether the action was successful.
Create security service
-----------------------
#. Log in to the dashboard, choose a project, click :guilabel:`Shares`,
and click :guilabel:`Security Services`.
#. Click :guilabel:`Create Security Service`.
In the dialog box that opens, enter or select the following values.
:guilabel:`Name`: Specify a name for the security service.
:guilabel:`DNS IP`: Enter the DNS IP address.
:guilabel:`Server`: Enter the server name.
:guilabel:`Domain`: Enter the domain name.
:guilabel:`User`: Enter the user name.
:guilabel:`Password`: Enter the password.
:guilabel:`Confirm Password`: Enter the password again to confirm.
:guilabel:`Type`: Choose the type from Active Directory, LDAP, or Kerberos.
:guilabel:`Description`: Optionally, provide a brief description for the
security service.
#. Click :guilabel:`Create Security Service`.
The dashboard shows the security service on the :guilabel:`Security Services`
tab.
Delete a security service
-------------------------
#. Log in to the dashboard, choose a project, click :guilabel:`Shares`, and
click :guilabel:`Security Services`.
#. Select the check boxes for the security services that you want to delete.
#. Click :guilabel:`Delete Security Services` and confirm your choice.
A message indicates whether the action was successful.
Edit security service
---------------------
#. Log in to the dashboard, choose a project, click :guilabel:`Shares`,
and click :guilabel:`Security Services`.
#. Go to the security service that you want to edit and choose
:guilabel:`Edit Security Service` from Actions.
#. :guilabel:`Name`: Enter a new security service name.
#. :guilabel:`Description`: Enter a new description.
#. Click :guilabel:`Edit Security Service`.
A message indicates whether the action was successful.
manila-ui-3.0.0/doc/source/install/ 0000775 0001750 0001750 00000000000 13647271736 017143 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/doc/source/install/installation.rst 0000664 0001750 0001750 00000002557 13647271543 022403 0 ustar zuul zuul 0000000 0000000 ============
Installation
============
DevStack Installation
---------------------
Add this repo as an external repository into your ``local.conf`` file::
[[local|localrc]]
enable_plugin manila-ui https://opendev.org/openstack/manila-ui
Manual Installation
-------------------
Begin by installing Horizon following the `Horizon Manual Installation Guide `__
and clone Manila UI repository::
git clone https://opendev.org/openstack/manila-ui
Install Manila UI with all dependencies. From within the horizon folder::
pip install -e ../manila-ui/
And enable it in Horizon.::
cp ../manila-ui/manila_ui/local/enabled/_*.py openstack_dashboard/local/enabled
cp ../manila-ui/manila_ui/local/local_settings.d/_90_manila_*.py openstack_dashboard/local/local_settings.d
.. _install-rdo:
Installing Manila UI in RDO
---------------------------
In order to install Manila UI in `RDO `__,
please follow the steps below (you may need to use `sudo` privileges
if you are not root)::
# yum install -y openstack-manila-ui
# systemctl restart httpd
# systemctl restart memcached
Manila UI will now be available through OpenStack Horizon; look for
the Shares tab under Project > Share. You can access Horizon with
Manila UI using the same URL and port as before.
manila-ui-3.0.0/tools/ 0000775 0001750 0001750 00000000000 13647271736 014570 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/tools/with_venv.sh 0000775 0001750 0001750 00000000332 13647271543 017132 0 ustar zuul zuul 0000000 0000000 #!/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 && "$@"
manila-ui-3.0.0/tools/cover.sh 0000775 0001750 0001750 00000004533 13647271543 016246 0 ustar zuul zuul 0000000 0000000 #!/bin/bash
#
# Copyright 2015: Mirantis 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.
ALLOWED_EXTRA_MISSING=4
TESTR_ARGS="$*"
show_diff () {
head -1 $1
diff -U 0 $1 $2 | sed 1,2d
}
#
# Stash uncommitted changes, checkout master and save coverage report
uncommitted=$(git status --porcelain | grep -v "^??")
[[ -n $uncommitted ]] && git stash > /dev/null
git checkout HEAD^
baseline_report=$(mktemp -t manila_coverageXXXXXXX)
find . -type f -name "*.pyc" -delete && ./run_tests.sh -N --coverage --no-pep8 $TESTR_ARGS
coverage report > $baseline_report
baseline_missing=$(awk 'END { print $3 }' $baseline_report)
# Checkout back and unstash uncommitted changes (if any)
git checkout -
[[ -n $uncommitted ]] && git stash pop > /dev/null
# Generate and save coverage report
current_report=$(mktemp -t manila_coverageXXXXXXX)
find . -type f -name "*.pyc" -delete && ./run_tests.sh -N --coverage --no-pep8 $TESTR_ARGS
coverage report > $current_report
current_missing=$(awk 'END { print $3 }' $current_report)
# Show coverage details
allowed_missing=$((baseline_missing+ALLOWED_EXTRA_MISSING))
echo "Allowed to introduce missing lines : ${ALLOWED_EXTRA_MISSING}"
echo "Missing lines in master : ${baseline_missing}"
echo "Missing lines in proposed change : ${current_missing}"
if [ $allowed_missing -gt $current_missing ]; then
if [ $baseline_missing -lt $current_missing ]; then
show_diff $baseline_report $current_report
echo "I believe you can cover all your code with 100% coverage!"
else
echo "Thank you! You are awesome! Keep writing unit tests! :)"
fi
exit_code=0
else
show_diff $baseline_report $current_report
echo "Please write more unit tests, we should keep our test coverage :( "
exit_code=1
fi
rm $baseline_report $current_report
exit $exit_code
manila-ui-3.0.0/test-requirements.txt 0000664 0001750 0001750 00000001201 13647271543 017657 0 ustar zuul zuul 0000000 0000000 # 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>=3.0,<3.1.0 # Apache-2.0
coverage!=4.4,>=4.0 # Apache-2.0
ddt>=1.0.1 # MIT
python-subunit>=1.0.0 # Apache-2.0/BSD
openstackdocstheme>=2.0.0 # Apache-2.0
sphinx>=2.0.0,!=2.1.0 # BSD
pytest>=5.3.5 # MIT
testrepository>=0.0.18 # Apache-2.0/BSD
testscenarios>=0.4 # Apache-2.0/BSD
testtools>=2.2.0 # MIT
reno>=2.5.0 # Apache-2.0
# integration tests requirements
selenium>=2.50.1 # Apache-2.0
xvfbwrapper>=0.1.3 #license: MIT
manila-ui-3.0.0/tox.ini 0000664 0001750 0001750 00000005022 13647271543 014736 0 ustar zuul zuul 0000000 0000000 [tox]
minversion = 1.6
envlist = py37,pep8
skipsdist = True
[testenv]
basepython = python3
install_command = pip install {opts} {packages}
usedevelop = True
setenv =
VIRTUAL_ENV={envdir}
deps = -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/requirements.txt
-r{toxinidir}/test-requirements.txt
commands =
/bin/bash run_tests.sh -N --no-pep8 {posargs}
[testenv:py36]
setenv = DJANGO_SETTINGS_MODULE=manila_ui.tests.settings
[testenv:py37]
setenv = DJANGO_SETTINGS_MODULE=manila_ui.tests.settings
[testenv:py3-dev]
setenv = DJANGO_SETTINGS_MODULE=manila_ui.tests.settings
commands =
pip install {env:HORIZON_REPO:git+https://opendev.org/openstack/horizon}
{[testenv]commands}
RIZON_INTEGRATION_TESTS_CONFIG_FILE=manila_ui/tests/integration/horizon.conf
[testenv:integration]
# Run integration tests only
passenv = AVCONV_INSTALLED
setenv =
PYTHONHASHSEED=0
INTEGRATION_TESTS=1
SELENIUM_HEADLESS=1
HORIZON_INTEGRATION_TESTS_CONFIG_FILE=manila_ui/tests/integration/horizon.conf
commands = {envpython} {toxinidir}/manage.py test manila_ui --settings=manila_ui.tests.settings --tag integration
[testenv:pep8]
commands = flake8
[testenv:venv]
commands = {posargs}
[testenv:cover]
commands = {toxinidir}/tools/cover.sh {posargs}
[testenv:docs]
whitelist_externals = rm
commands =
rm -rf doc/build
sphinx-build -W -b html doc/source doc/build/html
[testenv:pdf-docs]
usedevelop = True
deps =
-c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
-r{toxinidir}/requirements.txt
-r{toxinidir}/doc/requirements.txt
whitelist_externals =
make
commands =
sphinx-build -W -b latex doc/source doc/build/pdf
make -C doc/build/pdf
[testenv:releasenotes]
commands = sphinx-build -a -E -W -d releasenotes/build/doctrees \
-b html releasenotes/source releasenotes/build/html
[testenv:debug]
commands = oslo_debug_helper {posargs}
[flake8]
show-source = True
# E123, E125 skipped as they are invalid PEP-8.
# F405 TEMPLATES may be undefined, or defined from star imports
# (because it is not easy to avoid this in openstack_dashboard.test.settings)
# H405 multi line docstring summary not separated with an empty line
# W504 line break after binary operator
ignore = E123,E125,F405,H405,W504
enable-extensions = H203,H106
exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,.ropeproject,tools
[testenv:lower-constraints]
deps =
-c{toxinidir}/lower-constraints.txt
-r{toxinidir}/test-requirements.txt
-r{toxinidir}/requirements.txt
manila-ui-3.0.0/manila_ui/ 0000775 0001750 0001750 00000000000 13647271736 015366 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/exceptions.py 0000664 0001750 0001750 00000001756 13647271543 020126 0 ustar zuul zuul 0000000 0000000 # Copyright 2012 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# 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.
from manilaclient import exceptions as manilaclient
UNAUTHORIZED = (
manilaclient.AuthorizationFailure,
manilaclient.Unauthorized,
)
NOT_FOUND = (
manilaclient.NotFound,
)
RECOVERABLE = (
manilaclient.ClientException,
)
manila-ui-3.0.0/manila_ui/tests/ 0000775 0001750 0001750 00000000000 13647271736 016530 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/test_data/ 0000775 0001750 0001750 00000000000 13647271736 020500 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/test_data/keystone_data.py 0000664 0001750 0001750 00000002223 13647271543 023677 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila to the keystone data
TEST.service_catalog.append(
{"type": "share",
"name": "Manila",
"endpoints_links": [],
"endpoints": [
{"region": "RegionOne",
"adminURL": "http://admin.manila.example.com:8786/v1",
"internalURL": "http://int.manila.example.com:8786/v1",
"publicURL": "http://public.manila.example.com:8786/v1"}]},
)
projects = [
type("%sProject" % v, (object, ),
{'id': '%s_id' % v, 'name': '%s_name' % v})
for v in ('foo', 'bar', 'quuz')
]
manila-ui-3.0.0/manila_ui/tests/test_data/__init__.py 0000664 0001750 0001750 00000000000 13647271543 022573 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/test_data/utils.py 0000664 0001750 0001750 00000002271 13647271543 022210 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.tests.test_data import keystone_data as manila_keystone_data
from openstack_dashboard.test.test_data import exceptions
from openstack_dashboard.test.test_data import keystone_data
# The order of these loaders matters, some depend on others.
loaders = (
exceptions.data,
keystone_data.data,
manila_keystone_data.data,
)
if load_onto:
for data_func in loaders:
data_func(load_onto)
return load_onto
else:
return utils.TestData(*loaders)
manila-ui-3.0.0/manila_ui/tests/dashboards/ 0000775 0001750 0001750 00000000000 13647271736 020642 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/dashboards/test_utils.py 0000664 0001750 0001750 00000006632 13647271543 023416 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2015 Mirantis, 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.
import ddt
from django.forms import ValidationError
from manila_ui.dashboards import utils
from manila_ui.tests import helpers as base
@ddt.ddt
class ManilaDashboardsUtilsTests(base.TestCase):
@ddt.data(
("", {}, []),
(" ", {}, []),
("\n", {}, []),
("f", {}, ["f"]),
("f=b", {"f": "b"}, []),
("foo=bar", {"foo": "bar"}, []),
("\nfoo \n", {}, ["foo"]),
("'foo'=\"bar\"\n'bar'", {"foo": "bar"}, ["bar"]),
(" foo= bar ", {"foo": "bar"}, []),
("foo= \" bar\"\n", {"foo": " bar"}, []),
("\n\nset_me_key = 'value with spaces and equality 2=2'\nunset_key ",
{"set_me_key": "value with spaces and equality 2=2"},
["unset_key"]),
("f" * 255, {}, ["f" * 255]),
("f" * 255 + "=" + "b" * 255, {"f" * 255: "b" * 255}, []),
)
@ddt.unpack
def test_parse_str_meta_success(
self, input_data, expect_set_dict, expected_unset_list):
set_dict, unset_list = utils.parse_str_meta(input_data)
self.assertEqual(expect_set_dict, set_dict)
self.assertEqual(expected_unset_list, unset_list)
@ddt.data(
"a b",
"'a b'",
"\"a b\"",
"f" * 256,
"f" * 256 + "=bar",
"foo=" + "b" * 256,
"\"a b \"",
"foo=bar\nfoo",
"foo=bar\nfoo=quuz",
)
def test_parse_str_meta_validation_error(self, input_data):
self.assertRaises(ValidationError, utils.parse_str_meta, input_data)
@ddt.data(
(({"a": ""}, ),
"a = <script>alert('A')/* b = */</script>"),
(({"fookey": "foovalue", "barkey": "barvalue"}, ),
"barkey = barvalue fookey = foovalue"),
(({"foo": "barquuz"}, 1, 2), "fo... = ba..."),
(({"foo": "barquuz", "zfoo": "zbarquuz"}, 1, 3), "foo = bar..."),
(({"foo": "barquuz", "zfoo": "zbarquuz"}, 2, 3),
"foo = bar... zfo... = zba..."),
(({"foo": "barquuz", "zfoo": "zbarquuz"}, 3, 3),
"foo = bar... zfo... = zba..."),
(({"foo": "barquuz", "zfoo": "zbarquuz"}, 3, 8),
"foo = barquuz zfoo = zbarquuz"),
)
@ddt.unpack
def test_metadata_to_str(self, input_args, expected_output):
result = utils.metadata_to_str(*input_args)
self.assertEqual(expected_output, result)
@ddt.data(
("ldap", "LDAP"),
("active_directory", "Active Directory"),
("kerberos", "Kerberos"),
("FaKe", "FaKe"),
)
@ddt.unpack
def test_get_nice_security_service_type(self, input_value, expected_value):
security_service = type("FakeSS", (object, ), {"type": input_value})()
result = utils.get_nice_security_service_type(security_service)
self.assertEqual(expected_value, result)
manila-ui-3.0.0/manila_ui/tests/dashboards/admin/ 0000775 0001750 0001750 00000000000 13647271736 021732 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/dashboards/admin/security_services/ 0000775 0001750 0001750 00000000000 13647271736 025504 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/dashboards/admin/security_services/tests.py 0000664 0001750 0001750 00000007545 13647271543 027227 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2014 NetApp, Inc.
# Copyright (c) 2015 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.urls import reverse
from horizon import exceptions as horizon_exceptions
from openstack_dashboard.api import keystone as api_keystone
from unittest import mock
from manila_ui.api import manila as api_manila
from manila_ui.dashboards.admin import utils
from manila_ui.tests.dashboards.project import test_data
from manila_ui.tests import helpers as test
from manila_ui.tests.test_data import keystone_data
INDEX_URL = reverse('horizon:admin:security_services:index')
class SecurityServicesTests(test.BaseAdminViewTests):
def setUp(self):
super(self.__class__, self).setUp()
self.mock_object(
api_keystone, "tenant_list",
mock.Mock(return_value=(keystone_data.projects, None)))
# Reset taken list of projects to avoid test interference
utils.PROJECTS = {}
def test_detail_view(self):
sec_service = test_data.sec_service
self.mock_object(
api_manila, "security_service_get",
mock.Mock(return_value=sec_service))
url = reverse(
'horizon:admin:security_services:security_service_detail',
args=[sec_service.id])
res = self.client.get(url)
self.assertContains(res, "
" % (
ss_id, ss_id),
1, 200)
self.assertNoMessages()
api_manila.share_instance_get.assert_called_once_with(
mock.ANY, share_instance.id)
api_manila.share_instance_export_location_list.assert_called_once_with(
mock.ANY, share_instance.id)
def test_detail_view_share_instance_with_exception(self):
share_instance = test_data.share_instance
url = reverse('horizon:admin:share_instances:share_instance_detail',
args=[share_instance.id])
self.mock_object(
api_manila, "share_instance_get",
mock.Mock(side_effect=horizon_exceptions.NotFound(404)))
res = self.client.get(url)
self.assertRedirectsNoFollow(res, INDEX_URL)
api_manila.share_instance_get.assert_called_once_with(
mock.ANY, share_instance.id)
manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_instances/__init__.py 0000664 0001750 0001750 00000000000 13647271543 027176 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_servers/ 0000775 0001750 0001750 00000000000 13647271736 024605 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_servers/tests.py 0000664 0001750 0001750 00000012434 13647271543 026321 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2014 NetApp, Inc.
# Copyright (c) 2015 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.urls import reverse
from horizon import exceptions as horizon_exceptions
from openstack_dashboard.api import keystone as api_keystone
from unittest import mock
from manila_ui.api import manila as api_manila
from manila_ui.tests.dashboards.project import test_data
from manila_ui.tests import helpers as test
INDEX_URL = reverse('horizon:admin:share_servers:index')
class ShareServerTests(test.BaseAdminViewTests):
def test_list_share_servers(self):
share_servers = [
test_data.share_server,
test_data.share_server_errored,
]
projects = [
type('FakeProject', (object, ),
{'id': s.project_id, 'name': '%s_name' % s.project_id})
for s in share_servers
]
projects_dict = {p.id: p for p in projects}
self.mock_object(
api_manila, "share_server_list",
mock.Mock(return_value=share_servers))
self.mock_object(
api_manila, "share_list",
mock.Mock(side_effect=[
[], [test_data.share], [test_data.nameless_share]]))
self.mock_object(
api_keystone, "tenant_list",
mock.Mock(return_value=(projects, None)))
res = self.client.get(INDEX_URL)
self.assertContains(res, "
" % (
shares[1].id, shares[1].id),
1, 200)
for k, v in share_server.backend_details.items():
self.assertContains(res, "
%s
" % k)
self.assertContains(res, "
%s
" % v)
self.assertNoMessages()
api_manila.share_server_get.assert_called_once_with(
mock.ANY, share_server.id)
api_manila.share_list.assert_called_once_with(
mock.ANY, search_opts={"share_server_id": share_server.id})
def test_detail_view_share_server_with_exception(self):
share_server = test_data.share_server
url = reverse('horizon:admin:share_servers:share_server_detail',
args=[share_server.id])
self.mock_object(
api_manila, "share_server_get",
mock.Mock(side_effect=horizon_exceptions.NotFound(404)))
res = self.client.get(url)
self.assertRedirectsNoFollow(res, INDEX_URL)
api_manila.share_server_get.assert_called_once_with(
mock.ANY, share_server.id)
manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_servers/__init__.py 0000664 0001750 0001750 00000000000 13647271543 026700 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_types/ 0000775 0001750 0001750 00000000000 13647271736 024260 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_types/tests.py 0000664 0001750 0001750 00000006521 13647271543 025774 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2014 NetApp, Inc.
# Copyright (c) 2015 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.urls import reverse
from openstack_dashboard.api import keystone as api_keystone
from openstack_dashboard.api import neutron as api_neutron
from unittest import mock
from manila_ui.api import manila as api_manila
from manila_ui.dashboards.admin import utils
from manila_ui.tests.dashboards.project import test_data
from manila_ui.tests import helpers as test
from manila_ui.tests.test_data import keystone_data
INDEX_URL = reverse('horizon:admin:share_types:index')
class ShareTypeTests(test.BaseAdminViewTests):
def setUp(self):
super(self.__class__, self).setUp()
self.share_type = test_data.share_type
self.url = reverse('horizon:admin:share_types:update_type',
args=[self.share_type.id])
self.mock_object(
api_manila, "share_type_get",
mock.Mock(return_value=self.share_type))
self.mock_object(
api_keystone, "tenant_list",
mock.Mock(return_value=(keystone_data.projects, None)))
self.mock_object(
api_neutron, "is_service_enabled", mock.Mock(return_value=[True]))
# Reset taken list of projects to avoid test interference
utils.PROJECTS = {}
def test_create_share_type(self):
url = reverse('horizon:admin:share_types:create_type')
data = {
'is_public': True,
'name': 'my_share_type',
'spec_driver_handles_share_servers': 'False'
}
form_data = data.copy()
form_data['spec_driver_handles_share_servers'] = 'false'
self.mock_object(api_manila, "share_type_create")
res = self.client.post(url, data)
api_manila.share_type_create.assert_called_once_with(
mock.ANY, form_data['name'],
form_data['spec_driver_handles_share_servers'],
is_public=form_data['is_public'])
self.assertRedirectsNoFollow(res, INDEX_URL)
def test_update_share_type_get(self):
res = self.client.get(self.url)
api_manila.share_type_get.assert_called_once_with(
mock.ANY, self.share_type.id)
self.assertNoMessages()
self.assertTemplateUsed(res, 'admin/share_types/update.html')
def test_update_share_type_post(self):
data = {
'extra_specs': 'driver_handles_share_servers=True'
}
form_data = {
'extra_specs': {'driver_handles_share_servers': 'True'},
}
self.mock_object(api_manila, "share_type_set_extra_specs")
res = self.client.post(self.url, data)
api_manila.share_type_set_extra_specs.assert_called_once_with(
mock.ANY, self.share_type.id, form_data['extra_specs'])
self.assertRedirectsNoFollow(res, INDEX_URL)
manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_types/test_forms.py 0000664 0001750 0001750 00000022613 13647271543 027017 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2015 Mirantis, 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.
import ddt
from django.core.handlers import wsgi
from django import forms as django_forms
from horizon import forms as horizon_forms
from unittest import mock
from manila_ui.dashboards.admin.share_types import forms
from manila_ui.tests import helpers as base
@ddt.ddt
class ManilaDashboardsAdminSharesUpdateShareTypeFormTests(base.APITestCase):
def setUp(self):
super(self.__class__, self).setUp()
FAKE_ENVIRON = {'REQUEST_METHOD': 'GET', 'wsgi.input': 'fake_input'}
self.request = wsgi.WSGIRequest(FAKE_ENVIRON)
def _get_form(self, initial):
kwargs = {
'prefix': None,
'initial': initial,
}
return forms.UpdateShareType(self.request, **kwargs)
@ddt.data(
({}, []),
({'foo': 'bar', 'quuz': 'zaab'}, ["foo=bar\r\n", "quuz=zaab\r\n"]),
)
@ddt.unpack
def test___init__(self, extra_specs_dict_input, extra_specs_str_output):
form = self._get_form({'extra_specs': extra_specs_dict_input})
for expected_extra_spec in extra_specs_str_output:
self.assertIn(expected_extra_spec, form.initial['extra_specs'])
self.assertIn('extra_specs', list(form.fields.keys()))
self.assertTrue(
isinstance(form.fields['extra_specs'], horizon_forms.CharField))
@mock.patch('horizon.messages.success')
def test_handle_success_no_changes(self, mock_horizon_messages_success):
initial = {'id': 'fake_id', 'name': 'fake_name', 'extra_specs': {}}
form = self._get_form(initial)
data = {'extra_specs': ''}
result = form.handle(self.request, data)
self.assertTrue(result)
mock_horizon_messages_success.assert_called_once_with(
mock.ANY, mock.ANY)
@mock.patch('horizon.messages.success')
def test_handle_success_only_set(self, mock_horizon_messages_success):
initial = {
'id': 'fake_id',
'name': 'fake_name',
'extra_specs': {'foo': 'bar'}
}
form = self._get_form(initial)
data = {'extra_specs': 'foo=bar\r\n'}
result = form.handle(self.request, data)
self.assertTrue(result)
mock_horizon_messages_success.assert_called_once_with(
mock.ANY, mock.ANY)
self.manilaclient.share_types.get.assert_called_once_with(
initial['id'])
self.manilaclient.share_types.get.return_value.set_keys.\
assert_called_once_with({'foo': 'bar'})
self.assertFalse(
self.manilaclient.share_types.get.return_value.unset_keys.called)
@mock.patch('horizon.messages.success')
def test_handle_success_only_unset(self, mock_horizon_messages_success):
initial = {
'id': 'fake_id',
'name': 'fake_name',
'extra_specs': {'foo': 'bar'}
}
form = self._get_form(initial)
data = {'extra_specs': 'foo\r\n'}
share_types_get = self.manilaclient.share_types.get
share_types_get.return_value.get_keys.return_value = {
'foo': 'bar', 'quuz': 'zaab'}
result = form.handle(self.request, data)
self.assertTrue(result)
mock_horizon_messages_success.assert_called_once_with(
mock.ANY, mock.ANY)
self.manilaclient.share_types.get.assert_has_calls([
mock.call(initial['id'])])
share_types_get.return_value.get_keys.assert_called_once_with()
self.assertFalse(share_types_get.return_value.set_keys.called)
share_types_get.return_value.unset_keys.assert_called_once_with(
{'foo'})
@mock.patch('horizon.messages.success')
def test_handle_success_set_and_unset(self, mock_horizon_messages_success):
initial = {
'id': 'fake_id',
'name': 'fake_name',
'extra_specs': {'foo': 'bar'}
}
form = self._get_form(initial)
data = {'extra_specs': 'foo\r\nquuz=zaab'}
share_types_get = self.manilaclient.share_types.get
share_types_get.return_value.get_keys.return_value = {'foo': 'bar'}
result = form.handle(self.request, data)
self.assertTrue(result)
mock_horizon_messages_success.assert_called_once_with(
mock.ANY, mock.ANY)
self.manilaclient.share_types.get.assert_has_calls([
mock.call(initial['id'])])
share_types_get.return_value.get_keys.assert_called_once_with()
share_types_get.return_value.set_keys.assert_called_once_with(
{'quuz': 'zaab'})
share_types_get.return_value.unset_keys.assert_called_once_with(
{'foo'})
def test_handle_validation_error(self):
initial = {'id': 'fake_id', 'name': 'fake_name', 'extra_specs': {}}
form = self._get_form(initial)
form.api_error = mock.Mock()
data = {'extra_specs': 'a b'}
result = form.handle(self.request, data)
self.assertFalse(result)
form.api_error.assert_called_once_with(mock.ANY)
@mock.patch('horizon.exceptions.handle')
def test_handle_other_exception(self, mock_horizon_exceptions_handle):
django_forms.ValidationError
initial = {'id': 'fake_id', 'name': 'fake_name', 'extra_specs': {}}
form = self._get_form(initial)
data = {'extra_specs': None}
result = form.handle(self.request, data)
self.assertFalse(result)
mock_horizon_exceptions_handle.assert_called_once_with(
self.request, mock.ANY)
@ddt.ddt
class ManilaDashboardsAdminSharesCreateShareTypeFormTests(base.APITestCase):
def setUp(self):
super(self.__class__, self).setUp()
FAKE_ENVIRON = {'REQUEST_METHOD': 'GET', 'wsgi.input': 'fake_input'}
self.request = wsgi.WSGIRequest(FAKE_ENVIRON)
def _get_form(self, **kwargs):
return forms.CreateShareType(self.request, **kwargs)
@mock.patch('horizon.messages.success')
def test_create_share_type(self, mock_horizon_messages_success):
form = self._get_form()
data = {
'extra_specs': '',
'is_public': False,
'spec_driver_handles_share_servers': 'True',
'name': 'share',
}
result = form.handle(self.request, data)
self.assertTrue(result)
self.manilaclient.share_types.create.assert_called_once_with(
name=data['name'],
spec_driver_handles_share_servers='true',
is_public=data["is_public"])
mock_horizon_messages_success.assert_called_once_with(
self.request, mock.ANY)
@mock.patch('horizon.messages.success')
def test_create_share_type_with_extra_specs(self,
mock_horizon_messages_success):
form = self._get_form()
data = {'extra_specs': 'a=b \n c=d',
'is_public': False,
'spec_driver_handles_share_servers': 'True',
'name': 'share'}
result = form.handle(self.request, data)
self.assertTrue(result)
set_keys = self.manilaclient.share_types.get.return_value.set_keys
set_keys.assert_called_once_with(
{'a': 'b', 'c': 'd'})
self.manilaclient.share_types.create.assert_called_once_with(
name=data['name'],
spec_driver_handles_share_servers='true',
is_public=data["is_public"])
mock_horizon_messages_success.assert_called_once_with(
self.request, mock.ANY)
@ddt.data(True, False)
@mock.patch('horizon.messages.success')
def test_public_share_type_creation(self,
enable_public_share_type_creation,
mock_horizon_messages_success):
with self.settings(OPENSTACK_MANILA_FEATURES={
'enable_public_share_type_creation':
enable_public_share_type_creation}):
form = self._get_form()
data = {
'extra_specs': '',
'is_public': enable_public_share_type_creation,
'spec_driver_handles_share_servers': 'True',
'name': 'share',
}
result = form.handle(self.request, data)
self.assertTrue(result)
self.assertEqual(
enable_public_share_type_creation,
form.enable_public_share_type_creation)
if enable_public_share_type_creation:
self.assertIn("is_public", form.fields)
self.assertTrue(form.fields["is_public"])
else:
self.assertNotIn("is_public", form.fields)
self.manilaclient.share_types.create.assert_called_once_with(
name=data['name'],
spec_driver_handles_share_servers='true',
is_public=enable_public_share_type_creation)
mock_horizon_messages_success.assert_called_once_with(
self.request, mock.ANY)
manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_types/__init__.py 0000664 0001750 0001750 00000000000 13647271543 026353 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_groups/ 0000775 0001750 0001750 00000000000 13647271736 024433 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/dashboards/admin/share_groups/tests.py 0000664 0001750 0001750 00000020032 13647271543 026140 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2017 Mirantis, 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.
import ddt
from django.urls import reverse
from unittest import mock
from manila_ui.api import manila as api_manila
from manila_ui.tests.dashboards.project import test_data
from manila_ui.tests import helpers as test
INDEX_URL = reverse('horizon:admin:share_groups:index')
@ddt.ddt
class ShareGroupTests(test.BaseAdminViewTests):
def setUp(self):
super(self.__class__, self).setUp()
self.sg = test_data.share_group
self.sg_nl = test_data.share_group_nameless
self.sg_dhss_true = test_data.share_group_dhss_true
def test_share_groups_list_get(self):
sgs = [self.sg, self.sg_nl, self.sg_dhss_true]
self.mock_object(
api_manila, 'share_group_list', mock.Mock(return_value=sgs))
res = self.client.get(INDEX_URL)
self.assertStatusCode(res, 200)
api_manila.share_group_list.assert_called_once_with(
mock.ANY, detailed=True)
self.assertTemplateUsed(res, 'admin/share_groups/index.html')
self.assertContains(res, "
" % self.share.availability_zone, 1, 200)
if exports_available:
for el in test_data.export_locations:
self.assertContains(res, "value=\"%s\"" % el.path, 1, 200)
self.assertContains(
res, "
" % snapshot.size, 1, 200)
for el in export_locations:
self.assertContains(res, "value=\"%s\"" % el.path, 1, 200)
for rule in rules:
self.assertContains(res, "
", len(rules), 200)
self.assertNoMessages()
api_manila.share_get.assert_called_once_with(mock.ANY, share.id)
api_manila.share_snapshot_get.assert_called_once_with(
mock.ANY, snapshot.id)
api_manila.share_snapshot_rules_list.assert_called_once_with(
mock.ANY, snapshot.id)
api_manila.share_snap_export_location_list.assert_called_once_with(
mock.ANY, snapshot)
def test_update_snapshot_get(self):
snapshot = test_data.snapshot
url = reverse('horizon:project:share_snapshots:share_snapshot_edit',
args=[snapshot.id])
self.mock_object(
api_manila, "share_snapshot_get", mock.Mock(return_value=snapshot))
self.mock_object(
neutron, "is_service_enabled", mock.Mock(return_value=[True]))
res = self.client.get(url)
api_manila.share_snapshot_get.assert_called_once_with(
mock.ANY, snapshot.id)
self.assertNoMessages()
self.assertTemplateUsed(res, 'project/share_snapshots/update.html')
def test_update_snapshot_post(self):
snapshot = test_data.snapshot
url = reverse('horizon:project:share_snapshots:share_snapshot_edit',
args=[snapshot.id])
formData = {
'method': 'UpdateForm',
'name': snapshot.name,
'description': snapshot.description,
}
self.mock_object(api_manila, "share_snapshot_update")
self.mock_object(api_manila, "share_snapshot_get",
mock.Mock(return_value=snapshot))
res = self.client.post(url, formData)
self.assertRedirectsNoFollow(res, INDEX_URL)
api_manila.share_snapshot_get.assert_called_once_with(
mock.ANY, snapshot.id)
api_manila.share_snapshot_update.assert_called_once_with(
mock.ANY, snapshot.id, formData['name'], formData['description'])
def test_list_rules(self):
snapshot = test_data.snapshot
rules = [test_data.ip_rule, test_data.user_rule, test_data.cephx_rule]
self.mock_object(
api_manila, "share_snapshot_get", mock.Mock(
return_value=snapshot))
self.mock_object(
api_manila, "share_snapshot_rules_list", mock.Mock(
return_value=rules))
url = reverse(
'horizon:project:share_snapshots:share_snapshot_manage_rules',
args=[snapshot.id])
res = self.client.get(url)
self.assertEqual(res.status_code, 200)
self.assertTemplateUsed(
res,
'project/share_snapshots/manage_rules.html')
api_manila.share_snapshot_rules_list.assert_called_once_with(
mock.ANY, snapshot.id)
def test_list_rules_exception(self):
snapshot = test_data.snapshot
self.mock_object(
api_manila, "share_snapshot_get", mock.Mock(
return_value=snapshot))
self.mock_object(
api_manila, "share_snapshot_rules_list",
mock.Mock(side_effect=Exception('fake')))
url = reverse(
'horizon:project:share_snapshots:share_snapshot_manage_rules',
args=[snapshot.id])
res = self.client.get(url)
self.assertEqual(res.status_code, 302)
self.assertTemplateNotUsed(
res, 'project/share_snapshots/manage_rules.html')
api_manila.share_snapshot_rules_list.assert_called_once_with(
mock.ANY, snapshot.id)
def test_create_rule_get(self):
snapshot = test_data.snapshot
url = reverse(
'horizon:project:share_snapshots:share_snapshot_rule_add',
args=[snapshot.id])
self.mock_object(
api_manila, "share_snapshot_get", mock.Mock(
return_value=snapshot))
self.mock_object(
neutron, "is_service_enabled", mock.Mock(return_value=[True]))
res = self.client.get(url)
self.assertNoMessages()
self.assertTemplateUsed(res, 'project/share_snapshots/rule_add.html')
def test_create_rule_get_exception(self):
snapshot = test_data.snapshot
url = reverse(
'horizon:project:share_snapshots:share_snapshot_rule_add',
args=[snapshot.id])
self.mock_object(
api_manila, "share_snapshot_get", mock.Mock(
side_effect=Exception('fake')))
res = self.client.get(url)
self.assertEqual(res.status_code, 302)
self.assertTemplateNotUsed(
res, 'project/share_snapshots/rule_add.html')
@ddt.data(None, Exception('fake'))
def test_create_rule_post(self, exc):
snapshot = test_data.snapshot
self.mock_object(
api_manila, "share_snapshot_get", mock.Mock(return_value=snapshot))
url = reverse(
'horizon:project:share_snapshots:share_snapshot_rule_add',
args=[snapshot.id])
self.mock_object(
api_manila, "share_snapshot_allow",
mock.Mock(side_effect=exc))
formData = {
'access_type': 'user',
'method': u'CreateForm',
'access_to': 'someuser',
}
res = self.client.post(url, formData)
self.assertEqual(res.status_code, 302)
api_manila.share_snapshot_allow.assert_called_once_with(
mock.ANY, snapshot.id, access_type=formData['access_type'],
access_to=formData['access_to'])
self.assertRedirectsNoFollow(
res,
reverse(
'horizon:project:share_snapshots:share_snapshot_manage_rules',
args=[snapshot.id])
)
@ddt.data(None, Exception('fake'))
def test_delete_rule(self, exc):
snapshot = test_data.snapshot
rule = test_data.ip_rule
formData = {'action': 'rules__delete__%s' % rule.id}
self.mock_object(
api_manila, "share_snapshot_get", mock.Mock(
return_value=snapshot))
self.mock_object(api_manila, "share_snapshot_deny",
mock.Mock(side_effect=exc))
self.mock_object(
api_manila, "share_snapshot_rules_list", mock.Mock(
return_value=[rule]))
url = reverse(
'horizon:project:share_snapshots:share_snapshot_manage_rules',
args=[snapshot.id])
res = self.client.post(url, formData)
self.assertEqual(res.status_code, 302)
api_manila.share_snapshot_deny.assert_called_with(
mock.ANY, snapshot.id, rule.id)
api_manila.share_snapshot_rules_list.assert_called_with(
mock.ANY, snapshot.id)
manila-ui-3.0.0/manila_ui/tests/dashboards/project/share_snapshots/test_tables.py 0000664 0001750 0001750 00000005071 13647271543 030376 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2015 Mirantis, 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.
import ddt
from django.core.handlers import wsgi
from unittest import mock
from manila_ui.api import manila as api_manila
from manila_ui.dashboards.project.share_snapshots import tables
from manila_ui.tests.dashboards.project import test_data
from manila_ui.tests import helpers as base
@ddt.ddt
class CreateSnapshotTests(base.APITestCase):
def setUp(self):
super(self.__class__, self).setUp()
FAKE_ENVIRON = {'REQUEST_METHOD': 'GET', 'wsgi.input': 'fake_input'}
self.request = wsgi.WSGIRequest(FAKE_ENVIRON)
self.create_snapshot = tables.CreateShareSnapshot()
def _get_fake_share(self, **kwargs):
if 'status' not in kwargs.keys():
kwargs.update({'status': 'available'})
return type("Share", (object, ), kwargs)()
@ddt.data(True, False)
def test_allowed_with_snapshot_support_attr(self, snapshot_support):
self.mock_object(
api_manila, "tenant_absolute_limits",
mock.Mock(return_value=test_data.limits))
share = self._get_fake_share(snapshot_support=snapshot_support)
result = self.create_snapshot.allowed(self.request, share)
self.assertEqual(snapshot_support, result)
def test_allowed_no_snapshot_support_attr(self):
self.mock_object(
api_manila, "tenant_absolute_limits",
mock.Mock(return_value=test_data.limits))
share = self._get_fake_share()
result = self.create_snapshot.allowed(self.request, share)
self.assertNotIn('disabled', self.create_snapshot.classes)
self.assertTrue(result)
def test_allowed_no_snapshot_support_attr_no_quota(self):
self.mock_object(
api_manila, "tenant_absolute_limits",
mock.Mock(return_value=test_data.limits_negative))
share = self._get_fake_share()
result = self.create_snapshot.allowed(self.request, share)
self.assertIn('disabled', self.create_snapshot.classes)
self.assertTrue(result)
manila-ui-3.0.0/manila_ui/tests/dashboards/project/share_snapshots/__init__.py 0000664 0001750 0001750 00000000000 13647271543 027607 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/api/ 0000775 0001750 0001750 00000000000 13647271736 017301 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/api/test_manila.py 0000664 0001750 0001750 00000060033 13647271543 022151 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2015 Mirantis, 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.
import ddt
from openstack_dashboard.api import base as horizon_api
from manila_ui.api import manila as api
from manila_ui.tests import helpers as base
@ddt.ddt
class ManilaApiTests(base.APITestCase):
def setUp(self):
super(self.__class__, self).setUp()
self.id = "fake_id"
self.mock_object(horizon_api, "QuotaSet")
@ddt.data((None, True), ("some_fake_sg_id", False))
@ddt.unpack
def test_share_create(self, sg_id, is_public):
kwargs = {
"share_network": "fake_sn",
"snapshot_id": "fake_snapshot_id",
"metadata": {"k1": "v1", "k2": "v2"},
"share_type": "fake_st",
"is_public": is_public,
"availability_zone": "fake_az",
"share_group_id": sg_id,
}
size = 5
name = "fake_name"
desc = "fake_description"
proto = "fake_share_protocol"
api.share_create(self.request, size, name, desc, proto, **kwargs)
self.manilaclient.shares.create.assert_called_once_with(
proto, size, name=name, description=desc, **kwargs)
@ddt.data(None, "some_fake_sg_id")
def test_share_delete(self, sg_id):
s_id = "fake_share_id"
api.share_delete(self.request, s_id, sg_id)
self.manilaclient.shares.delete.assert_called_once_with(
s_id, share_group_id=sg_id)
def test_list_share_export_locations(self):
api.share_export_location_list(self.request, self.id)
self.manilaclient.share_export_locations.list.assert_called_once_with(
self.id)
def test_list_share_instance_export_locations(self):
api.share_instance_export_location_list(self.request, self.id)
client = self.manilaclient
client.share_instance_export_locations.list.assert_called_once_with(
self.id)
def test_share_manage(self):
api.share_manage(
self.request,
service_host="fake_service_host",
protocol="fake_protocol",
export_path="fake_export_path",
driver_options={"fake_key": "fake_value"},
share_type="fake_share_type",
name="fake_name",
description="fake_description",
is_public="fake_is_public",
)
self.manilaclient.shares.manage.assert_called_once_with(
service_host="fake_service_host",
protocol="fake_protocol",
export_path="fake_export_path",
driver_options={"fake_key": "fake_value"},
share_type="fake_share_type",
name="fake_name",
description="fake_description",
is_public="fake_is_public",
)
def test_share_extend(self):
new_size = "123"
api.share_extend(self.request, self.id, new_size)
self.manilaclient.shares.extend.assert_called_once_with(
self.id, new_size
)
def test_share_revert(self):
share = 'fake_share'
snapshot = 'fake_snapshot'
api.share_revert(self.request, share, snapshot)
self.manilaclient.shares.revert_to_snapshot.assert_called_once_with(
share, snapshot)
@ddt.data(True, False)
def test_share_type_create_with_default_values(self, dhss):
name = 'fake_share_type_name'
api.share_type_create(self.request, name, dhss)
self.manilaclient.share_types.create.assert_called_once_with(
name=name,
spec_driver_handles_share_servers=dhss,
is_public=True)
@ddt.data(
(True, True),
(False, True),
(True, False),
(False, False),
)
@ddt.unpack
def test_share_type_create_with_custom_values(
self, dhss, is_public):
name = 'fake_share_type_name'
api.share_type_create(
self.request, name, dhss, is_public)
self.manilaclient.share_types.create.assert_called_once_with(
name=name,
spec_driver_handles_share_servers=dhss,
is_public=is_public)
def test_share_type_set_extra_specs(self):
data = {"foo": "bar"}
api.share_type_set_extra_specs(self.request, self.id, data)
share_types_get = self.manilaclient.share_types.get
share_types_get.assert_called_once_with(self.id)
share_types_get.return_value.set_keys.assert_called_once_with(data)
def test_share_type_unset_extra_specs(self):
keys = ["foo", "bar"]
api.share_type_unset_extra_specs(self.request, self.id, keys)
share_types_get = self.manilaclient.share_types.get
share_types_get.assert_called_once_with(self.id)
share_types_get.return_value.unset_keys.assert_called_once_with(keys)
def test_share_instance_list(self):
api.share_instance_list(self.request)
self.manilaclient.share_instances.list.assert_called_once_with()
def test_share_instance_get(self):
api.share_instance_get(self.request, self.id)
self.manilaclient.share_instances.get.assert_called_once_with(self.id)
def test_share_replica_list(self):
api.share_replica_list(self.request)
self.manilaclient.share_replicas.list.assert_called_once_with(None)
def test_share_replica_list_with_filter_by_share(self):
api.share_replica_list(self.request, share="FOO")
self.manilaclient.share_replicas.list.assert_called_once_with("FOO")
@ddt.data(None, "foo_share_network")
def test_share_replica_create(self, share_network):
share = "FOO_share"
availability_zone = "BAR_availability_zone"
api.share_replica_create(
self.request, share, availability_zone, share_network)
self.manilaclient.share_replicas.create.assert_called_once_with(
share,
availability_zone=availability_zone,
share_network=share_network,
)
def test_share_replica_get(self):
api.share_replica_get(self.request, "fake")
self.manilaclient.share_replicas.get.assert_called_once_with("fake")
def test_share_replica_delete(self):
api.share_replica_delete(self.request, "fake")
self.manilaclient.share_replicas.delete.assert_called_once_with("fake")
def test_share_replica_promote(self):
api.share_replica_promote(self.request, "fake")
self.manilaclient.share_replicas.promote.assert_called_once_with(
"fake")
def test_share_replica_resync(self):
api.share_replica_resync(self.request, "fake")
self.manilaclient.share_replicas.resync.assert_called_once_with("fake")
def test_share_replica_reset_status(self):
replica = "fake_replica"
status = "fake_status"
api.share_replica_reset_status(self.request, replica, status)
self.manilaclient.share_replicas.reset_state.assert_called_once_with(
replica, status)
def test_share_replica_reset_state(self):
replica = "fake_replica"
state = "fake_state"
api.share_replica_reset_state(self.request, replica, state)
mock_reset_state = self.manilaclient.share_replicas.reset_replica_state
mock_reset_state.assert_called_once_with(replica, state)
def test_allow_snapshot(self):
access_type = "fake_type"
access_to = "fake_value"
api.share_snapshot_allow(self.request, self.id, access_type,
access_to)
client = self.manilaclient
client.share_snapshots.allow.assert_called_once_with(
self.id, access_type, access_to)
def test_deny_snapshot(self):
api.share_snapshot_deny(self.request, self.id, self.id)
client = self.manilaclient
client.share_snapshots.deny.assert_called_once_with(self.id, self.id)
def test_list_snapshot_rules(self):
api.share_snapshot_rules_list(self.request, self.id)
client = self.manilaclient
client.share_snapshots.access_list.assert_called_once_with(self.id)
def test_list_snapshot_export_locations(self):
api.share_snap_export_location_list(self.request, self.id)
client = self.manilaclient
client.share_snapshot_export_locations.list.assert_called_once_with(
snapshot=self.id)
def test_list_snapshot_instance_export_locations(self):
api.share_snap_instance_export_location_list(self.request, self.id)
client = self.manilaclient
client.share_snapshot_export_locations.list.assert_called_once_with(
snapshot_instance=self.id)
def test_migration_start(self):
api.migration_start(self.request, 'fake_share', 'fake_host', False,
True, True, True, True, 'fake_net_id',
'fake_type_id')
self.manilaclient.shares.migration_start.assert_called_once_with(
'fake_share',
host='fake_host',
force_host_assisted_migration=False,
nondisruptive=True,
writable=True,
preserve_metadata=True,
preserve_snapshots=True,
new_share_network_id='fake_net_id',
new_share_type_id='fake_type_id'
)
def test_migration_complete(self):
api.migration_complete(self.request, 'fake_share')
self.manilaclient.shares.migration_complete.assert_called_once_with(
'fake_share')
def test_migration_cancel(self):
api.migration_cancel(self.request, 'fake_share')
self.manilaclient.shares.migration_cancel.assert_called_once_with(
'fake_share')
def test_migration_get_progress(self):
api.migration_get_progress(self.request, 'fake_share')
(self.manilaclient.shares.migration_get_progress.
assert_called_once_with('fake_share'))
def test_availability_zone_list(self):
api.availability_zone_list(self.request)
self.manilaclient.availability_zones.list.assert_called_once_with()
@ddt.data(
({'share_gigabytes': 333}, {'gigabytes': 333}),
({'share_snapshot_gigabytes': 444}, {'snapshot_gigabytes': 444}),
({'share_snapshots': 14}, {'snapshots': 14}),
({'snapshots': 14}, {'snapshots': 14}),
({'gigabytes': 14}, {'gigabytes': 14}),
({'snapshot_gigabytes': 314}, {'snapshot_gigabytes': 314}),
({'shares': 24}, {'shares': 24}),
({'share_networks': 14}, {'share_networks': 14}),
)
@ddt.unpack
def test_tenant_quota_update(self, provided_kwargs, expected_kwargs):
tenant_id = 'fake_tenant_id'
api.tenant_quota_update(self.request, tenant_id, **provided_kwargs)
self.manilaclient.quotas.update.assert_called_once_with(
tenant_id, **expected_kwargs)
self.manilaclient.quota_classes.update.assert_not_called()
@ddt.data(
({'share_gigabytes': 333}, {'gigabytes': 333}),
({'share_snapshot_gigabytes': 444}, {'snapshot_gigabytes': 444}),
({'share_snapshots': 14}, {'snapshots': 14}),
({'snapshots': 14}, {'snapshots': 14}),
({'gigabytes': 14}, {'gigabytes': 14}),
({'snapshot_gigabytes': 314}, {'snapshot_gigabytes': 314}),
({'shares': 24}, {'shares': 24}),
({'share_networks': 14}, {'share_networks': 14}),
)
@ddt.unpack
def test_default_quota_update(self, provided_kwargs, expected_kwargs):
api.default_quota_update(self.request, **provided_kwargs)
self.manilaclient.quota_classes.update.assert_called_once_with(
api.DEFAULT_QUOTA_NAME, **expected_kwargs)
def test_tenant_quota_get(self):
tenant_id = 'fake_tenant_id'
result = api.tenant_quota_get(self.request, tenant_id)
self.assertIsNotNone(result)
self.manilaclient.quotas.get.assert_called_once_with(tenant_id)
@ddt.data({
'shares': 24, 'gigabytes': 333, 'snapshots': 14,
'snapshot_gigabytes': 444, 'share_networks': 14
})
@ddt.unpack
def test_ui_data_map(self, **kwargs):
expected_result = {
'shares': 24, 'share_gigabytes': 333, 'share_snapshots': 14,
'share_snapshot_gigabytes': 444, 'share_networks': 14
}
converted_result_for_ui = {}
for field in api.MANILA_QUOTA_FIELDS:
converted_result_for_ui[field] = (
kwargs[api.MANILA_QUOTA_FIELDS_DATA_MAP[field]])
self.assertEqual(expected_result, converted_result_for_ui)
@ddt.data(
{},
{"name": "foo_name"},
{"description": "foo_desc"},
{"neutron_net_id": "foo_neutron_net_id"},
{"neutron_subnet_id": "foo_neutron_subnet_id"},
{"name": "foo_name", "description": "foo_desc",
"neutron_net_id": "foo_neutron_net_id",
"neutron_subnet_id": "foo_neutron_subnet_id"},
)
@ddt.unpack
def test_share_network_create(self, **kwargs):
expected_kwargs = {
"name": None,
"description": None,
"neutron_net_id": None,
"neutron_subnet_id": None,
}
expected_kwargs.update(kwargs)
api.share_network_create(self.request, **kwargs)
mock_sn_create = self.manilaclient.share_networks.create
mock_sn_create.assert_called_once_with(**expected_kwargs)
# Share groups tests
def test_share_group_create(self):
name = "fake_sg_name"
kwargs = {
"description": "fake_desc",
"share_group_type": "fake_sg_type",
"share_types": ["fake", "list", "of", "fake", "share", "types"],
"share_network": "fake_sn",
"source_share_group_snapshot": "fake_source_share_group_snapshot",
"availability_zone": "fake_az",
}
result = api.share_group_create(self.request, name, **kwargs)
self.assertEqual(
self.manilaclient.share_groups.create.return_value, result)
self.manilaclient.share_groups.create.assert_called_once_with(
name=name, **kwargs)
def test_share_group_get(self):
sg = "fake_share_group"
result = api.share_group_get(self.request, sg)
self.assertEqual(
self.manilaclient.share_groups.get.return_value, result)
self.manilaclient.share_groups.get.assert_called_once_with(sg)
def test_share_group_update(self):
sg = "fake_share_group"
name = "fake_name"
desc = "fake_desc"
result = api.share_group_update(self.request, sg, name, desc)
self.assertEqual(
self.manilaclient.share_groups.update.return_value, result)
self.manilaclient.share_groups.update.assert_called_once_with(
sg, name=name, description=desc)
@ddt.data({}, {"force": True}, {"force": False})
def test_share_group_delete(self, kwargs):
sg = 'fake_share_group'
api.share_group_delete(self.request, sg, **kwargs)
self.manilaclient.share_groups.delete.assert_called_once_with(
sg, force=kwargs.get("force", False))
def test_share_group_reset_state(self):
sg = 'fake_share_group'
state = 'fake_state'
result = api.share_group_reset_state(self.request, sg, state)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_groups.reset_state.return_value,
result)
self.manilaclient.share_groups.reset_state.assert_called_once_with(
sg, state)
@ddt.data(
{},
{"detailed": True},
{"detailed": False},
{"search_opts": {"foo": "bar"}},
{"sort_key": "id", "sort_dir": "asc"},
)
def test_share_group_list(self, kwargs):
result = api.share_group_list(self.request, **kwargs)
self.assertEqual(
self.manilaclient.share_groups.list.return_value, result)
self.manilaclient.share_groups.list.assert_called_once_with(
detailed=kwargs.get("detailed", True),
search_opts=kwargs.get("search_opts"),
sort_key=kwargs.get("sort_key"),
sort_dir=kwargs.get("sort_dir"),
)
# Share Group Snapshots tests
def test_share_group_snapshot_create(self):
sg = 'fake_share_group'
name = 'fake_name'
desc = 'fake_description'
result = api.share_group_snapshot_create(self.request, sg, name, desc)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_snapshots.create.return_value,
result)
self.manilaclient.share_group_snapshots.create.assert_called_once_with(
share_group=sg, name=name, description=desc)
def test_share_group_snapshot_get(self):
sgs = 'fake_share_group_snapshot'
result = api.share_group_snapshot_get(self.request, sgs)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_snapshots.get.return_value, result)
self.manilaclient.share_group_snapshots.get.assert_called_once_with(
sgs)
def test_share_group_snapshot_update(self):
sgs = 'fake_share_group_snapshot'
name = 'fake_name'
desc = 'fake_description'
result = api.share_group_snapshot_update(self.request, sgs, name, desc)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_snapshots.update.return_value,
result)
self.manilaclient.share_group_snapshots.update.assert_called_once_with(
sgs, name=name, description=desc)
@ddt.data(True, False)
def test_share_group_snapshot_delete(self, force):
sgs = 'fake_share_group_snapshot'
result = api.share_group_snapshot_delete(self.request, sgs, force)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_snapshots.delete.return_value,
result)
self.manilaclient.share_group_snapshots.delete.assert_called_once_with(
sgs, force=force)
def test_share_group_snapshot_reset_state(self):
sgs = 'fake_share_group_snapshot'
state = 'fake_state'
result = api.share_group_snapshot_reset_state(self.request, sgs, state)
rs_method = self.manilaclient.share_group_snapshots.reset_state
self.assertIsNotNone(result)
self.assertEqual(rs_method.return_value, result)
rs_method.assert_called_once_with(sgs, state)
@ddt.data(
{},
{'detailed': False},
{'detailed': True, 'search_opts': 'foo',
'sort_key': 'k', 'sort_dir': 'v'},
)
def test_share_group_snapshot_list(self, kwargs):
result = api.share_group_snapshot_list(self.request, **kwargs)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_snapshots.list.return_value,
result)
self.manilaclient.share_group_snapshots.list.assert_called_once_with(
detailed=kwargs.get('detailed', True),
search_opts=kwargs.get('search_opts'),
sort_key=kwargs.get('sort_key'),
sort_dir=kwargs.get('sort_dir'))
# Share Group Types tests
@ddt.data(
{'is_public': True},
{'is_public': False, 'group_specs': {'foo': 'bar'}},
{'group_specs': {}},
)
def test_share_group_type_create(self, kwargs):
name = 'fake_sgt_name'
sts = ['fake', 'list', 'of', 'share', 'types']
result = api.share_group_type_create(self.request, name, sts, **kwargs)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_types.create.return_value,
result)
self.manilaclient.share_group_types.create.assert_called_once_with(
name=name, share_types=sts,
is_public=kwargs.get('is_public', False),
group_specs=kwargs.get('group_specs'))
def test_share_group_type_get(self):
sgt = "fake_sgt"
result = api.share_group_type_get(self.request, sgt)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_types.get.return_value, result)
self.manilaclient.share_group_types.get.assert_called_once_with(sgt)
@ddt.data(True, False)
def test_share_group_type_list(self, show_all):
result = api.share_group_type_list(self.request, show_all)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_types.list.return_value, result)
self.manilaclient.share_group_types.list.assert_called_once_with(
show_all=show_all)
def test_share_group_type_delete(self):
sgt = 'fake_share_group_type'
result = api.share_group_type_delete(self.request, sgt)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_types.delete.return_value, result)
self.manilaclient.share_group_types.delete.assert_called_once_with(sgt)
def test_share_group_type_access_list(self):
sgt = 'fake_share_group_type'
result = api.share_group_type_access_list(self.request, sgt)
self.assertIsNotNone(result)
self.assertEqual(
self.manilaclient.share_group_type_access.list.return_value,
result)
self.manilaclient.share_group_type_access.list.assert_called_once_with(
sgt)
def test_share_group_type_access_add(self):
sgt = 'fake_share_group_type'
project = 'fake_project'
result = api.share_group_type_access_add(self.request, sgt, project)
sgt_access = self.manilaclient.share_group_type_access
self.assertIsNotNone(result)
self.assertEqual(
sgt_access.add_project_access.return_value, result)
sgt_access.add_project_access.assert_called_once_with(sgt, project)
def test_share_group_type_access_remove(self):
sgt = 'fake_share_group_type'
project = 'fake_project'
result = api.share_group_type_access_remove(self.request, sgt, project)
sgt_access = self.manilaclient.share_group_type_access
self.assertIsNotNone(result)
self.assertEqual(
sgt_access.remove_project_access.return_value, result)
sgt_access.remove_project_access.assert_called_once_with(sgt, project)
def test_share_group_type_set_specs(self):
sgt = 'fake_share_group_type'
group_specs = 'fake_specs'
result = api.share_group_type_set_specs(self.request, sgt, group_specs)
get_method = self.manilaclient.share_group_types.get
self.assertIsNotNone(result)
self.assertEqual(get_method.return_value.set_keys.return_value, result)
get_method.assert_called_once_with(sgt)
get_method.return_value.set_keys.assert_called_once_with(group_specs)
def test_share_group_type_unset_specs(self):
sgt = 'fake_share_group_type'
keys = ['fake', 'list', 'of', 'keys', 'for', 'deletion']
result = api.share_group_type_unset_specs(self.request, sgt, keys)
get_method = self.manilaclient.share_group_types.get
self.assertIsNotNone(result)
self.assertEqual(
get_method.return_value.unset_keys.return_value, result)
get_method.assert_called_once_with(sgt)
get_method.return_value.unset_keys.assert_called_once_with(keys)
def test_share_group_type_get_specs(self):
sgt = 'fake_share_group_type'
result = api.share_group_type_get_specs(self.request, sgt)
get_method = self.manilaclient.share_group_types.get
self.assertIsNotNone(result)
self.assertEqual(
get_method.return_value.get_keys.return_value, result)
get_method.assert_called_once_with(sgt)
get_method.return_value.get_keys.assert_called_once_with()
manila-ui-3.0.0/manila_ui/tests/api/__init__.py 0000664 0001750 0001750 00000000000 13647271543 021374 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/urls.py 0000664 0001750 0001750 00000001311 13647271543 020057 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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))
]
manila-ui-3.0.0/manila_ui/tests/__init__.py 0000664 0001750 0001750 00000000000 13647271543 020623 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/ 0000775 0001750 0001750 00000000000 13647271736 021053 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/ 0000775 0001750 0001750 00000000000 13647271736 022152 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/ 0000775 0001750 0001750 00000000000 13647271736 023242 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/ 0000775 0001750 0001750 00000000000 13647271736 024344 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/sharegroupspage.py 0000664 0001750 0001750 00000001317 13647271543 030113 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.tests.integration.pages.project.share import sharegroupspage
class SharegroupsPage(sharegroupspage.SharegroupsPage):
pass
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/sharenetworkspage.py 0000664 0001750 0001750 00000001327 13647271543 030451 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.tests.integration.pages.project.share import sharenetworkspage
class SharenetworksPage(sharenetworkspage.SharenetworksPage):
pass
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/sharespage.py 0000664 0001750 0001750 00000001273 13647271543 027037 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.tests.integration.pages.project.share import sharespage
class SharesPage(sharespage.SharesPage):
pass
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/securityservicespage.py 0000664 0001750 0001750 00000001351 13647271543 031162 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.tests.integration.pages.project.share import \
securityservicespage
class SecurityservicesPage(securityservicespage.SecurityservicesPage):
pass
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/sharegroupssnapshotspage.py 0000664 0001750 0001750 00000001406 13647271543 032055 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.tests.integration.pages.project.share import \
sharegroupsnapshotspage as sg_snapshots_page
class SharegroupssnapshotsPage(sg_snapshots_page.SharegroupssnapshotsPage):
pass
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/sharetypespage.py 0000664 0001750 0001750 00000001505 13647271543 027737 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class SharetypesPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(SharetypesPage, self).__init__(driver, conf)
self._page_title = "Share Types"
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/sharegrouptypespage.py 0000664 0001750 0001750 00000001525 13647271543 031016 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class SharegrouptypesPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(SharegrouptypesPage, self).__init__(driver, conf)
self._page_title = "Share Group Types"
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/shareserverspage.py 0000664 0001750 0001750 00000001306 13647271543 030263 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class ShareserversPage(basepage.BaseNavigationPage):
pass
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/sharesnapshotspage.py 0000664 0001750 0001750 00000001333 13647271543 030614 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.tests.integration.pages.project.share import sharesnapshotspage
class SharesnapshotsPage(sharesnapshotspage.SharesnapshotsPage):
pass
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/shareinstancespage.py 0000664 0001750 0001750 00000001521 13647271543 030560 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class ShareinstancesPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(ShareinstancesPage, self).__init__(driver, conf)
self._page_title = "Share Instances"
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/sharegroupsnapshotspage.py 0000664 0001750 0001750 00000001404 13647271543 031670 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.tests.integration.pages.project.share import \
sharegroupsnapshotspage as sg_snapshots_page
class SharegroupsnapshotsPage(sg_snapshots_page.SharegroupsnapshotsPage):
pass
manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/share/__init__.py 0000664 0001750 0001750 00000000000 13647271543 026437 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/admin/__init__.py 0000664 0001750 0001750 00000000000 13647271543 025335 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/__init__.py 0000664 0001750 0001750 00000000000 13647271543 024245 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/project/ 0000775 0001750 0001750 00000000000 13647271736 023620 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/project/share/ 0000775 0001750 0001750 00000000000 13647271736 024722 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/project/share/sharegroupspage.py 0000664 0001750 0001750 00000001510 13647271543 030464 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class SharegroupsPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(SharegroupsPage, self).__init__(driver, conf)
self._page_title = "Share Groups"
manila-ui-3.0.0/manila_ui/tests/integration/pages/project/share/sharenetworkspage.py 0000664 0001750 0001750 00000001516 13647271543 031027 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class SharenetworksPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(SharenetworksPage, self).__init__(driver, conf)
self._page_title = "Share Networks"
manila-ui-3.0.0/manila_ui/tests/integration/pages/project/share/sharespage.py 0000664 0001750 0001750 00000001470 13647271543 027414 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class SharesPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(SharesPage, self).__init__(driver, conf)
self._page_title = "Shares"
manila-ui-3.0.0/manila_ui/tests/integration/pages/project/share/securityservicespage.py 0000664 0001750 0001750 00000001527 13647271543 031545 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class SecurityservicesPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(SecurityservicesPage, self).__init__(driver, conf)
self._page_title = "Security Services"
manila-ui-3.0.0/manila_ui/tests/integration/pages/project/share/sharesnapshotspage.py 0000664 0001750 0001750 00000001521 13647271543 031171 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class SharesnapshotsPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(SharesnapshotsPage, self).__init__(driver, conf)
self._page_title = "Share Snapshots"
manila-ui-3.0.0/manila_ui/tests/integration/pages/project/share/sharegroupsnapshotspage.py 0000664 0001750 0001750 00000001541 13647271543 032250 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests.pages import basepage
class SharegroupsnapshotsPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(SharegroupsnapshotsPage, self).__init__(driver, conf)
self._page_title = "Share Group Snapshots"
manila-ui-3.0.0/manila_ui/tests/integration/pages/project/share/__init__.py 0000664 0001750 0001750 00000000000 13647271543 027015 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/pages/project/__init__.py 0000664 0001750 0001750 00000000000 13647271543 025713 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/integration/horizon.conf 0000664 0001750 0001750 00000000702 13647271543 023405 0 ustar zuul zuul 0000000 0000000 [plugin]
is_plugin=True
plugin_page_path=manila_ui.tests.integration.pages
plugin_page_structure='{"Project": {"Share": {"_": ["Shares", "Share Snapshots", "Share Networks", "Security Services", "Share Groups", "Share Group Snapshots"]}}, "Admin": {"Share": {"_": ["Shares", "Share Snapshots", "Share Types", "Share Networks", "Security Services", "Share Servers", "Share Instances", "Share Groups", "Share Group Snapshots", "Share Group Types"]}}}'
manila-ui-3.0.0/manila_ui/tests/integration/test_basic.py 0000664 0001750 0001750 00000011103 13647271543 023535 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.integration_tests import helpers
class TestManilaDashboardInstalled(helpers.TestCase):
def test_shares_page_opened(self):
shares_page = self.home_pg.go_to_project_share_sharespage()
self.assertEqual(shares_page.page_title,
'Shares - OpenStack Dashboard')
def test_share_snapshots_page_opened(self):
s_snaps_page = self.home_pg.go_to_project_share_sharesnapshotspage()
self.assertEqual(s_snaps_page.page_title,
'Share Snapshots - OpenStack Dashboard')
def test_share_networks_page_opened(self):
s_networks_page = self.home_pg.go_to_project_share_sharenetworkspage()
self.assertEqual(s_networks_page.page_title,
'Share Networks - OpenStack Dashboard')
def test_security_services_page_opened(self):
sec_serv_page = self.home_pg.go_to_project_share_securityservicespage()
self.assertEqual(sec_serv_page.page_title,
'Security Services - OpenStack Dashboard')
def test_share_groups_page_opened(self):
share_groups_page = self.home_pg.go_to_project_share_sharegroupspage()
self.assertEqual(share_groups_page.page_title,
'Share Groups - OpenStack Dashboard')
def test_share_group_snapthots_page_opened(self):
sg_s_page = self.home_pg.go_to_project_share_sharegroupsnapshotspage()
self.assertEqual(sg_s_page.page_title,
'Share Group Snapshots - OpenStack Dashboard')
class TestManilaAdminDashboardInstalled(helpers.AdminTestCase):
def test_shares_page_opened(self):
shares_page = self.home_pg.go_to_admin_share_sharespage()
self.assertEqual(shares_page.page_title,
'Shares - OpenStack Dashboard')
def test_share_snapshots_page_opened(self):
s_snapshots_page = self.home_pg.go_to_admin_share_sharesnapshotspage()
# TODO(e0ne): fix page title and test
self.assertEqual(s_snapshots_page.page_title,
'Shares - OpenStack Dashboard')
def test_share_snapshot_types_page_opened(self):
share_types_page = (
self.home_pg.go_to_admin_share_sharetypespage())
self.assertEqual(share_types_page.page_title,
'Share Types - OpenStack Dashboard')
def test_share_networks_page_opened(self):
s_networks_page = self.home_pg.go_to_admin_share_sharenetworkspage()
self.assertEqual(s_networks_page.page_title,
'Share Networks - OpenStack Dashboard')
def test_security_services_page_opened(self):
sec_serv_page = self.home_pg.go_to_admin_share_securityservicespage()
self.assertEqual(sec_serv_page.page_title,
'Security Services - OpenStack Dashboard')
def test_share_servers_page_opened(self):
share_serv_page = self.home_pg.go_to_admin_share_shareserverspage()
self.assertEqual(share_serv_page.page_title,
'Share Servers - OpenStack Dashboard')
def test_share_instences_page_opened(self):
sec_serv_page = self.home_pg.go_to_admin_share_shareinstancespage()
self.assertEqual(sec_serv_page.page_title,
'Share Instances - OpenStack Dashboard')
def test_share_groups_page_opened(self):
share_groups_page = self.home_pg.go_to_admin_share_sharegroupspage()
self.assertEqual(share_groups_page.page_title,
'Share Groups - OpenStack Dashboard')
def test_share_group_snapthots_page_opened(self):
sg_s_page = self.home_pg.go_to_admin_share_sharegroupsnapshotspage()
self.assertEqual(sg_s_page.page_title,
'Share Group Snapshots - OpenStack Dashboard')
def test_share_group_types_page_opened(self):
sg_types_page = self.home_pg.go_to_admin_share_sharegrouptypespage()
self.assertEqual(sg_types_page.page_title,
'Share Group Types - OpenStack Dashboard')
manila-ui-3.0.0/manila_ui/tests/integration/__init__.py 0000664 0001750 0001750 00000000000 13647271543 023146 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/tests/settings.py 0000664 0001750 0001750 00000002030 13647271543 020731 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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
# Load the pluggable dashboard settings
import manila_ui.local.enabled
import openstack_dashboard.enabled
from openstack_dashboard.utils import settings
MANILA_UI_APPS = list(INSTALLED_APPS) + ['manila_ui.dashboards']
settings.update_dashboards(
[
manila_ui.local.enabled,
openstack_dashboard.enabled,
],
HORIZON_CONFIG,
MANILA_UI_APPS,
)
manila-ui-3.0.0/manila_ui/tests/helpers.py 0000664 0001750 0001750 00000004112 13647271543 020536 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 unittest
from unittest import mock
from manila_ui import api
from manila_ui.tests.test_data import utils
from openstack_dashboard.test import helpers
class ManilaTestsMixin(object):
def _setup_test_data(self):
super(ManilaTestsMixin, self)._setup_test_data()
utils.load_test_data(self)
def mock_object(self, obj, attr_name, new_attr=None, **kwargs):
"""Use python mock to mock an object attribute
Mocks the specified objects attribute with the given value.
Automatically performs 'addCleanup' for the mock.
"""
if not new_attr:
new_attr = mock.Mock()
patcher = mock.patch.object(obj, attr_name, new_attr, **kwargs)
patcher.start()
# NOTE(vponomaryov): 'self.addCleanup(patcher.stop)' is not called
# here, because it is inherited from Horizon project's test class.
return new_attr
@unittest.skipIf(os.environ.get('SKIP_UNITTESTS', False),
"The SKIP_UNITTESTS env variable is set.")
class TestCase(ManilaTestsMixin, helpers.TestCase):
pass
class BaseAdminViewTests(ManilaTestsMixin, helpers.BaseAdminViewTests):
pass
class APITestCase(ManilaTestsMixin, helpers.APITestCase):
def setUp(self):
super(APITestCase, self).setUp()
self._manilaclient = self.mock_object(api.manila, "manilaclient")
self.manilaclient = self._manilaclient.return_value
class FakeEntity(object):
def __init__(self, id, name):
self.id = id
self.name = name
manila-ui-3.0.0/manila_ui/utils/ 0000775 0001750 0001750 00000000000 13647271736 016526 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/utils/__init__.py 0000664 0001750 0001750 00000000000 13647271543 020621 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/ 0000775 0001750 0001750 00000000000 13647271736 017500 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/ 0000775 0001750 0001750 00000000000 13647271736 020570 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/ 0000775 0001750 0001750 00000000000 13647271736 024342 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/views.py 0000664 0001750 0001750 00000004045 13647271543 026050 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
"""
Admin views for managing security services.
"""
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tables
from horizon.utils import memoized
from manila_ui.api import manila
import manila_ui.dashboards.admin.security_services.tables as ss_tables
import manila_ui.dashboards.admin.security_services.tabs as ss_tabs
from manila_ui.dashboards.admin import utils
import manila_ui.dashboards.project.security_services.views as ss_views
class SecurityServicesView(tables.MultiTableView):
table_classes = (
ss_tables.SecurityServicesTable,
)
template_name = "admin/security_services/index.html"
page_title = _("Security Services")
@memoized.memoized_method
def get_security_services_data(self):
try:
security_services = manila.security_service_list(
self.request, search_opts={'all_tenants': True})
utils.set_project_name_to_objects(self.request, security_services)
except Exception:
security_services = []
exceptions.handle(
self.request, _("Unable to retrieve security services"))
return security_services
class SecurityServiceDetailView(ss_views.Detail):
tab_group_class = ss_tabs.SecurityServiceDetailTabs
template_name = "admin/security_services/detail.html"
redirect_url = reverse_lazy('horizon:admin:security_services:index')
manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/tabs.py 0000664 0001750 0001750 00000002154 13647271543 025643 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
from horizon import tabs
class SecurityServiceOverviewTab(tabs.Tab):
name = _("Security Service Overview")
slug = "security_service_overview_tab"
template_name = "admin/security_services/_detail.html"
def get_context_data(self, request):
return {"sec_service": self.tab_group.kwargs["sec_service"]}
class SecurityServiceDetailTabs(tabs.TabGroup):
slug = "security_service_details"
tabs = (
SecurityServiceOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/panel.py 0000664 0001750 0001750 00000001670 13647271543 026013 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class SecurityServices(horizon.Panel):
name = _("Security Services")
slug = 'security_services'
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(SecurityServices)
manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/templates/ 0000775 0001750 0001750 00000000000 13647271736 026340 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/templates/security_services/ 0000775 0001750 0001750 00000000000 13647271736 032112 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/templates/security_services/detail.html0000664 0001750 0001750 00000000346 13647271543 034241 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Security Service Details" %}{% endblock %}
{% block main %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/tables.py 0000664 0001750 0001750 00000004341 13647271543 026164 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 django.utils.translation import ungettext_lazy
from horizon import tables
from manila_ui.api import manila
class DeleteSecurityService(tables.DeleteAction):
policy_rules = (("share", "security_service:delete"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Security Service",
u"Delete Security Services",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Security Service",
u"Deleted Security Services",
count
)
def delete(self, request, obj_id):
manila.security_service_delete(request, obj_id)
class SecurityServicesTable(tables.DataTable):
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:admin:security_services:security_service_detail")
project = tables.Column("project_name", verbose_name=_("Project"))
dns_ip = tables.Column("dns_ip", verbose_name=_("DNS IP"))
server = tables.Column("server", verbose_name=_("Server"))
domain = tables.Column("domain", verbose_name=_("Domain"))
user = tables.Column("user", verbose_name=_("Sid"))
def get_object_display(self, security_service):
return security_service.name
def get_object_id(self, security_service):
return str(security_service.id)
class Meta(object):
name = "security_services"
verbose_name = _("Security Services")
table_actions = (
tables.NameFilterAction,
DeleteSecurityService,
)
row_actions = (
DeleteSecurityService,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/urls.py 0000664 0001750 0001750 00000001607 13647271543 025701 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.dashboards.admin.security_services import views
urlpatterns = [
urls.url(
r'^$',
views.SecurityServicesView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)$',
views.SecurityServiceDetailView.as_view(),
name='security_service_detail'),
]
manila-ui-3.0.0/manila_ui/dashboards/admin/security_services/__init__.py 0000664 0001750 0001750 00000000000 13647271543 026435 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/ 0000775 0001750 0001750 00000000000 13647271736 024332 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/views.py 0000664 0001750 0001750 00000011511 13647271543 026034 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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.
"""
Admin views for managing share group types.
"""
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon.utils import memoized
from horizon import workflows
from manila_ui.api import manila
from manila_ui.dashboards.admin.share_group_types import forms as sgt_forms
from manila_ui.dashboards.admin.share_group_types import tables as sgt_tables
import manila_ui.dashboards.admin.share_group_types.workflows as sgt_workflows
from manila_ui.dashboards import utils as common_utils
class ShareGroupTypesView(tables.MultiTableView):
table_classes = (
sgt_tables.ShareGroupTypesTable,
)
template_name = "admin/share_group_types/index.html"
page_title = _("Share Group Types")
@memoized.memoized_method
def get_share_group_types_data(self):
try:
share_group_types = manila.share_group_type_list(self.request)
except Exception:
exceptions.handle(
self.request, _('Unable to retrieve share group types.'))
return []
share_types = manila.share_type_list(self.request)
st_mapping = {}
for st in share_types:
st_mapping[st.id] = st.name
for sgt in share_group_types:
sgt.group_specs = common_utils.metadata_to_str(
sgt.group_specs, 8, 45)
sgt.share_types = ", ".join(
[st_mapping[st] for st in sgt.share_types])
return share_group_types
class CreateShareGroupTypeView(forms.ModalFormView):
form_class = sgt_forms.CreateShareGroupTypeForm
form_id = "create_share_group_type"
template_name = 'admin/share_group_types/create.html'
modal_header = _("Create Share Group Type")
modal_id = "create_share_group_type_modal"
submit_label = _("Create")
submit_url = reverse_lazy("horizon:admin:share_group_types:create")
success_url = reverse_lazy("horizon:admin:share_group_types:index")
page_title = _("Create Share Group Type")
class ManageShareGroupTypeAccessView(workflows.WorkflowView):
workflow_class = sgt_workflows.ManageShareGroupTypeAccessWorkflow
template_name = "admin/share_group_types/manage_access.html"
success_url = 'horizon:admin:share_group_types:index'
page_title = _("Manage Share Group Type Access")
def get_initial(self):
return {'id': self.kwargs["share_group_type_id"]}
def get_context_data(self, **kwargs):
context = super(ManageShareGroupTypeAccessView, self).get_context_data(
**kwargs)
context['id'] = self.kwargs['share_group_type_id']
return context
class UpdateShareGroupTypeView(forms.ModalFormView):
form_class = sgt_forms.UpdateShareGroupTypeForm
form_id = "update_share_group_type"
template_name = "admin/share_group_types/update.html"
modal_header = _("Update Share Group Type")
modal_id = "update_share_group_type_modal"
submit_label = _("Update")
submit_url = "horizon:admin:share_group_types:update"
success_url = reverse_lazy("horizon:admin:share_group_types:index")
page_title = _("Update Share Group Type")
def get_object(self):
if not hasattr(self, "_object"):
sgt_id = self.kwargs["share_group_type_id"]
try:
self._object = manila.share_group_type_get(
self.request, sgt_id)
except Exception:
msg = _("Unable to retrieve share_gruop_type.")
url = reverse("horizon:admin:share_group_types:index")
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(UpdateShareGroupTypeView, self).get_context_data(
**kwargs)
args = (
self.get_object().id,
)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
share_group_type = self.get_object()
return {
"id": self.kwargs["share_group_type_id"],
"name": share_group_type.name,
"group_specs": share_group_type.group_specs,
}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/panel.py 0000664 0001750 0001750 00000001713 13647271543 026001 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class ShareGroupTypes(horizon.Panel):
name = _("Share Group Types")
slug = 'share_group_types'
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(ShareGroupTypes)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/forms.py 0000664 0001750 0001750 00000013040 13647271543 026024 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.conf import settings
from django.forms import ValidationError
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from manila_ui.api import manila
from manila_ui.dashboards import utils
SGT_GROUP_SPECS_FORM_ATTRS = {
"rows": 5,
"cols": 40,
"style": "height: 135px; width: 100%;", # in case 'rows' not picked up
}
class CreateShareGroupTypeForm(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Name"), required=True)
group_specs = forms.CharField(
required=False, label=_("Group specs"),
widget=forms.widgets.Textarea(attrs=SGT_GROUP_SPECS_FORM_ATTRS))
share_types = forms.MultipleChoiceField(
label=_("Share Types"),
required=True,
widget=forms.SelectMultiple(attrs={
"style": "height: 155px;",
}),
error_messages={
'required': _("At least one share type must be specified.")
})
is_public = forms.BooleanField(
label=_("Public"), required=False, initial=True,
help_text=("Defines whether this share group type is available for "
"all or not. List of allowed tenants should be set "
"separately."))
def __init__(self, request, *args, **kwargs):
super(self.__class__, self).__init__(request, *args, **kwargs)
manila_features = getattr(settings, 'OPENSTACK_MANILA_FEATURES', {})
self.enable_public_share_group_type_creation = manila_features.get(
'enable_public_share_group_type_creation', True)
if not self.enable_public_share_group_type_creation:
self.fields.pop('is_public')
share_type_choices = manila.share_type_list(request)
self.fields['share_types'].choices = [
(choice.id, choice.name) for choice in share_type_choices]
def clean(self):
cleaned_data = super(CreateShareGroupTypeForm, self).clean()
return cleaned_data
def handle(self, request, data):
try:
set_dict, unset_list = utils.parse_str_meta(data['group_specs'])
if unset_list:
msg = _("Expected only pairs of key=value.")
raise ValidationError(message=msg)
is_public = (
self.enable_public_share_group_type_creation and
data["is_public"])
share_group_type = manila.share_group_type_create(
request, data["name"], share_types=data['share_types'],
is_public=is_public)
if set_dict:
manila.share_group_type_set_specs(
request, share_group_type.id, set_dict)
msg = _("Successfully created share group type: "
"%s") % share_group_type.name
messages.success(request, msg)
return True
except ValidationError as e:
# handle error without losing dialog
self.api_error(e.messages[0])
return False
except Exception:
exceptions.handle(request, _('Unable to create share group type.'))
return False
class UpdateShareGroupTypeForm(forms.SelfHandlingForm):
def __init__(self, *args, **kwargs):
super(self.__class__, self).__init__(*args, **kwargs)
# NOTE(vponomaryov): parse existing group specs
# to str view for textarea html element
es_str = ""
for k, v in self.initial["group_specs"].items():
es_str += "%s=%s\r\n" % (k, v)
self.initial["group_specs"] = es_str
group_specs = forms.CharField(
required=False, label=_("Group specs"),
widget=forms.widgets.Textarea(attrs=SGT_GROUP_SPECS_FORM_ATTRS))
def handle(self, request, data):
try:
set_dict, unset_list = utils.parse_str_meta(data['group_specs'])
if set_dict:
manila.share_group_type_set_specs(
request, self.initial["id"], set_dict)
if unset_list:
get = manila.share_group_type_get_specs(
request, self.initial["id"])
# NOTE(vponomaryov): skip keys that are already unset
to_unset = set(unset_list).intersection(set(get.keys()))
if to_unset:
manila.share_group_type_unset_specs(
request, self.initial["id"], to_unset)
msg = _(
"Successfully updated group specs for share group type '%s'.")
msg = msg % self.initial['name']
messages.success(request, msg)
return True
except ValidationError as e:
# handle error without losing dialog
self.api_error(e.messages[0])
return False
except Exception:
msg = _("Unable to update group_specs for share group type.")
exceptions.handle(request, msg)
return False
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/templates/ 0000775 0001750 0001750 00000000000 13647271736 026330 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/templates/share_group_types/ 0000775 0001750 0001750 00000000000 13647271736 032072 5 ustar zuul zuul 0000000 0000000 ././@LongLink 0000000 0000000 0000000 00000000155 00000000000 011216 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/templates/share_group_types/_manage_access.html manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/templates/share_group_types/_manage_acc0000664 0001750 0001750 00000003277 13647271543 034217 0 ustar zuul zuul 0000000 0000000 {% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block form_id %}{% endblock %}
{% block form_action %}{% url 'horizon:admin:share_group_types:manage_access' share_group_type.id %}{% endblock %}
{% block modal_id %}manage_share_group_type_access_modal{% endblock %}
{% block modal-header %}{% trans "Manage Share Group Type Access" %}{% endblock %}
{% block modal-body %}
{% trans "Description" %}:
{% blocktrans trimmed %}
Placeholder for description of share group type access managing form.
{% endblocktrans %}
{% trans "Here can be modified group-specs for share group type." %}
{% trans "One line - one action. Empty strings will be ignored." %}
{% trans "To add group-specs use:" %}
key=value
{% trans "To unset group-specs use:" %}
key
{% trans "All pairs that are in field for left are set for this share group type." %}
{% endblock %}
././@LongLink 0000000 0000000 0000000 00000000154 00000000000 011215 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/templates/share_group_types/manage_access.html manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/templates/share_group_types/manage_acce0000664 0001750 0001750 00000000327 13647271543 034216 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Manage Share Group Type Access" %}{% endblock %}
{% block main %}
{% include 'admin/share_group_types/_manage_access.html' %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/templates/share_group_types/update.html0000664 0001750 0001750 00000000311 13647271543 034231 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Update Share Group Type" %}{% endblock %}
{% block main %}
{% include 'admin/share_group_types/_update.html' %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/templates/share_group_types/index.html 0000664 0001750 0001750 00000000355 13647271543 034066 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Group Types" %}{% endblock %}
{% block main %}
{{ share_group_types_table.render }}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/tables.py 0000664 0001750 0001750 00000007030 13647271543 026152 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
from horizon import tables
from manila_ui.api import manila
class CreateShareGroupType(tables.LinkAction):
name = "create"
verbose_name = _("Create Share Group Type")
url = "horizon:admin:share_group_types:create"
classes = ("ajax-modal", "btn-create")
icon = "plus"
class DeleteShareGroupType(tables.DeleteAction):
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Group Type",
u"Delete Share Group Types",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Group Type",
u"Deleted Share Group Types",
count
)
def delete(self, request, obj_id):
manila.share_group_type_delete(request, obj_id)
class ManageShareGroupTypeAccess(tables.LinkAction):
name = "manage"
verbose_name = _("Manage Share Group Type Access")
url = "horizon:admin:share_group_types:manage_access"
classes = ("ajax-modal", "btn-create")
def allowed(self, request, obj_id):
sgt = manila.share_group_type_get(request, obj_id)
# Enable it only for private share group types
return not sgt.is_public
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "os-share-tenant-attr:tenant_id", None)
return {"project_id": project_id}
class UpdateShareGroupType(tables.LinkAction):
name = "update share group type"
verbose_name = _("Update Share group Type")
url = "horizon:admin:share_group_types:update"
classes = ("ajax-modal", "btn-create")
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "os-share-tenant-attr:tenant_id", None)
return {"project_id": project_id}
class ShareGroupTypesTable(tables.DataTable):
name = tables.WrappingColumn("name", verbose_name=_("Name"))
group_specs = tables.Column("group_specs", verbose_name=_("Group specs"))
share_types = tables.Column("share_types", verbose_name=_("Share types"))
visibility = tables.Column(
"is_public", verbose_name=_("Visibility"),
filters=(lambda d: 'public' if d is True else 'private', ),
)
def get_object_display(self, share_group_type):
return share_group_type.name
def get_object_id(self, share_group_type):
return str(share_group_type.id)
class Meta(object):
name = "share_group_types"
verbose_name = _("Share Group Types")
table_actions = (
tables.NameFilterAction,
CreateShareGroupType,
DeleteShareGroupType,
)
row_actions = (
UpdateShareGroupType,
ManageShareGroupTypeAccess,
DeleteShareGroupType,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/urls.py 0000664 0001750 0001750 00000002524 13647271543 025670 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.conf import urls
from manila_ui.dashboards.admin.share_group_types import views
from manila_ui import features
if features.is_share_groups_enabled():
urlpatterns = [
urls.url(
r'^$',
views.ShareGroupTypesView.as_view(),
name='index'),
urls.url(
r'^create$',
views.CreateShareGroupTypeView.as_view(),
name='create'),
urls.url(
r'^(?P[^/]+)/update$',
views.UpdateShareGroupTypeView.as_view(),
name='update'),
urls.url(
r'^(?P[^/]+)/manage_access$',
views.ManageShareGroupTypeAccessView.as_view(),
name='manage_access'),
]
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/workflows.py 0000664 0001750 0001750 00000011017 13647271543 026735 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import workflows
from openstack_dashboard.api import keystone
from manila_ui.api import manila
class AddProjectAction(workflows.MembershipAction):
def __init__(self, request, *args, **kwargs):
super(AddProjectAction, self).__init__(request, *args, **kwargs)
default_role_field_name = self.get_default_role_field_name()
self.fields[default_role_field_name] = forms.CharField(required=False)
self.fields[default_role_field_name].initial = 'member'
field_name = self.get_member_field_name('member')
self.fields[field_name] = forms.MultipleChoiceField(required=False)
share_group_type_id = self.initial['id']
# Get list of existing projects
try:
projects, __ = keystone.tenant_list(request)
except Exception:
err_msg = _('Unable to get list of projects.')
exceptions.handle(request, err_msg)
# Get list of projects with access to this Share Group Type
try:
share_group_type = manila.share_group_type_get(
request, share_group_type_id)
self.share_group_type_name = share_group_type.name
projects_initial = manila.share_group_type_access_list(
request, share_group_type)
except Exception:
err_msg = _(
'Unable to get information about share group type access.')
exceptions.handle(request, err_msg)
self.fields[field_name].choices = [
(project.id, project.name or project.id) for project in projects]
self.fields[field_name].initial = [
pr.project_id for pr in projects_initial]
self.projects_initial = set(self.fields[field_name].initial)
class Meta(object):
name = _("Projects with access to share group type")
slug = "update_members"
def handle(self, request, context):
context.update({
'name': self.share_group_type_name,
'projects_add': self.projects_allow - self.projects_initial,
'projects_remove': self.projects_initial - self.projects_allow,
})
return context
def clean(self):
cleaned_data = super(AddProjectAction, self).clean()
self.projects_allow = set(
cleaned_data[self.get_member_field_name('member')])
return cleaned_data
class AddProjectStep(workflows.UpdateMembersStep):
action_class = AddProjectAction
available_list_title = _("Available projects")
help_text = _("Allow project access to share group type.")
members_list_title = _("Selected projects")
no_available_text = _("No projects found.")
no_members_text = _("No projects selected.")
depends_on = ("id", )
show_roles = False
class ManageShareGroupTypeAccessWorkflow(workflows.Workflow):
slug = "manage_share_group_type_access"
name = _("Manage Share Group Type Access")
finalize_button_name = _("Manage Share Group Type Access")
success_message = _('Updated access for share group type "%s".')
failure_message = _('Unable to update access for share group type "%s".')
success_url = 'horizon:admin:share_group_types:index'
default_steps = (AddProjectStep, )
def format_status_message(self, message):
return message % self.context['name']
def handle(self, request, context):
try:
for project in self.context['projects_remove']:
manila.share_group_type_access_remove(
request, self.context['id'], project)
for project in self.context['projects_add']:
manila.share_group_type_access_add(
request, self.context['id'], project)
return True
except Exception:
exceptions.handle(request, _('Unable to update share group type.'))
return False
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_types/__init__.py 0000664 0001750 0001750 00000000000 13647271543 026425 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/shares/ 0000775 0001750 0001750 00000000000 13647271736 022055 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/shares/views.py 0000664 0001750 0001750 00000023677 13647271543 023577 0 ustar zuul zuul 0000000 0000000 # 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.
"""
Admin views for managing shares.
"""
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon.utils import memoized
from manila_ui.api import manila
from manila_ui.dashboards.admin.shares import forms as project_forms
from manila_ui.dashboards.admin.shares import tables as s_tables
from manila_ui.dashboards.admin.shares import tabs as s_tabs
from manila_ui.dashboards.admin import utils
from manila_ui.dashboards.project.shares import views as share_views
class SharesView(tables.MultiTableView, share_views.ShareTableMixIn):
table_classes = (
s_tables.SharesTable,
)
template_name = "admin/shares/index.html"
page_title = _("Shares")
@memoized.memoized_method
def get_shares_data(self):
shares = []
try:
shares = manila.share_list(
self.request, search_opts={'all_tenants': True})
snapshots = manila.share_snapshot_list(
self.request, detailed=True, search_opts={'all_tenants': True})
share_ids_with_snapshots = []
for snapshot in snapshots:
share_ids_with_snapshots.append(snapshot.to_dict()['share_id'])
for share in shares:
if share.to_dict()['id'] in share_ids_with_snapshots:
setattr(share, 'has_snapshot', True)
else:
setattr(share, 'has_snapshot', False)
except Exception:
exceptions.handle(
self.request, _('Unable to retrieve share list.'))
# Gather our projects to correlate against IDs
utils.set_project_name_to_objects(self.request, shares)
return shares
class DetailView(share_views.DetailView):
tab_group_class = s_tabs.ShareDetailTabs
template_name = "admin/shares/detail.html"
def get_context_data(self, **kwargs):
context = super(DetailView, self).get_context_data(**kwargs)
context["page_title"] = _("Share Details: %(share_name)s") % {
'share_name': context["share_display_name"]}
return context
class ManageShareView(forms.ModalFormView):
form_class = project_forms.ManageShare
form_id = "manage_share"
template_name = 'admin/shares/manage_share.html'
modal_header = _("Manage Share")
modal_id = "manage_share_modal"
submit_label = _("Manage")
success_url = reverse_lazy('horizon:admin:shares:index')
submit_url = reverse_lazy('horizon:admin:shares:manage')
page_title = _("Manage Share")
def get_context_data(self, **kwargs):
context = super(ManageShareView, self).get_context_data(**kwargs)
return context
class MigrationStartView(forms.ModalFormView):
form_class = project_forms.MigrationStart
template_name = 'admin/shares/migration_start.html'
modal_header = _("Migrate Share")
form_id = "migration_start_share"
modal_id = "migration_start_share_modal"
submit_label = _("Start migration")
success_url = reverse_lazy('horizon:admin:shares:index')
submit_url = 'horizon:admin:shares:migration_start'
cancel_url = reverse_lazy('horizon:admin:shares:index')
page_title = _("Migrate a Share")
def get_context_data(self, **kwargs):
context = super(MigrationStartView, self).get_context_data(**kwargs)
args = (self.kwargs['share_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
@memoized.memoized_method
def get_data(self):
try:
share_id = self.kwargs['share_id']
share = manila.share_get(self.request, share_id)
except Exception:
exceptions.handle(
self.request, _('Unable to retrieve share details.'),
redirect=self.success_url)
return share
def get_initial(self):
share = self.get_data()
return {
'share_id': self.kwargs["share_id"],
'name': share.name,
}
class MigrationCompleteView(forms.ModalFormView):
form_class = project_forms.MigrationComplete
template_name = 'admin/shares/migration_complete.html'
modal_header = _("Confirm Migration Completion of Share")
form_id = "migration_complete_share"
modal_id = "migration_complete_share_modal"
submit_label = _("Complete Migration")
success_url = reverse_lazy('horizon:admin:shares:index')
submit_url = 'horizon:admin:shares:migration_complete'
cancel_url = reverse_lazy('horizon:admin:shares:index')
page_title = _("Complete migration of a Share")
def get_context_data(self, **kwargs):
context = super(MigrationCompleteView, self).get_context_data(**kwargs)
args = (self.kwargs['share_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
@memoized.memoized_method
def get_data(self):
try:
share_id = self.kwargs['share_id']
share = manila.share_get(self.request, share_id)
except Exception:
exceptions.handle(
self.request, _('Unable to retrieve share details.'),
redirect=self.success_url)
return share
def get_initial(self):
share = self.get_data()
return {
'share_id': self.kwargs["share_id"],
'name': share.name,
}
class MigrationCancelView(forms.ModalFormView):
form_class = project_forms.MigrationCancel
template_name = 'admin/shares/migration_cancel.html'
modal_header = _("Confirm Migration Cancelling of Share")
form_id = "migration_cancel_share"
modal_id = "migration_cancel_share_modal"
submit_label = _("Cancel Migration")
success_url = reverse_lazy('horizon:admin:shares:index')
submit_url = 'horizon:admin:shares:migration_cancel'
cancel_url = reverse_lazy('horizon:admin:shares:index')
page_title = _("Cancel migration of a Share")
def get_context_data(self, **kwargs):
context = super(MigrationCancelView, self).get_context_data(**kwargs)
args = (self.kwargs['share_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
@memoized.memoized_method
def get_data(self):
try:
share_id = self.kwargs['share_id']
share = manila.share_get(self.request, share_id)
except Exception:
exceptions.handle(
self.request, _('Unable to retrieve share details.'),
redirect=self.success_url)
return share
def get_initial(self):
share = self.get_data()
return {
'share_id': self.kwargs["share_id"],
'name': share.name,
}
class MigrationGetProgressView(forms.ModalFormView):
form_class = project_forms.MigrationGetProgress
template_name = 'admin/shares/migration_get_progress.html'
modal_header = _("Confirm Obtaining migration progress of Share")
form_id = "migration_get_progress_share"
modal_id = "migration_get_progress_share_modal"
submit_label = _("Obtain Progress")
success_url = reverse_lazy('horizon:admin:shares:index')
submit_url = 'horizon:admin:shares:migration_get_progress'
cancel_url = reverse_lazy('horizon:admin:shares:index')
page_title = _("Obtain migration progress of a Share")
def get_context_data(self, **kwargs):
context = super(MigrationGetProgressView,
self).get_context_data(**kwargs)
args = (self.kwargs['share_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
@memoized.memoized_method
def get_data(self):
try:
share_id = self.kwargs['share_id']
share = manila.share_get(self.request, share_id)
except Exception:
exceptions.handle(
self.request, _('Unable to retrieve share details.'),
redirect=self.success_url)
return share
def get_initial(self):
share = self.get_data()
return {
'share_id': self.kwargs["share_id"],
'name': share.name,
}
class UnmanageShareView(forms.ModalFormView):
form_class = project_forms.UnmanageShare
form_id = "unmanage_share"
template_name = 'admin/shares/unmanage_share.html'
modal_header = _("Confirm Unmanage Share")
modal_id = "unmanage_share_modal"
submit_label = _("Unmanage")
success_url = reverse_lazy('horizon:admin:shares:index')
submit_url = 'horizon:admin:shares:unmanage'
page_title = _("Unmanage Share")
def get_context_data(self, **kwargs):
context = super(UnmanageShareView, self).get_context_data(**kwargs)
args = (self.kwargs['share_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
@memoized.memoized_method
def get_data(self):
try:
share_id = self.kwargs['share_id']
share = manila.share_get(self.request, share_id)
except Exception:
exceptions.handle(
self.request, _('Unable to retrieve volume details.'),
redirect=self.success_url)
return share
def get_initial(self):
share = self.get_data()
return {
'share_id': self.kwargs["share_id"],
'name': share.name,
'host': getattr(share, "host"),
}
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/tabs.py 0000664 0001750 0001750 00000002026 13647271543 023354 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
from horizon import tabs
class ShareOverviewTab(tabs.Tab):
name = _("Share Overview")
slug = "share_overview_tab"
template_name = "admin/shares/_detail.html"
def get_context_data(self, request):
return {"share": self.tab_group.kwargs["share"]}
class ShareDetailTabs(tabs.TabGroup):
slug = "share_details"
tabs = (
ShareOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/panel.py 0000664 0001750 0001750 00000001561 13647271543 023525 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class Shares(horizon.Panel):
name = _("Shares")
slug = "shares"
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(Shares)
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/replicas/ 0000775 0001750 0001750 00000000000 13647271736 023657 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/shares/replicas/views.py 0000664 0001750 0001750 00000013632 13647271543 025367 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2016 Mirantis, 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 django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from manila_ui.api import manila
from manila_ui.dashboards.admin.shares.replicas import (
tables as replicas_tables)
from manila_ui.dashboards.admin.shares.replicas import forms as replicas_forms
from manila_ui.dashboards.admin.shares.replicas import tabs as replicas_tabs
from manila_ui.dashboards.project.shares.replicas import (
views as project_replica_views)
class ManageReplicasView(project_replica_views.ManageReplicasView):
table_class = replicas_tables.ReplicasTable
template_name = 'admin/shares/replicas/manage_replicas.html'
_redirect_url = 'horizon:admin:shares:index'
class DetailReplicaView(project_replica_views.DetailReplicaView):
tab_group_class = replicas_tabs.ReplicaDetailTabs
template_name = 'admin/shares/replicas/detail.html'
_redirect_url = 'horizon:admin:shares:index'
class ResyncReplicaView(forms.ModalFormView):
form_class = replicas_forms.ResyncReplicaForm
form_id = "resync_replica"
template_name = 'admin/shares/replicas/resync_replica.html'
modal_header = _("Resync Replica")
modal_id = "resync_replica_modal"
submit_label = _("Resync")
submit_url = "horizon:admin:shares:resync_replica"
success_url = 'horizon:admin:shares:manage_replicas'
page_title = _("Resync Replica")
def get_success_url(self):
return reverse(self.success_url, args=[self.get_object().share_id])
def get_object(self):
if not hasattr(self, "_object"):
replica_id = self.kwargs["replica_id"]
try:
self._object = manila.share_replica_get(
self.request, replica_id)
except Exception:
msg = _("Unable to retrieve replica '%s'.") % replica_id
url = reverse('horizon:admin:shares:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
context['replica_id'] = self.kwargs['replica_id']
args = (context['replica_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
return {'replica_id': self.kwargs["replica_id"]}
class ResetReplicaStatusView(forms.ModalFormView):
form_class = replicas_forms.ResetReplicaStatusForm
form_id = "reset_replica_status"
template_name = 'admin/shares/replicas/reset_replica_status.html'
modal_header = _("Reset Replica Status")
modal_id = "reset_replica_status_modal"
submit_label = _("Reset status")
submit_url = "horizon:admin:shares:reset_replica_status"
success_url = 'horizon:admin:shares:manage_replicas'
page_title = _("Reset Replica Status")
def get_success_url(self):
return reverse(self.success_url, args=[self.get_object().share_id])
def get_object(self):
if not hasattr(self, "_object"):
replica_id = self.kwargs["replica_id"]
try:
self._object = manila.share_replica_get(
self.request, replica_id)
except Exception:
msg = _("Unable to retrieve replica '%s'.") % replica_id
url = reverse('horizon:admin:shares:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
context['replica_id'] = self.kwargs['replica_id']
args = (context['replica_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
return {'replica_id': self.kwargs["replica_id"]}
class ResetReplicaStateView(forms.ModalFormView):
form_class = replicas_forms.ResetReplicaStateForm
form_id = "reset_replica_state"
template_name = 'admin/shares/replicas/reset_replica_state.html'
modal_header = _("Reset Replica State")
modal_id = "reset_replica_state_modal"
submit_label = _("Reset state")
submit_url = "horizon:admin:shares:reset_replica_state"
success_url = 'horizon:admin:shares:manage_replicas'
page_title = _("Reset Replica State")
def get_success_url(self):
return reverse(self.success_url, args=[self.get_object().share_id])
def get_object(self):
if not hasattr(self, "_object"):
replica_id = self.kwargs["replica_id"]
try:
self._object = manila.share_replica_get(
self.request, replica_id)
except Exception:
msg = _("Unable to retrieve replica '%s'.") % replica_id
url = reverse('horizon:admin:shares:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
context['replica_id'] = self.kwargs['replica_id']
args = (context['replica_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
return {'replica_id': self.kwargs["replica_id"]}
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/replicas/tabs.py 0000664 0001750 0001750 00000002062 13647271543 025156 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2016 Mirantis, 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 django.utils.translation import ugettext_lazy as _
from horizon import tabs
class ReplicaOverviewTab(tabs.Tab):
name = _("Overview")
slug = "overview"
template_name = "admin/shares/replicas/_detail_overview.html"
def get_context_data(self, request):
return {"replica": self.tab_group.kwargs['replica']}
class ReplicaDetailTabs(tabs.TabGroup):
slug = "replica_details"
tabs = (ReplicaOverviewTab,)
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/replicas/forms.py 0000664 0001750 0001750 00000007504 13647271543 025361 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2016 Mirantis, 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 django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from manila_ui.api import manila
class ResyncReplicaForm(forms.SelfHandlingForm):
def handle(self, request, data):
replica_id = self.initial['replica_id']
try:
replica = manila.share_replica_get(self.request, replica_id)
manila.share_replica_resync(request, replica)
message = _("Resync'ing replica '%s'") % replica_id
messages.success(request, message)
return True
except Exception:
redirect = reverse("horizon:admin:shares:index")
exceptions.handle(
request,
_("Unable to resync replica '%s'.") % replica_id,
redirect=redirect)
class ResetReplicaStatusForm(forms.SelfHandlingForm):
replica_status = forms.ChoiceField(
label=_("Replica State"),
required=True,
choices=(
('available', 'available'),
('creating', 'creating'),
('deleting', 'deleting'),
('error', 'error'),
)
)
def handle(self, request, data):
replica_id = self.initial['replica_id']
try:
replica = manila.share_replica_get(self.request, replica_id)
manila.share_replica_reset_status(
request, replica, data["replica_status"])
message = _("Reseting replica ('%(id)s') status from '%(from)s' "
"to '%(to)s'.") % {
"id": replica_id,
"from": replica.replica_state,
"to": data["replica_status"]}
messages.success(request, message)
return True
except Exception:
redirect = reverse("horizon:admin:shares:index")
exceptions.handle(
request,
_("Unable to reset status of replica '%s'.") % replica_id,
redirect=redirect)
class ResetReplicaStateForm(forms.SelfHandlingForm):
replica_state = forms.ChoiceField(
label=_("Replica State"),
required=True,
choices=(
('active', 'active'),
('in_sync', 'in_sync'),
('out_of_sync', 'out_of_sync'),
('error', 'error'),
)
)
def handle(self, request, data):
replica_id = self.initial['replica_id']
try:
replica = manila.share_replica_get(self.request, replica_id)
manila.share_replica_reset_state(
request, replica, data["replica_state"])
message = _("Reseting replica ('%(id)s') state from '%(from)s' "
"to '%(to)s'.") % {
"id": replica_id,
"from": replica.replica_state,
"to": data["replica_state"]}
messages.success(request, message)
return True
except Exception:
redirect = reverse("horizon:admin:shares:index")
exceptions.handle(
request,
_("Unable to reset state of replica '%s'.") % replica_id,
redirect=redirect)
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/replicas/tables.py 0000664 0001750 0001750 00000012040 13647271543 025474 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2016 Mirantis, 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 django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
from horizon import messages
from horizon import tables
from manila_ui.api import manila
from manila_ui.dashboards.project.shares.replicas import (
tables as replica_tables)
DELETABLE_STATUSES = ("error", "available")
class UpdateReplicaRow(tables.Row):
ajax = True
def get_data(self, request, replica_id):
replica = manila.share_replica_get(request, replica_id)
return replica
class ResyncReplica(tables.LinkAction):
name = "resync_replica"
verbose_name = _("Resync replica")
url = "horizon:admin:shares:resync_replica"
classes = ("ajax-modal", "btn-create")
policy_rules = (("share_replica", "share_replica:resync"),)
def allowed(self, request, replica=None):
return True
def get_policy_target(self, request, datum=None):
return {"project_id": getattr(datum, "project_id", None)}
def get_link_url(self, replica):
return reverse(self.url, args=(replica.id,))
class ResetReplicaState(tables.LinkAction):
name = "reset_replica_state"
verbose_name = _("Reset replica state")
url = "horizon:admin:shares:reset_replica_state"
classes = ("ajax-modal", "btn-create")
policy_rules = (("share_replica", "share_replica:reset_replica_state"),)
def allowed(self, request, replica=None):
return True
def get_policy_target(self, request, datum=None):
return {"project_id": getattr(datum, "project_id", None)}
def get_link_url(self, replica):
return reverse(self.url, args=(replica.id,))
class ResetReplicaStatus(tables.LinkAction):
name = "reset_replica_status"
verbose_name = _("Reset replica status")
url = "horizon:admin:shares:reset_replica_status"
classes = ("ajax-modal", "btn-create")
policy_rules = (("share_replica", "share_replica:reset_status"),)
def allowed(self, request, replica=None):
return True
def get_policy_target(self, request, datum=None):
return {"project_id": getattr(datum, "project_id", None)}
def get_link_url(self, replica):
return reverse(self.url, args=(replica.id,))
class DeleteReplica(tables.DeleteAction):
policy_rules = (("share_replica", "share_replica:delete"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Replica",
u"Delete Replicas",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Replica",
u"Deleted Replicas",
count
)
def get_policy_target(self, request, datum=None):
return {"project_id": getattr(datum, "project_id", None)}
def delete(self, request, obj_id):
try:
manila.share_replica_delete(request, obj_id)
except Exception:
msg = _('Unable to delete replica "%s".') % obj_id
messages.error(request, msg)
def allowed(self, request, replica=None):
if replica:
share = manila.share_get(request, replica.share_id)
replicas = manila.share_replica_list(request, replica.share_id)
if share.replication_type is None:
return False
elif (share.replication_type == 'writable' and
replica.status in DELETABLE_STATUSES and
len(replicas) > 1) or (
share.replication_type in ('dr', 'readable') and
replica.status in DELETABLE_STATUSES and
replica.replica_state != 'active'):
return True
return False
def single(self, data_table, request, object_id):
try:
manila.share_replica_delete(request, object_id)
messages.success(
request, _('Share replica %s has been deleted.') % object_id)
except Exception:
msg = _('Unable to delete replica "%s".') % object_id
messages.error(request, msg)
_DETAIL_URL = "horizon:admin:shares:replica_detail"
class ReplicasTable(replica_tables.ReplicasTable):
class Meta(object):
name = "replicas"
verbose_name = _("Replicas")
status_columns = ("status",)
row_class = UpdateReplicaRow
row_actions = (
ResyncReplica,
ResetReplicaState,
ResetReplicaStatus,
DeleteReplica)
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/replicas/__init__.py 0000664 0001750 0001750 00000000000 13647271543 025752 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/shares/forms.py 0000664 0001750 0001750 00000032005 13647271543 023551 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2014 NetApp, 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 django.conf import settings
from django.forms import ValidationError
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from oslo_utils import strutils
from manila_ui.api import manila
from manila_ui.dashboards import utils
def _get_id_if_name_empty(data):
result = data.get('name', None)
if not result:
result = data.get('id')
if not result:
result = ''
return result
class MigrationStart(forms.SelfHandlingForm):
name = forms.CharField(
label=_("Share Name"),
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
share_id = forms.CharField(
label=_("ID"),
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
host = forms.ChoiceField(
label=_("Host to migrate share"),
help_text=_("Destination host and pool where share will be migrated "
"to."))
force_host_assisted_migration = forms.BooleanField(
label=_("Force Host Assisted Migration"),
required=False, initial=False,
help_text=_("Enforces the use of the host-assisted migration approach,"
" which bypasses driver optimizations."))
nondisruptive = forms.BooleanField(
label=_("Nondisruptive"),
required=False, initial=True,
help_text=_("Enforces migration to be nondisruptive. If set to True, "
"host-assisted migration will not be attempted."))
writable = forms.BooleanField(
label=_("Writable"), required=False, initial=True,
help_text=_("Enforces migration to keep the share writable while "
"contents are being moved. If set to True, host-assisted "
"migration will not be attempted."))
preserve_metadata = forms.BooleanField(
label=_("Preserve Metadata"), required=False, initial=True,
help_text=_("Enforces migration to preserve all file metadata when "
"moving its contents. If set to True, host-assisted "
"migration will not be attempted."))
preserve_snapshots = forms.BooleanField(
label=_("Preserve Snapshots"), required=False, initial=True,
help_text=_("Enforces migration of the share snapshots to the "
"destination. If set to True, host-assisted migration will"
" not be attempted."))
new_share_network = forms.ChoiceField(
label=_("New share network to be set in migrated share"),
required=False,
help_text=_('Specify the new share network for the share. Do not '
'specify this parameter if the migrating share has to be '
'retained within its current share network.'))
new_share_type = forms.ChoiceField(
label=_("New share type to be set in migrating share"), required=False,
help_text=_('Specify the new share type for the share. Do not specify '
'this parameter if the migrating share has to be retained '
'with its current share type.'))
def __init__(self, request, *args, **kwargs):
super(MigrationStart, self).__init__(request, *args, **kwargs)
share_networks = manila.share_network_list(request)
share_types = manila.share_type_list(request)
dests = manila.pool_list(request)
dest_choices = [('', '')] + [(d.name, d.name) for d in dests]
st_choices = [('', '')] + [(st.id, st.name) for st in share_types]
sn_choices = (
[('', '')] +
[(sn.id, sn.name or sn.id) for sn in share_networks])
self.fields['host'].choices = dest_choices
self.fields['new_share_type'].choices = st_choices
self.fields['new_share_network'].choices = sn_choices
def handle(self, request, data):
share_name = _get_id_if_name_empty(data)
try:
manila.migration_start(
request, self.initial['share_id'],
force_host_assisted_migration=(
data['force_host_assisted_migration']),
writable=data['writable'],
preserve_metadata=data['preserve_metadata'],
preserve_snapshots=data['preserve_snapshots'],
nondisruptive=data['nondisruptive'],
dest_host=data['host'],
new_share_network_id=data['new_share_network'],
new_share_type_id=data['new_share_type'])
messages.success(
request,
_('Successfully sent the request to migrate share: %s.')
% share_name)
return True
except Exception:
redirect = reverse("horizon:admin:shares:index")
exceptions.handle(
request, _("Unable to migrate share %s.") % share_name,
redirect=redirect)
return False
class MigrationForms(forms.SelfHandlingForm):
name = forms.CharField(
label=_("Share Name"), required=False,
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
share_id = forms.CharField(
label=_("ID"), required=False,
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
class MigrationComplete(MigrationForms):
def handle(self, request, data):
share_name = _get_id_if_name_empty(data)
try:
manila.migration_complete(request, self.initial['share_id'])
messages.success(
request,
_('Successfully sent the request to complete migration of '
' share: %s.') % share_name)
return True
except Exception:
exceptions.handle(request, _("Unable to complete migration "
"of share %s.") % share_name)
return False
class MigrationGetProgress(MigrationForms):
def handle(self, request, data):
share_name = _get_id_if_name_empty(data)
try:
result = manila.migration_get_progress(request,
self.initial['share_id'])
progress = result[1]
messages.success(
request,
_('Migration of share %(name)s is at %(progress)s percent.') %
{'name': share_name, 'progress': progress['total_progress']})
return True
except Exception:
exceptions.handle(request, _("Unable to obtain progress of "
"migration of share %s at this "
"moment.") % share_name)
return False
class MigrationCancel(MigrationForms):
def handle(self, request, data):
share_name = _get_id_if_name_empty(data)
try:
manila.migration_cancel(request, self.initial['share_id'])
messages.success(
request,
_('Successfully sent the request to cancel migration of '
' share: %s.') % share_name)
return True
except Exception:
exceptions.handle(request, _("Unable to cancel migration of share"
" %s at this moment.") % share_name)
return False
class ManageShare(forms.SelfHandlingForm):
name = forms.CharField(
max_length=255, label=_("Share Name"), required=False,
help_text=_("Share name to be assigned"))
description = forms.CharField(
max_length=255, label=_("Description"), required=False,
widget=forms.Textarea(
attrs={'class': 'modal-body-fixed-width', 'rows': 4}))
host = forms.CharField(
max_length=255, label=_("Host of share"), required=True,
help_text=_(
"Host where share is located, example: some.host@driver[#pool]"))
export_location = forms.CharField(
max_length=255, label=_("Export location"), required=True,
help_text=_("Export location of share. Example for NFS: "
"1.2.3.4:/path/to/share"))
protocol = forms.ChoiceField(label=_("Share Protocol"), required=True)
share_type = forms.ChoiceField(label=_("Share Type"), required=True)
driver_options = forms.CharField(
max_length=255, required=False,
label=_("Driver options ('volume_id' for Generic driver, etc...)"),
help_text=_("key=value pairs per line can be set"),
widget=forms.Textarea(
attrs={'class': 'modal-body-fixed-width', 'rows': 2}))
is_public = forms.BooleanField(
label=_("Public"), required=False, initial=False,
help_text=("Defines whether this share is available for all or not."))
def __init__(self, request, *args, **kwargs):
super(ManageShare, self).__init__(request, *args, **kwargs)
share_types = manila.share_type_list(request)
# NOTE(vponomaryov): choose only those share_types that have spec
# 'driver_handles_share_servers' set to 'False' value or alias of it.
dhss_key = 'driver_handles_share_servers'
st_choices = [('', ''), ]
for st in share_types:
dhss = st.to_dict()['extra_specs'].get(dhss_key)
if dhss and dhss.lower() in strutils.FALSE_STRINGS:
st_choices.append((st.name, st.name))
self.fields['share_type'].choices = st_choices
# NOTE(vkmc): choose only those share protocols that are enabled
# FIXME(vkmc): this should be better implemented by having a
# capabilities endpoint on the control plane.
manila_features = getattr(settings, 'OPENSTACK_MANILA_FEATURES', {})
self.enabled_share_protocols = manila_features.get(
'enabled_share_protocols',
['NFS', 'CIFS', 'GlusterFS', 'HDFS', 'CephFS', 'MapRFS'])
self.fields['protocol'].choices = ([(' ', ' ')] +
[(enabled_proto, enabled_proto)
for enabled_proto in
self.enabled_share_protocols])
def handle(self, request, data):
try:
driver_options = data.get('driver_options') or {}
driver_options_error_msg = _(
"Got improper value for field 'driver_options'. "
"Expected only pairs of key=value.")
if driver_options and isinstance(driver_options, str):
try:
set_dict, unset_list = utils.parse_str_meta(driver_options)
if unset_list:
raise ValidationError(message=driver_options_error_msg)
driver_options = set_dict
except ValidationError as e:
self.api_error(e.messages[0])
return False
elif not isinstance(driver_options, dict):
self.api_error(driver_options_error_msg)
return False
manila.share_manage(
request,
service_host=data['host'],
protocol=data['protocol'],
export_path=data['export_location'],
driver_options=driver_options,
share_type=data['share_type'],
name=data['name'],
description=data['description'],
is_public=data['is_public'])
share_name = data.get('name', data.get('id'))
messages.success(
request,
_('Successfully sent the request to manage share: %s')
% share_name)
return True
except Exception:
exceptions.handle(request, _("Unable to manage share"))
return False
class UnmanageShare(forms.SelfHandlingForm):
name = forms.CharField(
label=_("Share Name"), required=False,
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
host = forms.CharField(
label=_("Host"), required=False,
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
share_id = forms.CharField(
label=_("ID"), required=False,
widget=forms.TextInput(attrs={'readonly': 'readonly'}))
def handle(self, request, data):
try:
manila.share_unmanage(request, self.initial['share_id'])
messages.success(
request,
_('Successfully sent the request to unmanage share: %s')
% data['name'])
return True
except Exception:
exceptions.handle(request, _("Unable to unmanage share."))
return False
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/templates/ 0000775 0001750 0001750 00000000000 13647271736 024053 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/shares/templates/shares/ 0000775 0001750 0001750 00000000000 13647271736 025340 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/shares/templates/shares/detail.html 0000664 0001750 0001750 00000000333 13647271543 027463 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Details" %}{% endblock %}
{% block main %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/templates/shares/unmanage_share.html 0000664 0001750 0001750 00000000275 13647271543 031203 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Unmanage Share" %}{% endblock %}
{% block main %}
{% include 'admin/shares/_unmanage_share.html' %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/tables.py 0000664 0001750 0001750 00000012657 13647271543 023710 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import tables
from manila_ui.dashboards.project.shares import tables as shares_tables
from manila_ui import features
class MigrationStartAction(tables.LinkAction):
name = "migration_start"
verbose_name = _("Migrate Share")
url = "horizon:admin:shares:migration_start"
classes = ("ajax-modal",)
policy_rules = (("share", "migration_start"),)
ajax = True
def allowed(self, request, share=None):
if share:
return (share.status.upper() == "AVAILABLE" and
not getattr(share, 'has_snapshot', False) and
features.is_migration_enabled())
return False
class MigrationCompleteAction(tables.LinkAction):
name = "migration_complete"
verbose_name = _("Complete migration")
url = "horizon:admin:shares:migration_complete"
classes = ("ajax-modal",)
policy_rules = (("share", "migration_complete"),)
ajax = True
def allowed(self, request, share=None):
if (share and share.status.upper() == "MIGRATING" and
features.is_migration_enabled()):
return True
return False
class MigrationCancelAction(tables.LinkAction):
name = "migration_cancel"
verbose_name = _("Cancel migration")
url = "horizon:admin:shares:migration_cancel"
classes = ("ajax-modal",)
policy_rules = (("share", "migration_cancel"),)
ajax = True
def allowed(self, request, share=None):
if (share and share.status.upper() == "MIGRATING" and
features.is_migration_enabled()):
return True
return False
class MigrationGetProgressAction(tables.LinkAction):
name = "migration_get_progress"
verbose_name = _("Get migration progress")
url = "horizon:admin:shares:migration_get_progress"
classes = ("ajax-modal",)
policy_rules = (("share", "migration_get_progress"),)
ajax = True
def allowed(self, request, share=None):
if (share and share.status.upper() == "MIGRATING" and
features.is_migration_enabled()):
return True
return False
class ManageShareAction(tables.LinkAction):
name = "manage"
verbose_name = _("Manage Share")
url = "horizon:admin:shares:manage"
classes = ("ajax-modal",)
icon = "plus"
policy_rules = (("share", "share_extension:share_manage"),)
ajax = True
class UnmanageShareAction(tables.LinkAction):
name = "unmanage"
verbose_name = _("Unmanage Share")
url = "horizon:admin:shares:unmanage"
classes = ("ajax-modal",)
icon = "pencil"
policy_rules = (("share", "share_extension:share_unmanage"),)
def allowed(self, request, share=None):
if (not share or share.share_server_id or
share.status.upper() not in shares_tables.DELETABLE_STATES):
return False
elif hasattr(share, 'has_snapshot'):
return not share.has_snapshot
return False
class ManageReplicas(tables.LinkAction):
name = "manage_replicas"
verbose_name = _("Manage Replicas")
url = "horizon:admin:shares:manage_replicas"
classes = ("btn-edit",)
policy_rules = (("share", "share:replica_get_all"),)
def allowed(self, request, share):
share_replication_enabled = share.replication_type is not None
return features.is_replication_enabled() and share_replication_enabled
class SharesTable(shares_tables.SharesTable):
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:admin:shares:detail")
host = tables.Column("host", verbose_name=_("Host"))
project = tables.Column("project_name", verbose_name=_("Project"))
def get_share_server_link(share):
if getattr(share, 'share_server_id', None):
return reverse("horizon:admin:share_servers:share_server_detail",
args=(share.share_server_id,))
else:
return None
share_server = tables.Column(
"share_server_id",
verbose_name=_("Share Server"),
link=get_share_server_link)
class Meta(object):
name = "shares"
verbose_name = _("Shares")
status_columns = ["status"]
row_class = shares_tables.UpdateRow
table_actions = (
tables.NameFilterAction,
ManageShareAction,
shares_tables.DeleteShare,
)
row_actions = (
ManageReplicas,
MigrationStartAction,
MigrationCompleteAction,
MigrationGetProgressAction,
MigrationCancelAction,
UnmanageShareAction,
shares_tables.DeleteShare,
)
columns = [
'tenant', 'host', 'name', 'size', 'status', 'visibility',
'share_type', 'protocol', 'share_server',
]
if features.is_share_groups_enabled():
columns.append('share_group_id')
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/urls.py 0000664 0001750 0001750 00000005433 13647271543 023415 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.dashboards.admin.shares.replicas import views as replica_views
from manila_ui.dashboards.admin.shares import views
from manila_ui import features
urlpatterns = [
urls.url(
r'^$',
views.SharesView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)/$',
views.DetailView.as_view(),
name='detail'),
urls.url(
r'^manage$',
views.ManageShareView.as_view(),
name='manage'),
urls.url(
r'^unmanage/(?P[^/]+)$',
views.UnmanageShareView.as_view(),
name='unmanage'),
]
if features.is_replication_enabled():
urlpatterns.extend([
urls.url(
r'^(?P[^/]+)/replicas/$',
replica_views.ManageReplicasView.as_view(),
name='manage_replicas'),
urls.url(
r'^replica/(?P[^/]+)$',
replica_views.DetailReplicaView.as_view(),
name='replica_detail'),
urls.url(
r'^replica/(?P[^/]+)/resync_replica$',
replica_views.ResyncReplicaView.as_view(),
name='resync_replica'),
urls.url(
r'^replica/(?P[^/]+)/reset_replica_status$',
replica_views.ResetReplicaStatusView.as_view(),
name='reset_replica_status'),
urls.url(
r'^replica/(?P[^/]+)/reset_replica_state$',
replica_views.ResetReplicaStateView.as_view(),
name='reset_replica_state'),
])
if features.is_migration_enabled():
urlpatterns.extend([
urls.url(
r'^migration_start/(?P[^/]+)$',
views.MigrationStartView.as_view(),
name='migration_start'),
urls.url(
r'^migration_complete/(?P[^/]+)$',
views.MigrationCompleteView.as_view(),
name='migration_complete'),
urls.url(
r'^migration_cancel/(?P[^/]+)$',
views.MigrationCancelView.as_view(),
name='migration_cancel'),
urls.url(
r'^migration_get_progress/(?P[^/]+)$',
views.MigrationGetProgressView.as_view(),
name='migration_get_progress'),
])
manila-ui-3.0.0/manila_ui/dashboards/admin/shares/__init__.py 0000664 0001750 0001750 00000000000 13647271543 024150 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/ 0000775 0001750 0001750 00000000000 13647271736 023626 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/views.py 0000664 0001750 0001750 00000005400 13647271543 025330 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
"""
Admin views for managing share networks.
"""
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tables
from horizon.utils import memoized
from openstack_dashboard.api import base
from openstack_dashboard.api import neutron
from manila_ui.api import manila
from manila_ui.dashboards.admin.share_networks import tables as sn_tables
from manila_ui.dashboards.admin.share_networks import tabs as sn_tabs
from manila_ui.dashboards.admin import utils
from manila_ui.dashboards.project.share_networks import views as p_views
class ShareNetworksView(tables.MultiTableView):
table_classes = (
sn_tables.ShareNetworksTable,
)
template_name = "admin/share_networks/index.html"
page_title = _("Share Networks")
@memoized.memoized_method
def get_share_networks_data(self):
try:
share_networks = manila.share_network_list(
self.request, detailed=True, search_opts={'all_tenants': True})
if base.is_service_enabled(self.request, 'network'):
neutron_net_names = dict(
(net.id, net.name)
for net in neutron.network_list(self.request))
neutron_subnet_names = dict(
(net.id, net.name)
for net in neutron.subnet_list(self.request))
for sn in share_networks:
sn.neutron_net = neutron_net_names.get(
sn.neutron_net_id) or sn.neutron_net_id or "-"
sn.neutron_subnet = neutron_subnet_names.get(
sn.neutron_subnet_id) or sn.neutron_subnet_id or "-"
except Exception:
share_networks = []
exceptions.handle(
self.request, _("Unable to retrieve share networks"))
utils.set_project_name_to_objects(self.request, share_networks)
return share_networks
class ShareNetworkDetailView(p_views.Detail):
tab_group_class = sn_tabs.ShareNetworkDetailTabs
template_name = "admin/share_networks/detail.html"
redirect_url = reverse_lazy("horizon:admin:share_networks:index")
manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/tabs.py 0000664 0001750 0001750 00000002133 13647271543 025124 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
from horizon import tabs
class ShareNetworkOverviewTab(tabs.Tab):
name = _("Share Network Overview")
slug = "share_network_overview_tab"
template_name = "admin/share_networks/_detail.html"
def get_context_data(self, request):
return {"share_network": self.tab_group.kwargs["share_network"]}
class ShareNetworkDetailTabs(tabs.TabGroup):
slug = "share_network_details"
tabs = (
ShareNetworkOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/panel.py 0000664 0001750 0001750 00000001652 13647271543 025277 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class ShareNetworks(horizon.Panel):
name = _("Share Networks")
slug = 'share_networks'
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(ShareNetworks)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/templates/ 0000775 0001750 0001750 00000000000 13647271736 025624 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/templates/share_networks/ 0000775 0001750 0001750 00000000000 13647271736 030662 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/templates/share_networks/detail.html 0000664 0001750 0001750 00000000343 13647271543 033006 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Network Details" %}{% endblock %}
{% block main %}
{% for sec_service in share_network.sec_services %}
{% url 'horizon:admin:security_services:security_service_detail' sec_service.id as sec_service_url%}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/tables.py 0000664 0001750 0001750 00000003546 13647271543 025456 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 tables
import manila_ui.dashboards.project.share_networks.tables as sn_tables
class ShareNetworksTable(tables.DataTable):
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:admin:share_networks:share_network_detail")
project = tables.Column("project_name", verbose_name=_("Project"))
neutron_net = tables.Column("neutron_net", verbose_name=_("Neutron Net"))
neutron_subnet = tables.Column(
"neutron_subnet", verbose_name=_("Neutron Subnet"))
ip_version = tables.Column("ip_version", verbose_name=_("IP Version"))
network_type = tables.Column(
"network_type", verbose_name=_("Network Type"))
segmentation_id = tables.Column(
"segmentation_id", verbose_name=_("Segmentation Id"))
def get_object_display(self, share_network):
return share_network.name or str(share_network.id)
def get_object_id(self, share_network):
return str(share_network.id)
class Meta(object):
name = "share_networks"
verbose_name = _("Share Networks")
table_actions = (
tables.NameFilterAction,
sn_tables.Delete,
)
row_class = sn_tables.UpdateRow
row_actions = (
sn_tables.Delete,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/urls.py 0000664 0001750 0001750 00000001575 13647271543 025171 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.dashboards.admin.share_networks import views
urlpatterns = [
urls.url(
r'^$',
views.ShareNetworksView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)$',
views.ShareNetworkDetailView.as_view(),
name='share_network_detail'),
]
manila-ui-3.0.0/manila_ui/dashboards/admin/share_networks/__init__.py 0000664 0001750 0001750 00000000000 13647271543 025721 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/ 0000775 0001750 0001750 00000000000 13647271736 025210 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/views.py 0000664 0001750 0001750 00000013122 13647271543 026712 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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.
"""
Admin views for managing share group snapshots.
"""
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import tabs
from horizon.utils import memoized
from manila_ui.api import manila
import manila_ui.dashboards.admin.share_group_snapshots.forms as sgs_forms
import manila_ui.dashboards.admin.share_group_snapshots.tables as sgs_tables
import manila_ui.dashboards.admin.share_group_snapshots.tabs as sgs_tabs
class ShareGroupSnapshotsView(tables.MultiTableView):
table_classes = (
sgs_tables.ShareGroupSnapshotsTable,
)
template_name = "admin/share_group_snapshots/index.html"
page_title = _("Share Group Snapshots")
@memoized.memoized_method
def get_share_group_snapshots_data(self):
share_group_snapshots = []
try:
share_group_snapshots = manila.share_group_snapshot_list(
self.request, search_opts={'all_tenants': True})
share_groups = manila.share_group_list(self.request)
sg_names = dict([(sg.id, sg.name or sg.id) for sg in share_groups])
for snapshot in share_group_snapshots:
snapshot.share_group = sg_names.get(snapshot.share_group_id)
except Exception:
msg = _("Unable to retrieve share group snapshot list.")
exceptions.handle(self.request, msg)
return share_group_snapshots
class ShareGroupSnapshotDetailView(tabs.TabView):
tab_group_class = sgs_tabs.ShareGroupSnapshotDetailTabs
template_name = "admin/share_group_snapshots/detail.html"
redirect_url = reverse_lazy("horizon:admin:share_group_snapshots:index")
def get_context_data(self, **kwargs):
context = super(ShareGroupSnapshotDetailView, self).get_context_data(
**kwargs)
snapshot = self.get_data()
snapshot_display_name = snapshot.name or snapshot.id
context["snapshot"] = snapshot
context["snapshot_display_name"] = snapshot_display_name
context["page_title"] = _(
"Share Group Snapshot Details: %(sgs_display_name)s") % (
{'sgs_display_name': snapshot_display_name})
return context
@memoized.memoized_method
def get_data(self):
try:
share_group_snapshot = manila.share_group_snapshot_get(
self.request, self.kwargs['share_group_snapshot_id'])
sg = manila.share_group_get(
self.request, share_group_snapshot.share_group_id)
share_group_snapshot.sg_name_or_id = sg.name or sg.id
except Exception:
exceptions.handle(
self.request,
_('Unable to retrieve share group snapshot details.'),
redirect=self.redirect_url)
return share_group_snapshot
def get_tabs(self, request, *args, **kwargs):
return self.tab_group_class(
request, share_group_snapshot=self.get_data(), **kwargs)
class ResetShareGroupSnapshotStatusView(forms.ModalFormView):
form_class = sgs_forms.ResetShareGroupSnapshotStatusForm
form_id = "reset_share_group_snapshot_status"
template_name = 'admin/share_group_snapshots/reset_status.html'
modal_header = _("Reset Status")
modal_id = "reset_share_group_snapshot_status_modal"
submit_label = _("Reset status")
submit_url = "horizon:admin:share_group_snapshots:reset_status"
success_url = reverse_lazy("horizon:admin:share_group_snapshots:index")
page_title = _("Reset Share Group Snapshot Status")
def get_object(self):
if not hasattr(self, "_object"):
s_id = self.kwargs["share_group_snapshot_id"]
try:
self._object = manila.share_group_snapshot_get(
self.request, s_id)
except Exception:
msg = _("Unable to retrieve share group snapshot '%s'.") % s_id
url = reverse('horizon:admin:share_group_snapshots:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
sgs = self.get_object()
context['share_group_snapshot_id'] = self.kwargs[
'share_group_snapshot_id']
context['share_group_snapshot_name'] = sgs.name or sgs.id
context['share_group_snapshot_status'] = sgs.status
context['share_group_id'] = sgs.share_group_id
context['submit_url'] = reverse(
self.submit_url, args=(context['share_group_snapshot_id'], ))
return context
def get_initial(self):
sgs = self.get_object()
return {
"share_group_snapshot_id": self.kwargs["share_group_snapshot_id"],
"share_group_snapshot_name": sgs.name or sgs.id,
"share_group_snapshot_status": sgs.status,
"share_group_id": sgs.share_group_id,
}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/tabs.py 0000664 0001750 0001750 00000002273 13647271543 026513 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
from horizon import tabs
class ShareGroupSnapshotOverviewTab(tabs.Tab):
name = _("Share Group Snapshot Overview")
slug = "share_group_snapshot_overview_tab"
template_name = "admin/share_group_snapshots/_detail.html"
def get_context_data(self, request):
return {"share_group_snapshot": self.tab_group.kwargs[
"share_group_snapshot"]}
class ShareGroupSnapshotDetailTabs(tabs.TabGroup):
slug = "share_group_snapshot_details"
tabs = (
ShareGroupSnapshotOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/panel.py 0000664 0001750 0001750 00000001733 13647271543 026661 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class ShareGroupSnapshots(horizon.Panel):
name = _("Share Group Snapshots")
slug = 'share_group_snapshots'
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(ShareGroupSnapshots)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/forms.py 0000664 0001750 0001750 00000003720 13647271543 026706 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2017 Mirantis, 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 django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from manila_ui.api import manila
class ResetShareGroupSnapshotStatusForm(forms.SelfHandlingForm):
status = forms.ChoiceField(
label=_("Status"),
required=True,
choices=(
('available', 'available'),
('error', 'error'),
)
)
def handle(self, request, data):
s_id = self.initial['share_group_snapshot_id']
try:
manila.share_group_snapshot_reset_state(
request, s_id, data["status"])
message = _(
"Reseting share group snapshot ('%(id)s') status "
"from '%(from)s' to '%(to)s'.") % {
"id": self.initial['share_group_snapshot_name'] or s_id,
"from": self.initial['share_group_snapshot_status'],
"to": data["status"]}
messages.success(request, message)
return True
except Exception:
redirect = reverse("horizon:admin:share_group_snapshots:index")
exceptions.handle(
request,
_("Unable to reset status of share group snapshot "
"'%s'.") % s_id,
redirect=redirect)
return False
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/templates/ 0000775 0001750 0001750 00000000000 13647271736 027206 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/templates/share_group_snapshots/ 0000775 0001750 0001750 00000000000 13647271736 033626 5 ustar zuul zuul 0000000 0000000 ././@LongLink 0000000 0000000 0000000 00000000163 00000000000 011215 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/templates/share_group_snapshots/reset_status.html manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/templates/share_group_snapshots/res0000664 0001750 0001750 00000000335 13647271543 034337 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Reset Share Group Snapshot Status" %}{% endblock %}
{% block main %}
{% include 'admin/share_group_snapshots/_reset_status.html' %}
{% endblock %}
././@LongLink 0000000 0000000 0000000 00000000155 00000000000 011216 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/templates/share_group_snapshots/detail.html manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/templates/share_group_snapshots/det0000664 0001750 0001750 00000000352 13647271543 034321 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Group Snapshot Details" %}{% endblock %}
{% block main %}
"Reset status of '{{ share_group_snapshot_name }}' share group snapshot."
{% endblock %}
././@LongLink 0000000 0000000 0000000 00000000154 00000000000 011215 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/templates/share_group_snapshots/index.html manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/templates/share_group_snapshots/ind0000664 0001750 0001750 00000000365 13647271543 034323 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Group Snapshots" %}{% endblock %}
{% block main %}
{{ share_group_snapshots_table.render }}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/tables.py 0000664 0001750 0001750 00000010705 13647271543 027033 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.template.defaultfilters import title
from django.urls import reverse
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 tables
from horizon.utils import filters
from manila_ui.api import manila
class ShareGroupSnapshotShareGroupNameColumn(tables.Column):
def get_link_url(self, snapshot):
return reverse(self.link, args=(snapshot.share_group_id,))
class DeleteShareGroupSnapshot(tables.DeleteAction):
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Group Snapshot",
u"Delete Share Group Snapshots",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Group Snapshot",
u"Deleted Share Group Snapshots",
count
)
def delete(self, request, obj_id):
obj = self.table.get_object_by_id(obj_id)
name = self.table.get_object_display(obj)
try:
manila.share_group_snapshot_delete(request, obj_id)
except Exception:
msg = _('Unable to delete share group snapshot "%s". '
'One or more share groups depend on it.')
exceptions.handle(self.request, msg % name)
raise
def allowed(self, request, snapshot=None):
if snapshot:
return snapshot.status.lower() in ('available', 'error')
return True
class ResetShareGroupSnapshotStatus(tables.LinkAction):
name = "reset_share_group_snapshot_status"
verbose_name = _("Reset status")
url = "horizon:admin:share_group_snapshots:reset_status"
classes = ("ajax-modal", "btn-create")
def allowed(self, request, share_group=None):
return True
class UpdateShareGroupSnapshotRow(tables.Row):
ajax = True
def get_data(self, request, share_group_snapshot_id):
snapshot = manila.share_group_snapshot_get(
request, share_group_snapshot_id)
if not snapshot.name:
snapshot.name = share_group_snapshot_id
return snapshot
class ShareGroupSnapshotsTable(tables.DataTable):
STATUS_CHOICES = (
("available", True),
("creating", None),
("error", False),
)
STATUS_DISPLAY_CHOICES = (
("available",
pgettext_lazy("Current status of snapshot", u"Available")),
("creating", pgettext_lazy("Current status of snapshot", u"Creating")),
("error", pgettext_lazy("Current status of snapshot", u"Error")),
)
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:admin:share_group_snapshots:detail")
description = tables.Column(
"description",
verbose_name=_("Description"),
truncate=40)
created_at = tables.Column(
"created_at",
verbose_name=_("Created at"),
filters=(
filters.parse_isotime,
))
status = tables.Column(
"status",
filters=(title,),
verbose_name=_("Status"),
status=True,
status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES)
source = ShareGroupSnapshotShareGroupNameColumn(
"share_group",
verbose_name=_("Source"),
link="horizon:admin:share_groups:detail")
def get_object_display(self, obj):
return obj.name
class Meta(object):
name = "share_group_snapshots"
verbose_name = _("Share Group Snapshots")
status_columns = ["status"]
row_class = UpdateShareGroupSnapshotRow
table_actions = (
tables.NameFilterAction,
DeleteShareGroupSnapshot,
)
row_actions = (
ResetShareGroupSnapshotStatus,
DeleteShareGroupSnapshot,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/urls.py 0000664 0001750 0001750 00000002346 13647271543 026550 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.conf import urls
from manila_ui.dashboards.admin.share_group_snapshots import views
from manila_ui import features
if features.is_share_groups_enabled():
urlpatterns = [
urls.url(
r'^$',
views.ShareGroupSnapshotsView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)/$',
views.ShareGroupSnapshotDetailView.as_view(),
name='detail'),
urls.url(
r'^(?P[^/]+)/reset_status$',
views.ResetShareGroupSnapshotStatusView.as_view(),
name='reset_status'),
]
manila-ui-3.0.0/manila_ui/dashboards/admin/share_group_snapshots/__init__.py 0000664 0001750 0001750 00000000000 13647271543 027303 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/ 0000775 0001750 0001750 00000000000 13647271736 023741 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/views.py 0000664 0001750 0001750 00000006261 13647271543 025451 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
"""
Admin views for managing share instances.
"""
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tables
from horizon import tabs
from horizon.utils import memoized
from manila_ui.api import manila
from manila_ui.dashboards.admin.share_instances import tables as si_tables
from manila_ui.dashboards.admin.share_instances import tabs as si_tabs
from manila_ui.dashboards import utils as ui_utils
class ShareInstancesView(tables.MultiTableView):
table_classes = (
si_tables.ShareInstancesTable,
)
template_name = "admin/share_instances/index.html"
page_title = _("Share Instances")
@memoized.memoized_method
def get_share_instances_data(self):
try:
share_instances = manila.share_instance_list(self.request)
except Exception:
share_instances = []
exceptions.handle(
self.request, _("Unable to retrieve share instances."))
return share_instances
class ShareInstanceDetailView(tabs.TabView):
tab_group_class = si_tabs.ShareInstanceDetailTabs
template_name = 'admin/share_instances/detail.html'
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
share_instance = self.get_data()
context["share_instance"] = share_instance
context["page_title"] = (
_("Share Instance Details: %s") % share_instance.id)
return context
@memoized.memoized_method
def get_data(self):
try:
share_instance_id = self.kwargs['share_instance_id']
share_instance = manila.share_instance_get(
self.request, share_instance_id)
share_instance.export_locations = (
manila.share_instance_export_location_list(
self.request, share_instance_id))
export_locations = [
exp['path'] for exp in share_instance.export_locations
]
share_instance.el_size = ui_utils.calculate_longest_str_size(
export_locations)
return share_instance
except Exception:
redirect = reverse('horizon:admin:share_instances:index')
exceptions.handle(
self.request,
_('Unable to retrieve share instance details.'),
redirect=redirect)
def get_tabs(self, request, *args, **kwargs):
share_instance = self.get_data()
return self.tab_group_class(
request, share_instance=share_instance, **kwargs)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/tabs.py 0000664 0001750 0001750 00000002144 13647271543 025241 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
from horizon import tabs
class ShareInstanceOverviewTab(tabs.Tab):
name = _("Share Instance Overview")
slug = "share_instance_overview_tab"
template_name = "admin/share_instances/_detail.html"
def get_context_data(self, request):
return {"share_instance": self.tab_group.kwargs["share_instance"]}
class ShareInstanceDetailTabs(tabs.TabGroup):
slug = "share_instance_details"
tabs = (
ShareInstanceOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/panel.py 0000664 0001750 0001750 00000001656 13647271543 025416 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class ShareInstances(horizon.Panel):
name = _("Share Instances")
slug = 'share_instances'
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(ShareInstances)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/templates/ 0000775 0001750 0001750 00000000000 13647271736 025737 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/templates/share_instances/ 0000775 0001750 0001750 00000000000 13647271736 031110 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/templates/share_instances/detail.html 0000664 0001750 0001750 00000000344 13647271543 033235 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Instance Details" %}{% endblock %}
{% block main %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/tables.py 0000664 0001750 0001750 00000006234 13647271543 025566 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import tables
class ShareInstancesTable(tables.DataTable):
STATUS_CHOICES = (
("available", True),
("creating", None),
("deleting", None),
("error", False),
("error_deleting", False),
)
STATUS_DISPLAY_CHOICES = (
("available", u"Available"),
("creating", u"Creating"),
("deleting", u"Deleting"),
("error", u"Error"),
("error_deleting", u"Error deleting"),
)
uuid = tables.Column(
"id", verbose_name=_("ID"),
link="horizon:admin:share_instances:share_instance_detail")
host = tables.Column("host", verbose_name=_("Host"))
status = tables.Column(
"status",
verbose_name=_("Status"),
status=True,
status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES)
availability_zone = tables.Column(
"availability_zone", verbose_name=_("Availability Zone"))
class Meta(object):
name = "share_instances"
verbose_name = _("Share Instances")
status_columns = ("status", )
table_actions = (
tables.NameFilterAction,)
multi_select = False
def get_share_network_link(share_instance):
if getattr(share_instance, 'share_network_id', None):
return reverse("horizon:admin:share_networks:share_network_detail",
args=(share_instance.share_network_id,))
else:
return None
def get_share_server_link(share_instance):
if getattr(share_instance, 'share_server_id', None):
return reverse("horizon:admin:share_servers:share_server_detail",
args=(share_instance.share_server_id,))
else:
return None
def get_share_link(share_instance):
if getattr(share_instance, 'share_id', None):
return reverse("horizon:admin:shares:detail",
args=(share_instance.share_id,))
else:
return None
share_net_id = tables.Column(
"share_network_id",
verbose_name=_("Share Network"),
link=get_share_network_link)
share_server_id = tables.Column(
"share_server_id",
verbose_name=_("Share Server Id"),
link=get_share_server_link)
share_id = tables.Column(
"share_id",
verbose_name=_("Share ID"),
link=get_share_link)
def get_object_display(self, share_instance):
return str(share_instance.id)
def get_object_id(self, share_instance):
return str(share_instance.id)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/urls.py 0000664 0001750 0001750 00000001602 13647271543 025273 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.dashboards.admin.share_instances import views
urlpatterns = [
urls.url(
r'^$',
views.ShareInstancesView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)$',
views.ShareInstanceDetailView.as_view(),
name='share_instance_detail'),
]
manila-ui-3.0.0/manila_ui/dashboards/admin/share_instances/__init__.py 0000664 0001750 0001750 00000000000 13647271543 026034 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/ 0000775 0001750 0001750 00000000000 13647271736 023443 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/views.py 0000664 0001750 0001750 00000006710 13647271543 025152 0 ustar zuul zuul 0000000 0000000 # 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.
"""
Admin views for managing share servers.
"""
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tables
from horizon import tabs
from horizon.utils import memoized
from manila_ui.api import manila
from manila_ui.dashboards.admin.share_servers import tables as ss_tables
from manila_ui.dashboards.admin.share_servers import tabs as ss_tabs
from manila_ui.dashboards.admin import utils
class ShareServersView(tables.MultiTableView):
table_classes = (
ss_tables.ShareServersTable,
)
template_name = "admin/share_servers/index.html"
page_title = _("Share Servers")
@memoized.memoized_method
def get_share_servers_data(self):
try:
share_servers = manila.share_server_list(self.request)
except Exception:
share_servers = []
exceptions.handle(
self.request, _("Unable to retrieve share servers"))
utils.set_project_name_to_objects(self.request, share_servers)
return share_servers
class ShareServerDetailView(tabs.TabView):
tab_group_class = ss_tabs.ShareServerDetailTabs
template_name = "admin/share_servers/detail.html"
redirect_url = reverse_lazy('horizon:admin:share_servers:index')
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
share_server = self.get_data()
share_server_display_name = share_server.id
context["share_server"] = share_server
context["share_server_display_name"] = share_server_display_name
context["page_title"] = _("Share Server Details: %(server_name)s") % {
'server_name': share_server_display_name}
return context
@memoized.memoized_method
def get_data(self):
try:
share_serv_id = self.kwargs['share_server_id']
share_serv = manila.share_server_get(self.request, share_serv_id)
share_search_opts = {'share_server_id': share_serv.id}
shares_list = manila.share_list(
self.request, search_opts=share_search_opts)
for share in shares_list:
share.name_or_id = share.name or share.id
share_serv.shares_list = shares_list
if not hasattr(share_serv, 'share_network_id'):
share_serv.share_network_id = None
except Exception:
redirect = reverse('horizon:admin:share_servers:index')
exceptions.handle(
self.request,
_('Unable to retrieve share server details.'),
redirect=redirect)
return share_serv
def get_tabs(self, request, *args, **kwargs):
share_server = self.get_data()
return self.tab_group_class(
request, share_server=share_server, **kwargs)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/tabs.py 0000664 0001750 0001750 00000002130 13647271543 024736 0 ustar zuul zuul 0000000 0000000 # Copyright 2014 OpenStack Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 tabs
class ShareServerOverviewTab(tabs.Tab):
name = _("Share Server Overview")
slug = "share_server_overview_tab"
template_name = "admin/share_servers/_detail.html"
def get_context_data(self, request):
return {"share_server": self.tab_group.kwargs["share_server"]}
class ShareServerDetailTabs(tabs.TabGroup):
slug = "share_server_details"
tabs = (
ShareServerOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/panel.py 0000664 0001750 0001750 00000001646 13647271543 025117 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class ShareServers(horizon.Panel):
name = _("Share Servers")
slug = 'share_servers'
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(ShareServers)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/templates/ 0000775 0001750 0001750 00000000000 13647271736 025441 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/templates/share_servers/ 0000775 0001750 0001750 00000000000 13647271736 030314 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/templates/share_servers/detail.html 0000664 0001750 0001750 00000000342 13647271543 032437 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Server Details" %}{% endblock %}
{% block main %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/tables.py 0000664 0001750 0001750 00000007570 13647271543 025274 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.template.defaultfilters import title
from django.urls import reverse
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 manila_ui.api import manila
class DeleteShareServer(tables.DeleteAction):
policy_rules = (("share", "share_server:delete"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Server",
u"Delete Share Server",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Server",
u"Deleted Share Server",
count
)
def delete(self, request, obj_id):
manila.share_server_delete(request, obj_id)
def allowed(self, request, share_serv):
if share_serv:
share_search_opts = {'share_server_id': share_serv.id}
shares_list = manila.share_list(
request, search_opts=share_search_opts)
if shares_list:
return False
return share_serv.status not in ("deleting", "creating")
return True
class UpdateShareServerRow(tables.Row):
ajax = True
def get_data(self, request, share_serv_id):
share_serv = manila.share_server_get(request, share_serv_id)
return share_serv
class ShareServersTable(tables.DataTable):
STATUS_CHOICES = (
("active", True),
("deleting", None),
("creating", None),
("error", False),
)
STATUS_DISPLAY_CHOICES = (
("in-use", pgettext_lazy("Current status of share server", u"In-use")),
("active", pgettext_lazy("Current status of share server", u"Active")),
("creating", pgettext_lazy("Current status of share server",
u"Creating")),
("error", pgettext_lazy("Current status of share server",
u"Error")),
)
uid = tables.Column(
"id", verbose_name=_("Id"),
link="horizon:admin:share_servers:share_server_detail")
host = tables.Column("host", verbose_name=_("Host"))
project = tables.Column("project_name", verbose_name=_("Project"))
def get_share_server_link(share_serv):
if hasattr(share_serv, 'share_network_id'):
return reverse("horizon:admin:share_networks:share_network_detail",
args=(share_serv.share_network_id,))
else:
return None
share_net_name = tables.Column(
"share_network_name", verbose_name=_("Share Network"),
link=get_share_server_link)
status = tables.Column(
"status", verbose_name=_("Status"),
status=True, filters=(title,), status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES)
def get_object_display(self, share_server):
return str(share_server.id)
def get_object_id(self, share_server):
return str(share_server.id)
class Meta(object):
name = "share_servers"
status_columns = ["status"]
verbose_name = _("Share Server")
table_actions = (
tables.NameFilterAction,
DeleteShareServer,
)
row_class = UpdateShareServerRow
row_actions = (
DeleteShareServer,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/urls.py 0000664 0001750 0001750 00000001570 13647271543 025001 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.dashboards.admin.share_servers import views
urlpatterns = [
urls.url(
r'^$',
views.ShareServersView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)$',
views.ShareServerDetailView.as_view(),
name='share_server_detail'),
]
manila-ui-3.0.0/manila_ui/dashboards/admin/share_servers/__init__.py 0000664 0001750 0001750 00000000000 13647271543 025536 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/ 0000775 0001750 0001750 00000000000 13647271736 023116 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/views.py 0000664 0001750 0001750 00000010374 13647271543 024626 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Admin views for managing share types.
"""
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon.utils import memoized
from horizon import workflows
from manila_ui.api import manila
from manila_ui.dashboards.admin.share_types import forms as project_forms
from manila_ui.dashboards.admin.share_types import tables as st_tables
import manila_ui.dashboards.admin.share_types.workflows as st_workflows
from manila_ui.dashboards import utils as common_utils
class ShareTypesView(tables.MultiTableView):
table_classes = (
st_tables.ShareTypesTable,
)
template_name = "admin/share_types/index.html"
page_title = _("Share Types")
@memoized.memoized_method
def get_share_types_data(self):
try:
share_types = manila.share_type_list(self.request)
except Exception:
exceptions.handle(
self.request, _('Unable to retrieve share types.'))
return []
# Convert dict with extra specs to friendly view
for st in share_types:
st.extra_specs = common_utils.metadata_to_str(
st.extra_specs, 8, 45)
return share_types
class CreateShareTypeView(forms.ModalFormView):
form_class = project_forms.CreateShareType
form_id = "create_share_type"
template_name = 'admin/share_types/create.html'
modal_header = _("Create Share Type")
modal_id = "create_share_type_modal"
submit_label = _("Create")
submit_url = reverse_lazy("horizon:admin:share_types:create_type")
success_url = reverse_lazy('horizon:admin:share_types:index')
page_title = _("Create Share Type")
class ManageShareTypeAccessView(workflows.WorkflowView):
workflow_class = st_workflows.ManageShareTypeAccessWorkflow
template_name = "admin/share_types/manage_access.html"
success_url = 'horizon:project:share_types:index'
page_title = _("Manage Share Type Access")
def get_initial(self):
return {'id': self.kwargs["share_type_id"]}
def get_context_data(self, **kwargs):
context = super(ManageShareTypeAccessView, self).get_context_data(
**kwargs)
context['id'] = self.kwargs['share_type_id']
return context
class UpdateShareTypeView(forms.ModalFormView):
form_class = project_forms.UpdateShareType
form_id = "update_share_type"
template_name = "admin/share_types/update.html"
modal_header = _("Update Share Type")
modal_id = "update_share_type_modal"
submit_label = _("Update")
submit_url = "horizon:admin:share_types:update_type"
success_url = reverse_lazy("horizon:admin:share_types:index")
page_title = _("Update Share Type")
def get_object(self):
if not hasattr(self, "_object"):
st_id = self.kwargs["share_type_id"]
try:
self._object = manila.share_type_get(self.request, st_id)
except Exception:
msg = _("Unable to retrieve share_type.")
url = reverse("horizon:admin:share_types:index")
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(UpdateShareTypeView, self).get_context_data(**kwargs)
args = (self.get_object().id,)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
share_type = self.get_object()
return {
"id": self.kwargs["share_type_id"],
"name": share_type.name,
"extra_specs": share_type.extra_specs,
}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/panel.py 0000664 0001750 0001750 00000001640 13647271543 024564 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class ShareTypes(horizon.Panel):
name = _("Share Types")
slug = 'share_types'
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(ShareTypes)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/forms.py 0000664 0001750 0001750 00000012624 13647271543 024617 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2014 NetApp, 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 django.conf import settings
from django.forms import ValidationError
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from manila_ui.api import manila
from manila_ui.dashboards import utils
ST_EXTRA_SPECS_FORM_ATTRS = {
"rows": 5,
"cols": 40,
"style": "height: 135px; width: 100%;", # in case 'rows' not picked up
}
class CreateShareType(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Name"), required=True)
spec_driver_handles_share_servers = forms.ChoiceField(
label=_("Driver handles share servers"), required=True,
choices=(('False', 'False'), ('True', 'True')))
extra_specs = forms.CharField(
required=False, label=_("Extra specs"),
widget=forms.widgets.Textarea(attrs=ST_EXTRA_SPECS_FORM_ATTRS))
is_public = forms.BooleanField(
label=_("Public"), required=False, initial=True,
help_text=("Defines whether this share type is available for all "
"or not. List of allowed tenants should be set "
"separately."))
def __init__(self, *args, **kwargs):
super(CreateShareType, self).__init__(*args, **kwargs)
manila_features = getattr(settings, 'OPENSTACK_MANILA_FEATURES', {})
self.enable_public_share_type_creation = manila_features.get(
'enable_public_share_type_creation', True)
if not self.enable_public_share_type_creation:
self.fields.pop('is_public')
def handle(self, request, data):
try:
spec_dhss = data['spec_driver_handles_share_servers'].lower()
allowed_dhss_values = ('true', 'false')
if spec_dhss not in allowed_dhss_values:
msg = _("Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. "
"Allowed values are %s. "
"Case insensitive.") % allowed_dhss_values
raise ValidationError(message=msg)
set_dict, unset_list = utils.parse_str_meta(data['extra_specs'])
if unset_list:
msg = _("Expected only pairs of key=value.")
raise ValidationError(message=msg)
is_public = (self.enable_public_share_type_creation and
data["is_public"])
share_type = manila.share_type_create(
request, data["name"], spec_dhss, is_public=is_public)
if set_dict:
manila.share_type_set_extra_specs(
request, share_type.id, set_dict)
msg = _("Successfully created share type: %s") % share_type.name
messages.success(request, msg)
return True
except ValidationError as e:
# handle error without losing dialog
self.api_error(e.messages[0])
return False
except Exception:
exceptions.handle(request, _('Unable to create share type.'))
return False
class UpdateShareType(forms.SelfHandlingForm):
def __init__(self, *args, **kwargs):
super(UpdateShareType, self).__init__(*args, **kwargs)
# NOTE(vponomaryov): parse existing extra specs
# to str view for textarea html element
es_str = ""
for k, v in self.initial["extra_specs"].items():
es_str += "%s=%s\r\n" % (k, v)
self.initial["extra_specs"] = es_str
extra_specs = forms.CharField(
required=False, label=_("Extra specs"),
widget=forms.widgets.Textarea(attrs=ST_EXTRA_SPECS_FORM_ATTRS))
def handle(self, request, data):
try:
set_dict, unset_list = utils.parse_str_meta(data['extra_specs'])
if set_dict:
manila.share_type_set_extra_specs(
request, self.initial["id"], set_dict)
if unset_list:
get = manila.share_type_get_extra_specs(
request, self.initial["id"])
# NOTE(vponomaryov): skip keys that are already unset
to_unset = set(unset_list).intersection(set(get.keys()))
if to_unset:
manila.share_type_unset_extra_specs(
request, self.initial["id"], to_unset)
msg = _("Successfully updated extra specs for share type '%s'.")
msg = msg % self.initial['name']
messages.success(request, msg)
return True
except ValidationError as e:
# handle error without losing dialog
self.api_error(e.messages[0])
return False
except Exception:
msg = _("Unable to update extra_specs for share type.")
exceptions.handle(request, msg)
return False
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/templates/ 0000775 0001750 0001750 00000000000 13647271736 025114 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/templates/share_types/ 0000775 0001750 0001750 00000000000 13647271736 027442 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/templates/share_types/_manage_access.html 0000664 0001750 0001750 00000003246 13647271543 033241 0 ustar zuul zuul 0000000 0000000 {% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block form_id %}{% endblock %}
{% block form_action %}{% url 'horizon:admin:share_types:manage_share_type_access' share_type.id %}{% endblock %}
{% block modal_id %}manage_share_type_access_modal{% endblock %}
{% block modal-header %}{% trans "Manage Share Type Access" %}{% endblock %}
{% block modal-body %}
{% trans "Description" %}:
{% blocktrans trimmed %}
Placeholder for description of share type access managing form.
{% endblocktrans %}
{% trans "The share type defines the characteristics of a share backend." %}
Extra specs field:
{% trans "One line - one action. Empty strings will be ignored." %}
{% trans "To add extra-specs use:" %}
key=value
{% trans "Extra spec 'driver_handles_share_servers' is required and should have boolean value." %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/templates/share_types/create.html 0000664 0001750 0001750 00000000275 13647271543 031573 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Create Share Type" %}{% endblock %}
{% block main %}
{% include 'admin/share_types/_create.html' %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/templates/share_types/_update.html 0000664 0001750 0001750 00000001220 13647271543 031740 0 ustar zuul zuul 0000000 0000000 {% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block modal-body-right %}
{% trans "Description" %}:
{% trans "Here can be modified extra-specs for share type." %}
{% trans "One line - one action. Empty strings will be ignored." %}
{% trans "To add extra-specs use:" %}
key=value
{% trans "To unset extra-specs use:" %}
key
{% trans "All pairs that are in field for left are set for this share type." %}
{% trans "Extra spec 'driver_handles_share_servers' is required and should have boolean value." %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/templates/share_types/manage_access.html 0000664 0001750 0001750 00000000313 13647271543 033072 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Manage Share Type Access" %}{% endblock %}
{% block main %}
{% include 'admin/share_types/_manage_access.html' %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/templates/share_types/update.html 0000664 0001750 0001750 00000000275 13647271543 031612 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Update Share Type" %}{% endblock %}
{% block main %}
{% include 'admin/share_types/_update.html' %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/templates/share_types/index.html 0000664 0001750 0001750 00000000341 13647271543 031431 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Types" %}{% endblock %}
{% block main %}
{{ share_types_table.render }}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/tables.py 0000664 0001750 0001750 00000006466 13647271543 024752 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 django.utils.translation import ungettext_lazy
from horizon import tables
from manila_ui.api import manila
def get_size(share):
return _("%sGiB") % share.size
class CreateShareType(tables.LinkAction):
name = "create"
verbose_name = _("Create Share Type")
url = "horizon:admin:share_types:create_type"
classes = ("ajax-modal", "btn-create")
icon = "plus"
class DeleteShareType(tables.DeleteAction):
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Type",
u"Delete Share Types",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Type",
u"Deleted Share Types",
count
)
def delete(self, request, obj_id):
manila.share_type_delete(request, obj_id)
class ManageShareTypeAccess(tables.LinkAction):
name = "manage"
verbose_name = _("Manage Share Type Access")
url = "horizon:admin:share_types:manage_share_type_access"
classes = ("ajax-modal", "btn-create")
def allowed(self, request, obj_id):
st = manila.share_type_get(request, obj_id)
# Enable it only for private share types
return not st.is_public
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "os-share-tenant-attr:tenant_id", None)
return {"project_id": project_id}
class UpdateShareType(tables.LinkAction):
name = "update share type"
verbose_name = _("Update Share Type")
url = "horizon:admin:share_types:update_type"
classes = ("ajax-modal", "btn-create")
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "os-share-tenant-attr:tenant_id", None)
return {"project_id": project_id}
class ShareTypesTable(tables.DataTable):
name = tables.WrappingColumn("name", verbose_name=_("Name"))
extra_specs = tables.Column("extra_specs", verbose_name=_("Extra specs"), )
visibility = tables.Column(
"is_public", verbose_name=_("Visibility"),
filters=(lambda d: 'public' if d is True else 'private', ),
)
def get_object_display(self, share_type):
return share_type.name
def get_object_id(self, share_type):
return str(share_type.id)
class Meta(object):
name = "share_types"
verbose_name = _("Share Types")
table_actions = (
tables.NameFilterAction,
CreateShareType,
DeleteShareType,
)
row_actions = (
UpdateShareType,
ManageShareTypeAccess,
DeleteShareType,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/urls.py 0000664 0001750 0001750 00000002235 13647271543 024453 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.dashboards.admin.share_types import views
urlpatterns = [
urls.url(
r'^$',
views.ShareTypesView.as_view(),
name='index'),
urls.url(
r'^create_type$',
views.CreateShareTypeView.as_view(),
name='create_type'),
urls.url(
r'^update_type/(?P[^/]+)/extra_specs$',
views.UpdateShareTypeView.as_view(),
name='update_type'),
urls.url(
r'^manage_share_type_access/(?P[^/]+)$',
views.ManageShareTypeAccessView.as_view(),
name='manage_share_type_access'),
]
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/workflows.py 0000664 0001750 0001750 00000010455 13647271543 025526 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 forms
from horizon import workflows
from openstack_dashboard.api import keystone
from manila_ui.api import manila
class AddProjectAction(workflows.MembershipAction):
def __init__(self, request, *args, **kwargs):
super(AddProjectAction, self).__init__(request, *args, **kwargs)
default_role_field_name = self.get_default_role_field_name()
self.fields[default_role_field_name] = forms.CharField(required=False)
self.fields[default_role_field_name].initial = 'member'
field_name = self.get_member_field_name('member')
self.fields[field_name] = forms.MultipleChoiceField(required=False)
share_type_id = self.initial['id']
# Get list of existing projects
try:
projects, __ = keystone.tenant_list(request)
except Exception:
err_msg = _('Unable to get list of projects.')
exceptions.handle(request, err_msg)
# Get list of projects with access to this Share Type
try:
share_type = manila.share_type_get(request, share_type_id)
self.share_type_name = share_type.name
projects_initial = manila.share_type_access_list(
request, share_type)
except Exception:
err_msg = _('Unable to get information about share type access.')
exceptions.handle(request, err_msg)
self.fields[field_name].choices = [
(project.id, project.name or project.id) for project in projects]
self.fields[field_name].initial = [
pr.project_id for pr in projects_initial]
self.projects_initial = set(self.fields[field_name].initial)
class Meta(object):
name = _("Projects with access to share type")
slug = "update_members"
def handle(self, request, context):
context.update({
'name': self.share_type_name,
'projects_add': self.projects_allow - self.projects_initial,
'projects_remove': self.projects_initial - self.projects_allow,
})
return context
def clean(self):
cleaned_data = super(AddProjectAction, self).clean()
self.projects_allow = set(
cleaned_data[self.get_member_field_name('member')])
return cleaned_data
class AddProjectStep(workflows.UpdateMembersStep):
action_class = AddProjectAction
available_list_title = _("Available projects")
help_text = _("Allow project access to share type.")
members_list_title = _("Selected projects")
no_available_text = _("No projects found.")
no_members_text = _("No projects selected.")
depends_on = ("id", )
show_roles = False
class ManageShareTypeAccessWorkflow(workflows.Workflow):
slug = "manage_share_type_access"
name = _("Manage Share Type Access")
finalize_button_name = _("Manage Share Type Access")
success_message = _('Updated access for share type "%s".')
failure_message = _('Unable to update access for share type "%s".')
success_url = 'horizon:admin:share_types:index'
default_steps = (AddProjectStep, )
def format_status_message(self, message):
return message % self.context['name']
def handle(self, request, context):
try:
for project in self.context['projects_remove']:
manila.share_type_access_remove(
request, self.context['id'], project)
for project in self.context['projects_add']:
manila.share_type_access_add(
request, self.context['id'], project)
return True
except Exception:
exceptions.handle(request, _('Unable to update share type.'))
return False
manila-ui-3.0.0/manila_ui/dashboards/admin/share_types/__init__.py 0000664 0001750 0001750 00000000000 13647271543 025211 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/ 0000775 0001750 0001750 00000000000 13647271736 023271 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/views.py 0000664 0001750 0001750 00000012167 13647271543 025003 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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.
"""
Admin views for managing share groups.
"""
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import tabs
from horizon.utils import memoized
from manila_ui.api import manila
from manila_ui.dashboards.admin.share_groups import forms as sg_forms
from manila_ui.dashboards.admin.share_groups import tables as sg_tables
from manila_ui.dashboards.admin.share_groups import tabs as sg_tabs
class ShareGroupsView(tables.MultiTableView):
table_classes = (
sg_tables.ShareGroupsTable,
)
template_name = "admin/share_groups/index.html"
page_title = _("Share Groups")
@memoized.memoized_method
def get_share_groups_data(self):
try:
share_groups = manila.share_group_list(
self.request, detailed=True)
except Exception:
share_groups = []
exceptions.handle(
self.request, _("Unable to retrieve share groups."))
return share_groups
class ShareGroupDetailView(tabs.TabView):
tab_group_class = sg_tabs.ShareGroupDetailTabs
template_name = 'admin/share_groups/detail.html'
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
share_group = self.get_data()
context["share_group"] = share_group
context["page_title"] = (
_("Share Group Details: %s") % share_group.id)
return context
@memoized.memoized_method
def get_data(self):
try:
share_group_id = self.kwargs['share_group_id']
share_group = manila.share_group_get(self.request, share_group_id)
members = manila.share_list(
self.request, search_opts={"share_group_id": share_group_id})
share_group.members = members
share_group.share_group_type = manila.share_group_type_get(
self.request, share_group.share_group_type_id)
share_types = manila.share_type_list(self.request)
share_group.share_types = [
{"id": st.id,
"name": st.name,
"is_public": getattr(st, 'share_type_access:is_public'),
"dhss": st.extra_specs.get('driver_handles_share_servers')}
for st in share_types if st.id in share_group.share_types
]
return share_group
except Exception:
redirect = reverse('horizon:admin:share_groups:index')
exceptions.handle(
self.request,
_('Unable to retrieve share group details.'),
redirect=redirect)
def get_tabs(self, request, *args, **kwargs):
share_group = self.get_data()
return self.tab_group_class(request, share_group=share_group, **kwargs)
class ResetShareGroupStatusView(forms.ModalFormView):
form_class = sg_forms.ResetShareGroupStatusForm
form_id = "reset_share_group_status"
template_name = 'admin/share_groups/reset_status.html'
modal_header = _("Reset Status")
modal_id = "reset_share_group_status_modal"
submit_label = _("Reset status")
submit_url = "horizon:admin:share_groups:reset_status"
success_url = reverse_lazy("horizon:admin:share_groups:index")
page_title = _("Reset Share Group Status")
def get_object(self):
if not hasattr(self, "_object"):
sg_id = self.kwargs["share_group_id"]
try:
self._object = manila.share_group_get(self.request, sg_id)
except Exception:
msg = _("Unable to retrieve share group '%s'.") % sg_id
url = reverse('horizon:admin:share_groups:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
sg = self.get_object()
context['share_group_id'] = self.kwargs['share_group_id']
context['share_group_name'] = sg.name or sg.id
context['share_group_status'] = sg.status
context['submit_url'] = reverse(
self.submit_url, args=(context['share_group_id'], ))
return context
def get_initial(self):
sg = self.get_object()
return {
"share_group_id": self.kwargs["share_group_id"],
"share_group_name": sg.name or sg.id,
"share_group_status": sg.status,
}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/tabs.py 0000664 0001750 0001750 00000002140 13647271543 024565 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
from horizon import tabs
class ShareGroupOverviewTab(tabs.Tab):
name = _("Share Group Overview")
slug = "share_group_overview_tab"
template_name = "admin/share_groups/_detail.html"
def get_context_data(self, request):
return {"share_group": self.tab_group.kwargs["share_group"]}
class ShareGroupDetailTabs(tabs.TabGroup):
slug = "share_group_details"
tabs = (
ShareGroupOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/panel.py 0000664 0001750 0001750 00000001671 13647271543 024743 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class ShareGroups(horizon.Panel):
name = _("Share Groups")
slug = 'share_groups'
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(ShareGroups)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/forms.py 0000664 0001750 0001750 00000003635 13647271543 024774 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2017 Mirantis, 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 django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from manila_ui.api import manila
class ResetShareGroupStatusForm(forms.SelfHandlingForm):
status = forms.ChoiceField(
label=_("Status"),
required=True,
choices=(
('available', 'available'),
('error', 'error'),
)
)
def handle(self, request, data):
sg_id = self.initial['share_group_id']
try:
manila.share_group_reset_state(request, sg_id, data["status"])
message = _(
"Reseting share group ('%(id)s') status from '%(from)s' "
"to '%(to)s'.") % {
"id": (self.initial['share_group_name'] or
self.initial['share_group_id']),
"from": self.initial['share_group_status'],
"to": data["status"]}
messages.success(request, message)
return True
except Exception:
redirect = reverse("horizon:admin:share_groups:index")
exceptions.handle(
request,
_("Unable to reset status of share group '%s'.") % sg_id,
redirect=redirect)
return False
manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/templates/ 0000775 0001750 0001750 00000000000 13647271736 025267 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/templates/share_groups/ 0000775 0001750 0001750 00000000000 13647271736 027770 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/templates/share_groups/reset_status.html 0000664 0001750 0001750 00000000313 13647271543 033374 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Reset Share Group Status" %}{% endblock %}
{% block main %}
{% include 'admin/share_groups/_reset_status.html' %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/templates/share_groups/detail.html 0000664 0001750 0001750 00000000341 13647271543 032112 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Group Details" %}{% endblock %}
{% block main %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/tables.py 0000664 0001750 0001750 00000007437 13647271543 025124 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
from horizon import tables
from manila_ui.api import manila
class DeleteShareGroup(tables.DeleteAction):
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Group",
u"Delete Share Groups",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Group",
u"Deleted Share Groups",
count
)
def delete(self, request, obj_id):
manila.share_group_delete(request, obj_id)
class ResetShareGroupStatus(tables.LinkAction):
name = "reset_share_group_status"
verbose_name = _("Reset status")
url = "horizon:admin:share_groups:reset_status"
classes = ("ajax-modal", "btn-create")
def allowed(self, request, share_group=None):
return True
class ShareGroupsTable(tables.DataTable):
def get_share_network_link(share_group):
if getattr(share_group, 'share_network_id', None):
return reverse("horizon:admin:share_networks:share_network_detail",
args=(share_group.share_network_id,))
else:
return None
def get_share_server_link(share_group):
if getattr(share_group, 'share_server_id', None):
return reverse("horizon:admin:share_servers:share_server_detail",
args=(share_group.share_server_id,))
else:
return None
STATUS_CHOICES = (
("available", True),
("creating", None),
("deleting", None),
("error", False),
("error_deleting", False),
)
STATUS_DISPLAY_CHOICES = (
("available", u"Available"),
("creating", u"Creating"),
("deleting", u"Deleting"),
("error", u"Error"),
("error_deleting", u"Error deleting"),
)
name = tables.Column(
"name",
verbose_name=_("Name"),
link="horizon:admin:share_groups:detail")
host = tables.Column("host", verbose_name=_("Host"))
status = tables.Column(
"status",
verbose_name=_("Status"),
status=True,
status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES,
)
availability_zone = tables.Column(
"availability_zone",
verbose_name=_("Availability Zone"))
share_network_id = tables.Column(
"share_network_id",
verbose_name=_("Share Network"),
link=get_share_network_link)
share_server_id = tables.Column(
"share_server_id",
verbose_name=_("Share Server"),
link=get_share_server_link)
def get_object_display(self, share_group):
return str(share_group.id)
def get_object_id(self, share_group):
return str(share_group.id)
class Meta(object):
name = "share_groups"
verbose_name = _("Share Groups")
status_columns = ("status", )
table_actions = (
tables.NameFilterAction,
DeleteShareGroup,
)
row_actions = (
ResetShareGroupStatus,
DeleteShareGroup,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/urls.py 0000664 0001750 0001750 00000002262 13647271543 024626 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis 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 django.conf import urls
from manila_ui.dashboards.admin.share_groups import views
from manila_ui import features
if features.is_share_groups_enabled():
urlpatterns = [
urls.url(
r'^$',
views.ShareGroupsView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)/$',
views.ShareGroupDetailView.as_view(),
name='detail'),
urls.url(
r'^(?P[^/]+)/reset_status$',
views.ResetShareGroupStatusView.as_view(),
name='reset_status'),
]
manila-ui-3.0.0/manila_ui/dashboards/admin/share_groups/__init__.py 0000664 0001750 0001750 00000000000 13647271543 025364 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/defaults/ 0000775 0001750 0001750 00000000000 13647271736 022377 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/defaults/tabs.py 0000664 0001750 0001750 00000002743 13647271543 023704 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 openstack_dashboard import api
from manila_ui.api import manila as api_manila
from manila_ui.dashboards.admin.defaults import tables
class ShareQuotasTab(tabs.TableTab):
table_classes = (tables.ShareQuotasTable,)
name = _("Share Quotas")
slug = "shared_quotas"
template_name = ("horizon/common/_detail_table.html")
def get_share_quotas_data(self):
request = self.tab_group.request
tenant_id = request.user.tenant_id
try:
data = api_manila.default_quota_get(request, tenant_id)
except Exception:
data = []
exceptions.handle(self.request,
_('Unable to get manila default quota.'))
return data
def allowed(self, request):
return api.base.is_service_enabled(request, 'share')
manila-ui-3.0.0/manila_ui/dashboards/admin/defaults/tables.py 0000664 0001750 0001750 00000003300 13647271543 024213 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 tables
from openstack_dashboard.dashboards.admin.defaults import tables as default_tbl
MANILA_QUOTA_NAMES = {
'shares': _('Shares'),
'gigabytes': _('Share gigabytes'),
'snapshots': _('Share snapshots'),
'snapshot_gigabytes': _('Share snapshot gigabytes'),
'share_networks': _('Shares Networks'),
}
def get_quota_name(quota):
return MANILA_QUOTA_NAMES.get(quota.name,
quota.name.replace("_", " ").title())
class UpdateDefaultShareQuotas(default_tbl.UpdateDefaultQuotas):
name = 'update_share_defaults'
step = 'update_default_share_quotas'
class ShareQuotasTable(tables.DataTable):
name = tables.Column(get_quota_name, verbose_name=_('Quota Name'))
limit = tables.Column("limit", verbose_name=_('Limit'))
def get_object_id(self, obj):
return obj.name
class Meta(object):
name = "share_quotas"
verbose_name = _("Shared Quotas")
table_actions = (default_tbl.QuotaFilterAction,
UpdateDefaultShareQuotas)
multi_select = False
manila-ui-3.0.0/manila_ui/dashboards/admin/defaults/workflows.py 0000664 0001750 0001750 00000006160 13647271543 025005 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 forms
from horizon import workflows
from openstack_dashboard.api import base
from manila_ui.api import manila as api_manila
class UpdateDefaultShareQuotasAction(workflows.Action):
shares = forms.IntegerField(min_value=-1, label=_("Shares"))
share_gigabytes = forms.IntegerField(
min_value=-1, label=_("Share gigabytes"))
share_snapshots = forms.IntegerField(
min_value=-1, label=_("Share snapshots"))
share_snapshot_gigabytes = forms.IntegerField(
min_value=-1, label=_("Share snapshot gigabytes"))
share_networks = forms.IntegerField(
min_value=-1, label=_("Share Networks"))
def __init__(self, request, context, *args, **kwargs):
super(UpdateDefaultShareQuotasAction, self).__init__(
request, context, *args, **kwargs)
disabled_quotas = context['disabled_quotas']
for field in disabled_quotas:
if field in self.fields:
self.fields[field].required = False
self.fields[field].widget = forms.HiddenInput()
def handle(self, request, data):
try:
if base.is_service_enabled(request, 'share'):
manila_data = dict([(key, data[key]) for key in
api_manila.MANILA_QUOTA_FIELDS])
api_manila.default_quota_update(request, **manila_data)
return True
except Exception:
exceptions.handle(request,
_('Unable to update default quotas.'))
return False
class Meta(object):
name = _("Share")
slug = 'update_default_share_quotas'
help_text = _("From here you can update the default share quotas "
"(max limits).")
class UpdateDefaultShareQuotasStep(workflows.Step):
action_class = UpdateDefaultShareQuotasAction
contributes = api_manila.MANILA_QUOTA_FIELDS
depends_on = ('disabled_quotas',)
def prepare_action_context(self, request, context):
try:
quota_defaults = api_manila.default_quota_get(
request, request.user.tenant_id)
for field in api_manila.MANILA_QUOTA_FIELDS:
context[field] = quota_defaults.get(field).limit
except Exception:
exceptions.handle(request,
_('Unable to retrieve default share quotas.'))
return context
def allowed(self, request):
return base.is_service_enabled(request, 'share')
manila-ui-3.0.0/manila_ui/dashboards/admin/defaults/__init__.py 0000664 0001750 0001750 00000000000 13647271543 024472 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/__init__.py 0000664 0001750 0001750 00000000000 13647271543 022663 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/utils.py 0000664 0001750 0001750 00000003072 13647271543 022300 0 ustar zuul zuul 0000000 0000000 # 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.
from oslo_utils import timeutils
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from openstack_dashboard.api import keystone
PROJECTS = {}
TIME = None
def set_project_name_to_objects(request, objects):
global PROJECTS, TIME
try:
# NOTE(vponomaryov): we will use saved values making lots of requests
# in short period of time. 'memoized' is not suitable here
now = timeutils.now()
if TIME is None:
TIME = now
if not PROJECTS or now > TIME + 20:
projects, has_more = keystone.tenant_list(request)
PROJECTS = {t.id: t for t in projects}
TIME = now
except Exception:
msg = _('Unable to retrieve list of projects.')
exceptions.handle(request, msg)
for obj in objects:
project_id = getattr(obj, "project_id", None)
project = PROJECTS.get(project_id, None)
obj.project_name = getattr(project, "name", None)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/ 0000775 0001750 0001750 00000000000 13647271736 023774 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/views.py 0000664 0001750 0001750 00000004535 13647271543 025506 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
"""
Admin views for managing share snapshots.
"""
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tables
from horizon.utils import memoized
from manila_ui.api import manila
from manila_ui.dashboards.admin.share_snapshots import tables as ss_tables
from manila_ui.dashboards.admin.share_snapshots import tabs as ss_tabs
from manila_ui.dashboards.admin import utils
import manila_ui.dashboards.project.share_snapshots.views as snapshot_views
class ShareSnapshotsView(tables.MultiTableView):
table_classes = (
ss_tables.ShareSnapshotsTable,
)
template_name = "admin/share_snapshots/index.html"
page_title = _("Share Snapshots")
@memoized.memoized_method
def get_share_snapshots_data(self):
snapshots = []
try:
snapshots = manila.share_snapshot_list(
self.request, search_opts={'all_tenants': True})
shares = manila.share_list(self.request)
share_names = dict([(share.id, share.name or share.id)
for share in shares])
for snapshot in snapshots:
snapshot.share = share_names.get(snapshot.share_id)
except Exception:
msg = _("Unable to retrieve share snapshot list.")
exceptions.handle(self.request, msg)
# Gather our projects to correlate against IDs
utils.set_project_name_to_objects(self.request, snapshots)
return snapshots
class ShareSnapshotDetailView(snapshot_views.ShareSnapshotDetailView):
tab_group_class = ss_tabs.SnapshotDetailTabs
template_name = "admin/share_snapshots/detail.html"
redirect_url = reverse_lazy("horizon:admin:share_snapshots:index")
manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/tabs.py 0000664 0001750 0001750 00000002123 13647271543 025271 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
from horizon import tabs
class ShareSnapshotOverviewTab(tabs.Tab):
name = _("Share Snapshot Overview")
slug = "share_snapshot_overview_tab"
template_name = "admin/share_snapshots/_detail.html"
def get_context_data(self, request):
return {"snapshot": self.tab_group.kwargs["snapshot"]}
class SnapshotDetailTabs(tabs.TabGroup):
slug = "share_snapshot_details"
tabs = (
ShareSnapshotOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/panel.py 0000664 0001750 0001750 00000001656 13647271543 025451 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.admin import dashboard
class ShareSnapshots(horizon.Panel):
name = _("Share Snapshots")
slug = 'share_snapshots'
permissions = (
'openstack.services.share',
)
dashboard.Admin.register(ShareSnapshots)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/templates/ 0000775 0001750 0001750 00000000000 13647271736 025772 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/templates/share_snapshots/ 0000775 0001750 0001750 00000000000 13647271736 031176 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/templates/share_snapshots/detail.html 0000664 0001750 0001750 00000000333 13647271543 033321 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Details" %}{% endblock %}
{% block main %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/tables.py 0000664 0001750 0001750 00000010021 13647271543 025606 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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.template.defaultfilters import title
from django.urls import reverse
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 tables
from manila_ui.api import manila
import manila_ui.dashboards.project.share_snapshots.tables as ss_tables
from manila_ui.dashboards.project.shares import tables as shares_tables
def get_size(share):
return _("%sGiB") % share.size
class ShareSnapshotShareNameColumn(tables.Column):
def get_link_url(self, snapshot):
return reverse(self.link, args=(snapshot.share_id,))
class DeleteShareSnapshot(tables.DeleteAction):
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Snapshot",
u"Delete Snapshots",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Snapshot",
u"Deleted Snapshots",
count
)
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "project_id", None)
return {"project_id": project_id}
def delete(self, request, obj_id):
obj = self.table.get_object_by_id(obj_id)
name = self.table.get_object_display(obj)
try:
manila.share_snapshot_delete(request, obj_id)
except Exception:
msg = _('Unable to delete snapshot "%s". One or more shares '
'depend on it.')
exceptions.handle(self.request, msg % name)
raise
def allowed(self, request, snapshot=None):
if snapshot:
return snapshot.status.upper() in shares_tables.DELETABLE_STATES
return True
class ShareSnapshotsTable(tables.DataTable):
STATUS_CHOICES = (
("in-use", True),
("available", True),
("creating", None),
("error", False),
)
STATUS_DISPLAY_CHOICES = (
("in-use", pgettext_lazy("Current status of snapshot", u"In-use")),
("available",
pgettext_lazy("Current status of snapshot", u"Available")),
("creating", pgettext_lazy("Current status of snapshot", u"Creating")),
("error", pgettext_lazy("Current status of snapshot", u"Error")),
)
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:admin:share_snapshots:share_snapshot_detail")
description = tables.Column(
"description",
verbose_name=_("Description"),
truncate=40)
size = tables.Column(
get_size,
verbose_name=_("Size"),
attrs={'data-type': 'size'})
status = tables.Column(
"status",
filters=(title,),
verbose_name=_("Status"),
status=True,
status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES)
source = ShareSnapshotShareNameColumn(
"share",
verbose_name=_("Source"),
link="horizon:admin:shares:detail")
def get_object_display(self, obj):
return obj.name
class Meta(object):
name = "share_snapshots"
verbose_name = _("Share Snapshots")
status_columns = ["status"]
row_class = ss_tables.UpdateShareSnapshotRow
table_actions = (
tables.NameFilterAction,
DeleteShareSnapshot,
)
row_actions = (
DeleteShareSnapshot,
)
manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/urls.py 0000664 0001750 0001750 00000001574 13647271543 025336 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 manila_ui.dashboards.admin.share_snapshots import views
urlpatterns = [
urls.url(
r'^$',
views.ShareSnapshotsView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)$',
views.ShareSnapshotDetailView.as_view(),
name='share_snapshot_detail'),
]
manila-ui-3.0.0/manila_ui/dashboards/admin/share_snapshots/__init__.py 0000664 0001750 0001750 00000000000 13647271543 026067 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/identity/ 0000775 0001750 0001750 00000000000 13647271736 021331 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/identity/projects/ 0000775 0001750 0001750 00000000000 13647271736 023162 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/identity/projects/workflows.py 0000664 0001750 0001750 00000005325 13647271543 025572 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 openstack_dashboard.api import base
from openstack_dashboard.dashboards.identity.projects \
import workflows as project_workflows
from manila_ui.api import manila as api_manila
LOG = logging.getLogger(__name__)
class ShareQuotaAction(project_workflows.CommonQuotaAction):
shares = forms.IntegerField(min_value=-1, label=_("Shares"))
share_gigabytes = forms.IntegerField(
min_value=-1, label=_("Share gigabytes"))
share_snapshots = forms.IntegerField(
min_value=-1, label=_("Share snapshots"))
share_snapshot_gigabytes = forms.IntegerField(
min_value=-1, label=_("Share snapshot gigabytes"))
share_networks = forms.IntegerField(
min_value=-1, label=_("Share Networks"))
_quota_fields = api_manila.MANILA_QUOTA_FIELDS
def _tenant_quota_update(self, request, project_id, data):
api_manila.tenant_quota_update(request, project_id, **data)
class Meta(object):
name = _("Share")
slug = 'update_share_quotas'
help_text = _("Set maximum quotas for the project.")
permissions = ('openstack.roles.admin', 'openstack.services.share')
class UpdateShareQuota(workflows.Step):
action_class = ShareQuotaAction
depends_on = ("project_id", "disabled_quotas")
contributes = api_manila.MANILA_QUOTA_FIELDS
def prepare_action_context(self, request, context):
try:
quotas = api_manila.tenant_quota_get(
request, context['project_id'])
for field in api_manila.MANILA_QUOTA_FIELDS:
# Resolve mismatch UI field names and data field names.
data_field = api_manila.MANILA_QUOTA_FIELDS_DATA_MAP[field]
context[field] = quotas.get(data_field).limit
except Exception as ex:
LOG.exception(ex)
exceptions.handle(request,
_('Unable to retrieve share quotas.'))
return context
def allowed(self, request):
return base.is_service_enabled(request, 'share')
manila-ui-3.0.0/manila_ui/dashboards/identity/projects/__init__.py 0000664 0001750 0001750 00000000000 13647271543 025255 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/identity/__init__.py 0000664 0001750 0001750 00000000000 13647271543 023424 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/__init__.py 0000664 0001750 0001750 00000000000 13647271543 021573 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/utils.py 0000664 0001750 0001750 00000007366 13647271543 021222 0 ustar zuul zuul 0000000 0000000 # 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.forms import ValidationError
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
html_escape_table = {
"&": "&",
'"': """,
"'": "'",
">": ">",
"<": "<",
}
def html_escape(text):
return ''.join(html_escape_table.get(s, s) for s in text)
def parse_str_meta(meta_s):
"""Parse multiline string with data from form.
:option meta_s: str - string with keys and values
:returns: tuple of dict with key-value for set and list with keys for unset
:raises: ValidationError
"""
strings = [el.strip() for el in meta_s.split("\n") if len(el.strip()) > 0]
set_dict = {}
unset_list = []
msg = ""
for string in strings:
if string.count("=") == 0:
# Key for unsetting
key = string.strip(r'\"\' ')
if len(key) not in range(1, 256):
msg = _("Key '%s' has improper length.") % key
elif " " in key:
msg = _("Key can not contain spaces. See string '%s'.") % key
elif key not in unset_list:
unset_list.append(key)
else:
# Key-value pair for setting
pair = [p.strip(r'\"\' ') for p in string.split("=", 1)]
if not all(len(p) in range(1, 256) for p in pair):
msg = _("All keys and values must be in range from 1 to 255.")
elif pair[0] in list(set_dict.keys()):
msg = _("Duplicated keys '%s'.") % pair[0]
elif " " in pair[0]:
msg = _("Keys should not contain spaces. "
"Error in '%s'.") % string
else:
set_dict[pair[0]] = pair[1]
duplicated_keys = [uk for uk in unset_list if uk in list(set_dict.keys())]
if duplicated_keys:
msg = _("Duplicated keys '%s'.") % str(duplicated_keys)
if msg:
raise ValidationError(message=msg)
return set_dict, unset_list
def metadata_to_str(metadata, meta_visible_limit=4, text_length_limit=25):
# Only convert dictionaries
if not hasattr(metadata, 'keys'):
return metadata
meta = []
meta_keys = sorted(metadata.keys())
meta_keys = meta_keys[:meta_visible_limit]
for k in meta_keys:
k_shortenned = k
if len(k) > text_length_limit:
k_shortenned = k[:text_length_limit] + '...'
v = metadata[k]
if len(v) > text_length_limit:
v = v[:text_length_limit] + '...'
meta.append("%s = %s" % (html_escape(k_shortenned), html_escape(v)))
meta_str = " ".join(meta)
if len(metadata.keys()) > meta_visible_limit and meta_str[-3:] != "...":
meta_str += '...'
return mark_safe(meta_str)
def get_nice_security_service_type(security_service):
type_mapping = {
'ldap': 'LDAP',
'active_directory': 'Active Directory',
'kerberos': 'Kerberos',
}
return type_mapping.get(security_service.type, security_service.type)
def calculate_longest_str_size(str_list):
size = 40
for str_val in str_list:
current_size = len(str_val)
if current_size > size:
size = current_size
return size
manila-ui-3.0.0/manila_ui/dashboards/project/ 0000775 0001750 0001750 00000000000 13647271736 021146 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/security_services/ 0000775 0001750 0001750 00000000000 13647271736 024720 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/security_services/views.py 0000664 0001750 0001750 00000014572 13647271543 026434 0 ustar zuul zuul 0000000 0000000 # 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.
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import tabs
from horizon.utils import memoized
from manila_ui.api import manila
from manila_ui.dashboards.project.security_services import forms as ss_forms
from manila_ui.dashboards.project.security_services import tables as ss_tables
from manila_ui.dashboards.project.security_services import tabs as ss_tabs
from manila_ui.dashboards.project.share_networks import forms as sn_forms
from manila_ui.dashboards import utils
class SecurityServicesView(tables.MultiTableView):
table_classes = (
ss_tables.SecurityServicesTable,
)
template_name = "project/security_services/index.html"
page_title = _("Security Services")
@memoized.memoized_method
def get_security_services_data(self):
try:
security_services = manila.security_service_list(self.request)
except Exception:
security_services = []
exceptions.handle(
self.request, _("Unable to retrieve security services"))
return security_services
class UpdateView(forms.ModalFormView):
template_name = "project/security_services/update.html"
form_class = ss_forms.Update
form_id = "update_security_service"
modal_header = _("Edit Security Service")
modal_id = "update_security_service_modal"
submit_label = _("Edit")
submit_url = "horizon:project:security_services:security_service_update"
success_url = reverse_lazy("horizon:project:security_services:index")
page_title = _('Edit Security Service')
def get_object(self):
if not hasattr(self, "_object"):
sec_service_id = self.kwargs['sec_service_id']
try:
self._object = manila.security_service_get(
self.request, sec_service_id)
except Exception:
msg = _('Unable to retrieve security_service.')
url = reverse('horizon:project:security_services:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs)
return context
def get_initial(self):
self.submit_url = reverse(self.submit_url, kwargs=self.kwargs)
sec_service = self.get_object()
return {'sec_service_id': self.kwargs["sec_service_id"],
'name': sec_service.name,
'description': sec_service.description}
class CreateView(forms.ModalFormView):
form_class = ss_forms.Create
form_id = "create_security_service"
template_name = 'project/security_services/create.html'
modal_header = _("Create Security Service")
modal_id = "create_security_service_modal"
submit_label = _("Create")
submit_url = reverse_lazy(
"horizon:project:security_services:security_service_create")
success_url = reverse_lazy("horizon:project:security_services:index")
page_title = _('Create Security Service')
class AddSecurityServiceView(forms.ModalFormView):
form_class = sn_forms.AddSecurityServiceForm
template_name = 'project/security_services/add.html'
success_url = 'horizon:project:security_services:index'
page_title = _('Add Security Service')
def get_object(self):
if not hasattr(self, "_object"):
share_id = self.kwargs['share_network_id']
try:
self._object = manila.share_network_get(self.request, share_id)
except Exception:
msg = _('Unable to retrieve share network.')
url = reverse('horizon:project:security_services:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(AddSecurityServiceView,
self).get_context_data(**kwargs)
context['share_network'] = self.get_object()
return context
def get_initial(self):
share_net = self.get_object()
return {'share_net_id': self.kwargs["share_network_id"],
'name': share_net.name,
'description': share_net.description}
class Detail(tabs.TabView):
tab_group_class = ss_tabs.SecurityServiceDetailTabs
template_name = 'project/security_services/detail.html'
redirect_url = reverse_lazy('horizon:project:security_services:index')
def get_context_data(self, **kwargs):
context = super(Detail, self).get_context_data(**kwargs)
sec_service = self.get_data()
context["sec_service"] = sec_service
sec_service_display_name = sec_service.name or sec_service.id
context["sec_service_display_name"] = sec_service_display_name
context["page_title"] = _("Security Service Details: "
"%(service_display_name)s") % \
{'service_display_name': sec_service_display_name}
return context
@memoized.memoized_method
def get_data(self):
try:
sec_service_id = self.kwargs['sec_service_id']
sec_service = manila.security_service_get(
self.request, sec_service_id)
sec_service.type = utils.get_nice_security_service_type(
sec_service)
except Exception:
message = _("Unable to retrieve security service "
"'%s' details.") % sec_service_id
exceptions.handle(
self.request, message, redirect=self.redirect_url)
return sec_service
def get_tabs(self, request, *args, **kwargs):
sec_service = self.get_data()
return self.tab_group_class(request, sec_service=sec_service, **kwargs)
manila-ui-3.0.0/manila_ui/dashboards/project/security_services/tabs.py 0000664 0001750 0001750 00000002014 13647271543 026214 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 tabs
class OverviewTab(tabs.Tab):
name = _("Overview")
slug = "overview"
template_name = ("project/security_services/_detail.html")
def get_context_data(self, request):
return {"sec_service": self.tab_group.kwargs['sec_service']}
class SecurityServiceDetailTabs(tabs.TabGroup):
slug = "security_service_details"
tabs = (
OverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/project/security_services/panel.py 0000664 0001750 0001750 00000001672 13647271543 026373 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.project import dashboard
class SecurityServices(horizon.Panel):
name = _("Security Services")
slug = 'security_services'
permissions = (
'openstack.services.share',
)
dashboard.Project.register(SecurityServices)
manila-ui-3.0.0/manila_ui/dashboards/project/security_services/forms.py 0000664 0001750 0001750 00000007377 13647271543 026432 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2014 NetApp, 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 django.forms import ValidationError
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.debug import sensitive_variables
from horizon import exceptions
from horizon import forms
from horizon import messages
from manila_ui.api import manila
class Create(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Name"))
dns_ip = forms.CharField(max_length="15", label=_("DNS IP"))
server = forms.CharField(max_length="255", label=_("Server"))
domain = forms.CharField(max_length="255", label=_("Domain"))
user = forms.CharField(max_length="255", label=_("User"), required=False)
password = forms.CharField(
label=_("Password"),
widget=forms.PasswordInput(render_value=False),
required=False)
confirm_password = forms.CharField(
label=_("Confirm Password"),
widget=forms.PasswordInput(render_value=False))
type = forms.ChoiceField(choices=(("", ""),
("active_directory", "Active Directory"),
("ldap", "LDAP"),
("kerberos", "Kerberos")),
label=_("Type"))
description = forms.CharField(widget=forms.Textarea,
label=_("Description"), required=False)
def clean(self):
'''Check to make sure password fields match.'''
data = super(forms.Form, self).clean()
if 'password' in data:
if data['password'] != data.get('confirm_password', None):
raise ValidationError(_('Passwords do not match.'))
return data
@sensitive_variables('data')
def handle(self, request, data):
try:
data.pop('confirm_password')
security_service = manila.security_service_create(
request, **data)
messages.success(request, _('Successfully created security '
'service: %s') % data['name'])
return security_service
except Exception:
exceptions.handle(request,
_('Unable to create security service.'))
return False
class Update(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Share Name"))
description = forms.CharField(
widget=forms.Textarea, label=_("Description"), required=False)
def handle(self, request, data):
sec_service_id = self.initial['sec_service_id']
try:
manila.security_service_update(request, sec_service_id,
name=data['name'],
description=data['description'])
message = _('Successfully updated security service '
'"%s"') % data['name']
messages.success(request, message)
return True
except Exception:
redirect = reverse("horizon:project:security_services:index")
exceptions.handle(request,
_('Unable to update security service.'),
redirect=redirect)
manila-ui-3.0.0/manila_ui/dashboards/project/security_services/templates/ 0000775 0001750 0001750 00000000000 13647271736 026716 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/security_services/templates/security_services/ 0000775 0001750 0001750 00000000000 13647271736 032470 5 ustar zuul zuul 0000000 0000000 ././@LongLink 0000000 0000000 0000000 00000000147 00000000000 011217 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/security_services/templates/security_services/detail.html manila-ui-3.0.0/manila_ui/dashboards/project/security_services/templates/security_services/detail.ht0000664 0001750 0001750 00000000346 13647271543 034266 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Security Service Details" %}{% endblock %}
{% block main %}
{% trans "One line - one action. Empty strings will be ignored." %}
{% trans "To add metadata use:" %}
key=value
{% trans "To unset metadata use:" %}
key
{% trans "All pairs that are in field for left are set for this metadata." %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/project/shares/templates/shares/update.html 0000664 0001750 0001750 00000000263 13647271543 030063 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Edit Share" %}{% endblock %}
{% block main %}
{% include 'project/shares/_update.html' %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/project/shares/templates/shares/index.html 0000664 0001750 0001750 00000000331 13647271543 027704 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Shares" %}{% endblock %}
{% block main %}
{{ shares_table.render }}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/project/shares/templates/shares/update_metadata.html 0000664 0001750 0001750 00000000305 13647271543 031720 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Edit Share Metadata" %}{% endblock %}
{% block main %}
{% include 'project/shares/_update_metadata.html' %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/project/shares/tables.py 0000664 0001750 0001750 00000035134 13647271543 024261 0 ustar zuul zuul 0000000 0000000 # 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.
from django.template.defaultfilters import title
from django.urls import reverse
from django.utils.text import format_lazy
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.utils import filters
from manila_ui.api import manila
from manila_ui.dashboards.project.share_snapshots import tables as ss_tables
from manila_ui.dashboards import utils
from manila_ui import features
DELETABLE_STATES = (
"AVAILABLE", "ERROR",
"MANAGE_ERROR",
)
class DeleteShare(tables.DeleteAction):
policy_rules = (("share", "share:delete"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share",
u"Delete Shares",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share",
u"Deleted Shares",
count
)
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "os-share-tenant-attr:tenant_id", None)
return {"project_id": project_id}
def delete(self, request, obj_id):
share = manila.share_get(request, obj_id)
try:
manila.share_delete(
request, share.id, share_group_id=share.share_group_id)
except Exception:
msg = _('Unable to delete share "%s". ') % obj_id
messages.error(request, msg)
def allowed(self, request, share=None):
if share:
# Row button
return (share.status.upper() in DELETABLE_STATES and
not getattr(share, 'has_snapshot', False))
# Table button. Always return 'True'.
return True
class CreateShare(tables.LinkAction):
name = "create"
verbose_name = _("Create Share")
url = "horizon:project:shares:create"
classes = ("ajax-modal", "btn-create")
icon = "plus"
policy_rules = (("share", "share:create"),)
def allowed(self, request, share=None):
usages = manila.tenant_absolute_limits(request)
shares_allowed = (usages['maxTotalShares'] >
usages['totalSharesUsed'] and
usages['maxTotalShareGigabytes'] >
usages['totalShareGigabytesUsed'])
if not shares_allowed:
if "disabled" not in self.classes:
self.classes = [c for c in self.classes] + ['disabled']
self.verbose_name = format_lazy(
'{verbose_name} {quota_exceeded}',
verbose_name=self.verbose_name,
quota_exceeded=_("(Quota exceeded)"))
else:
self.verbose_name = _("Create Share")
classes = [c for c in self.classes if c != "disabled"]
self.classes = classes
return True
class EditShare(tables.LinkAction):
name = "edit"
verbose_name = _("Edit Share")
url = "horizon:project:shares:update"
classes = ("ajax-modal", "btn-create")
policy_rules = (("share", "share:update"),)
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "os-share-tenant-attr:tenant_id", None)
return {"project_id": project_id}
def allowed(self, request, share=None):
return share.status in ("available", "in-use")
class EditShareMetadata(tables.LinkAction):
name = "update_metadata"
verbose_name = _("Edit Share Metadata")
url = "horizon:project:shares:update_metadata"
classes = ("ajax-modal", "btn-create")
policy_rules = (("share", "share:update_share_metadata"),)
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "os-share-tenant-attr:tenant_id", None)
return {"project_id": project_id}
def allowed(self, request, share=None):
return share.status in ("available", "in-use")
class ExtendShare(tables.LinkAction):
name = "extend_share"
verbose_name = _("Extend Share")
url = "horizon:project:shares:extend"
classes = ("ajax-modal", "btn-create")
policy_rules = (("share", "share:extend"),)
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "os-share-tenant-attr:tenant_id", None)
return {"project_id": project_id}
def allowed(self, request, share=None):
return share.status.lower() in ("available",)
class RevertShare(tables.LinkAction):
name = "revert_share"
verbose_name = _("Revert Share")
url = "horizon:project:shares:revert"
classes = ("ajax-modal", "btn-create")
policy_rules = (("share", "share:revert"),)
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "os-share-tenant-attr:tenant_id", None)
return {"project_id": project_id}
def allowed(self, request, share=None):
return (
getattr(share, 'revert_to_snapshot_support', False) and
share.status.lower() == "available"
)
class UpdateRow(tables.Row):
ajax = True
def get_data(self, request, share_id):
share = manila.share_get(request, share_id)
if not share.name:
share.name = share_id
if share.share_network_id:
share_net = manila.share_network_get(request,
share.share_network_id)
share.share_network = share_net.name or share_net.id
else:
share.share_network = None
share.metadata = utils.metadata_to_str(share.metadata)
return share
def get_size(share):
return _("%sGiB") % share.size
class SharesTableBase(tables.DataTable):
STATUS_CHOICES = (
("available", True), ("AVAILABLE", True),
("creating", None), ("CREATING", None),
("deleting", None), ("DELETING", None),
("reverting", None),
("migrating", None), ("migrating_to", None),
("error", False), ("ERROR", False),
("error_deleting", False), ("ERROR_DELETING", False),
("MANAGE_ERROR", False),
("UNMANAGE_ERROR", False),
("extending_error", False),
("reverting_error", False),
)
STATUS_DISPLAY_CHOICES = (
("available", pgettext_lazy("Current status of share", u"Available")),
("AVAILABLE", pgettext_lazy("Current status of share", u"Available")),
("creating", pgettext_lazy("Current status of share", u"Creating")),
("CREATING", pgettext_lazy("Current status of share", u"Creating")),
("deleting", pgettext_lazy("Current status of share", u"Deleting")),
("DELETING", pgettext_lazy("Current status of share", u"Deleting")),
("migrating", pgettext_lazy("Current status of share", u"Migrating")),
("migrating_to", pgettext_lazy("Current status of share",
u"Migrating to")),
("error", pgettext_lazy("Current status of share", u"Error")),
("ERROR", pgettext_lazy("Current status of share", u"Error")),
("error_deleting", pgettext_lazy("Current status of share",
u"Deleting")),
("ERROR_DELETING", pgettext_lazy("Current status of share",
u"Deleting")),
("MANAGE_ERROR", pgettext_lazy("Current status of share",
u"Manage Error")),
("UNMANAGE_ERROR", pgettext_lazy("Current status of share",
u"Unmanage Error")),
("extending_error", pgettext_lazy("Current status of share",
u"Extending Error")),
("reverting_error", pgettext_lazy("Current status of share",
u"Reverting Error")),
)
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:project:shares:detail")
description = tables.Column("description",
verbose_name=_("Description"),
truncate=40)
metadata = tables.Column("metadata",
verbose_name=_("Metadata"))
size = tables.Column(get_size,
verbose_name=_("Size"),
attrs={'data-type': 'size'})
status = tables.Column("status",
filters=(title,),
verbose_name=_("Status"),
status=True,
status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES)
def get_object_display(self, obj):
return obj.name or obj.id
def get_share_group_link(share):
if (features.is_share_groups_enabled() and
getattr(share, 'share_group_id', None)):
return reverse(
"horizon:project:share_groups:detail",
args=(share.share_group_id,))
else:
return None
share_group_id = tables.Column(
"share_group_id",
verbose_name=_("Share Group"),
empty_value="-",
link=get_share_group_link,
)
class ManageRules(tables.LinkAction):
name = "manage_rules"
verbose_name = _("Manage Rules")
url = "horizon:project:shares:manage_rules"
classes = ("btn-edit",)
policy_rules = (("share", "share:access_get_all"),)
class ManageReplicas(tables.LinkAction):
name = "manage_replicas"
verbose_name = _("Manage Replicas")
url = "horizon:project:shares:manage_replicas"
classes = ("btn-edit",)
policy_rules = (("share", "share:replica_get_all"),)
def allowed(self, request, share):
share_replication_enabled = share.replication_type is not None
return features.is_replication_enabled() and share_replication_enabled
class AddRule(tables.LinkAction):
name = "rule_add"
verbose_name = _("Add rule")
url = 'horizon:project:shares:rule_add'
classes = ("ajax-modal", "btn-create")
icon = "plus"
policy_rules = (("share", "share:allow_access"),)
def allowed(self, request, share=None):
share = manila.share_get(request, self.table.kwargs['share_id'])
return share.status in ("available", "in-use")
def get_link_url(self):
return reverse(self.url, args=[self.table.kwargs['share_id']])
class DeleteRule(tables.DeleteAction):
policy_rules = (("share", "share:deny_access"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Rule",
u"Delete Rules",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Rule",
u"Deleted Rules",
count
)
def delete(self, request, obj_id):
try:
manila.share_deny(request, self.table.kwargs['share_id'], obj_id)
except Exception:
msg = _('Unable to delete rule "%s".') % obj_id
exceptions.handle(request, msg)
class UpdateRuleRow(tables.Row):
ajax = True
def get_data(self, request, rule_id):
rules = manila.share_rules_list(request, self.table.kwargs['share_id'])
if rules:
for rule in rules:
if rule.id == rule_id:
return rule
raise exceptions.NotFound
class RulesTable(tables.DataTable):
access_type = tables.Column("access_type", verbose_name=_("Access Type"))
access_to = tables.Column("access_to", verbose_name=_("Access to"))
access_level = tables.Column(
"access_level", verbose_name=_("Access Level"))
status = tables.Column("state", verbose_name=_("Status"))
access_key = tables.Column("access_key", verbose_name=_("Access Key"))
created_at = tables.Column("created_at", verbose_name=_("Created At"),
filters=(filters.parse_isotime,))
updated_at = tables.Column("updated_at", verbose_name=_("Updated At"),
filters=(filters.parse_isotime,))
def get_object_display(self, obj):
return obj.id
class Meta(object):
name = "rules"
verbose_name = _("Rules")
status_columns = ["status"]
row_class = UpdateRuleRow
table_actions = (
AddRule,
DeleteRule)
row_actions = (
DeleteRule,)
def get_share_network(share):
name = share.share_network_name
return name if name != "None" else None
class SharesTable(SharesTableBase):
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:project:shares:detail")
visibility = tables.Column(
"is_public", verbose_name=_("Visibility"),
help_text=("Whether this share visible to all tenants (public) or "
"only for owner (private)."),
filters=(lambda d: 'public' if d is True else 'private', ),
)
proto = tables.Column("share_proto", verbose_name=_("Protocol"))
share_network = tables.Column("share_network",
verbose_name=_("Share Network"),
empty_value="-")
class Meta(object):
name = "shares"
verbose_name = _("Shares")
status_columns = ["status"]
row_class = UpdateRow
table_actions = (
tables.NameFilterAction,
CreateShare,
DeleteShare)
row_actions = (
EditShare,
ExtendShare,
RevertShare,
ss_tables.CreateShareSnapshot,
ManageRules,
ManageReplicas,
EditShareMetadata,
DeleteShare)
columns = [
'name', 'description', 'metadata', 'size', 'status',
'proto', 'visibility', 'share_network',
]
if features.is_share_groups_enabled():
columns.append('share_group_id')
manila-ui-3.0.0/manila_ui/dashboards/project/shares/urls.py 0000664 0001750 0001750 00000005156 13647271543 023775 0 ustar zuul zuul 0000000 0000000 # 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.
from django.conf import urls
from manila_ui.dashboards.project.shares.replicas import views as replica_views
from manila_ui.dashboards.project.shares import views as shares_views
from manila_ui import features
urlpatterns = [
urls.url(
r'^$',
shares_views.SharesView.as_view(),
name='index'),
urls.url(
r'^create/$',
shares_views.CreateView.as_view(),
name='create'),
urls.url(
r'^(?P[^/]+)/rules/$',
shares_views.ManageRulesView.as_view(),
name='manage_rules'),
urls.url(
r'^(?P[^/]+)/rule_add/$',
shares_views.AddRuleView.as_view(),
name='rule_add'),
urls.url(
r'^(?P[^/]+)/$',
shares_views.DetailView.as_view(),
name='detail'),
urls.url(
r'^(?P[^/]+)/update/$',
shares_views.UpdateView.as_view(),
name='update'),
urls.url(
r'^(?P[^/]+)/update_metadata/$',
shares_views.UpdateMetadataView.as_view(),
name='update_metadata'),
urls.url(
r'^(?P[^/]+)/extend/$',
shares_views.ExtendView.as_view(),
name='extend'),
urls.url(
r'^(?P[^/]+)/revert/$',
shares_views.RevertView.as_view(),
name='revert'),
]
if features.is_replication_enabled():
urlpatterns.extend([
urls.url(
r'^(?P[^/]+)/create_replica/$',
replica_views.CreateReplicaView.as_view(),
name='create_replica'),
urls.url(
r'^(?P[^/]+)/replicas/$',
replica_views.ManageReplicasView.as_view(),
name='manage_replicas'),
urls.url(
r'^replica/(?P[^/]+)$',
replica_views.DetailReplicaView.as_view(),
name='replica_detail'),
urls.url(
r'^replica/(?P[^/]+)/set_replica_as_active$',
replica_views.SetReplicaAsActiveView.as_view(),
name='set_replica_as_active'),
])
manila-ui-3.0.0/manila_ui/dashboards/project/shares/__init__.py 0000664 0001750 0001750 00000004435 13647271543 024546 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 openstack_dashboard.api import base
from openstack_dashboard.usage import base as usage
from manila_ui.api import manila
#
# Add extra pie charts to project/compute overview
#
class ManilaUsage(usage.ProjectUsage):
def get_manila_limits(self):
"""Get share limits if manila is enabled."""
if not base.is_service_enabled(self.request, 'share'):
return
try:
self.limits.update(manila.tenant_absolute_limits(self.request))
except Exception:
msg = _("Unable to retrieve share limit information.")
exceptions.handle(self.request, msg)
return
def get_limits(self):
super(self.__class__, self).get_limits()
self.get_manila_limits()
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
types = (
("totalSharesUsed", "maxTotalShares", _("Shares")),
("totalShareGigabytesUsed", "maxTotalShareGigabytes",
_("Share Storage")),
("totalShareSnapshotsUsed", "maxTotalShareSnapshots",
_("Share Snapshots")),
("totalSnapshotGigabytesUsed", "maxTotalSnapshotGigabytes",
_("Share Snapshots Storage")),
("totalShareNetworksUsed", "maxTotalShareNetworks",
_("Share Networks")),
)
for t in types:
if t[0] in self.usage.limits and t[1] in self.usage.limits:
context['charts'].append({
'type': t[0],
'name': t[2],
'used': self.usage.limits[t[0]],
'max': self.usage.limits[t[1]],
'text': False,
})
return context
manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/ 0000775 0001750 0001750 00000000000 13647271736 024204 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/views.py 0000664 0001750 0001750 00000015122 13647271543 025710 0 ustar zuul zuul 0000000 0000000 # 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.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import tabs
from horizon.utils import memoized
from horizon import workflows
from openstack_dashboard.api import base
from openstack_dashboard.api import neutron
from manila_ui.api import manila
from manila_ui.api import network
from manila_ui.dashboards.project.share_networks import forms as sn_forms
from manila_ui.dashboards.project.share_networks import tables as sn_tables
from manila_ui.dashboards.project.share_networks import tabs as sn_tabs
import manila_ui.dashboards.project.share_networks.workflows as sn_workflows
from manila_ui.dashboards import utils
class ShareNetworksView(tables.MultiTableView):
table_classes = (
sn_tables.ShareNetworksTable,
)
template_name = "admin/share_networks/index.html"
page_title = _("Share Networks")
@memoized.memoized_method
def get_share_networks_data(self):
try:
share_networks = manila.share_network_list(
self.request, detailed=True)
if base.is_service_enabled(self.request, 'network'):
neutron_net_names = dict((net.id, net.name) for net in
neutron.network_list(self.request))
neutron_subnet_names = dict((net.id, net.name) for net in
neutron.subnet_list(self.request))
for sn in share_networks:
sn.neutron_net = neutron_net_names.get(
sn.neutron_net_id) or sn.neutron_net_id or "-"
sn.neutron_subnet = neutron_subnet_names.get(
sn.neutron_subnet_id) or sn.neutron_subnet_id or "-"
except Exception:
share_networks = []
exceptions.handle(
self.request, _("Unable to retrieve share networks"))
return share_networks
class Update(workflows.WorkflowView):
workflow_class = sn_workflows.UpdateShareNetworkWorkflow
template_name = "project/share_networks/update.html"
success_url = 'horizon:project:share_networks:index'
page_title = _('Update Share Network')
def get_initial(self):
return {'id': self.kwargs["share_network_id"]}
def get_context_data(self, **kwargs):
context = super(Update, self).get_context_data(**kwargs)
context['id'] = self.kwargs['share_network_id']
return context
class Create(forms.ModalFormView):
form_class = sn_forms.Create
form_id = "create_share_network"
template_name = 'project/share_networks/create.html'
modal_header = _("Create Share Network")
modal_id = "create_share_network_modal"
submit_label = _("Create")
submit_url = reverse_lazy(
"horizon:project:share_networks:share_network_create")
success_url = reverse_lazy("horizon:project:share_networks:index")
page_title = _('Create Share Network')
class Detail(tabs.TabView):
tab_group_class = sn_tabs.ShareNetworkDetailTabs
template_name = 'project/share_networks/detail.html'
redirect_url = reverse_lazy('horizon:project:share_networks:index')
def get_context_data(self, **kwargs):
context = super(Detail, self).get_context_data(**kwargs)
share_network = self.get_data()
share_network_display_name = share_network.name or share_network.id
context["share_network"] = share_network
context["share_network_display_name"] = share_network_display_name
context["page_title"] = _("Share Network Details: "
"%(network_display_name)s") % \
{'network_display_name': share_network_display_name}
return context
@memoized.memoized_method
def get_data(self):
try:
share_net_id = self.kwargs['share_network_id']
share_net = manila.share_network_get(self.request, share_net_id)
if base.is_service_enabled(self.request, 'network'):
try:
share_net.neutron_net = neutron.network_get(
self.request, share_net.neutron_net_id).name_or_id
except (
neutron.neutron_client.exceptions.NeutronClientException):
share_net.neutron_net = _("Unknown")
try:
share_net.neutron_subnet = neutron.subnet_get(
self.request, share_net.neutron_subnet_id).name_or_id
except (
neutron.neutron_client.exceptions.NeutronClientException):
share_net.neutron_subnet = _("Unknown")
else:
try:
share_net.nova_net = network.network_get(
self.request, share_net.nova_net_id).name_or_id
except Exception:
share_net.nova_net = _("Unknown")
share_net.sec_services = (
manila.share_network_security_service_list(
self.request, share_net_id))
for ss in share_net.sec_services:
ss.type = utils.get_nice_security_service_type(ss)
server_search_opts = {'share_network_id': share_net_id}
try:
share_servs = manila.share_server_list(
self.request,
search_opts=server_search_opts)
# Non admins won't be able to get share servers
except Exception:
share_servs = []
if share_servs:
share_net.share_servers = share_servs
except Exception:
exceptions.handle(self.request,
_('Unable to retrieve share network details.'),
redirect=self.redirect_url)
return share_net
def get_tabs(self, request, *args, **kwargs):
share_network = self.get_data()
return self.tab_group_class(request, share_network=share_network,
**kwargs)
manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/tabs.py 0000664 0001750 0001750 00000002005 13647271543 025500 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 tabs
class OverviewTab(tabs.Tab):
name = _("Overview")
slug = "overview"
template_name = "project/share_networks/_detail.html"
def get_context_data(self, request):
return {"share_network": self.tab_group.kwargs['share_network']}
class ShareNetworkDetailTabs(tabs.TabGroup):
slug = "share_network_details"
tabs = (
OverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/panel.py 0000664 0001750 0001750 00000001656 13647271543 025661 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.project import dashboard
class ShareNetworks(horizon.Panel):
name = _("Share Networks")
slug = 'share_networks'
permissions = (
'openstack.services.share',
)
dashboard.Project.register(ShareNetworks)
manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/forms.py 0000664 0001750 0001750 00000013457 13647271543 025712 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2014 NetApp, 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 django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from openstack_dashboard.api import base
from openstack_dashboard.api import neutron
from manila_ui.api import manila
from manila_ui.api import network
class Create(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Name"))
description = forms.CharField(
widget=forms.Textarea, label=_("Description"), required=False)
def __init__(self, request, *args, **kwargs):
super(Create, self).__init__(request, *args, **kwargs)
self.neutron_enabled = base.is_service_enabled(request, 'network')
net_choices = network.network_list(request)
if self.neutron_enabled:
self.fields['neutron_net_id'] = forms.ChoiceField(
choices=[(' ', ' ')] + [(choice.id, choice.name_or_id)
for choice in net_choices],
label=_("Neutron Net"), widget=forms.Select(
attrs={'class': 'switchable', 'data-slug': 'net'}))
for net in net_choices:
# For each network create switched choice field with
# the its subnet choices
subnet_field_name = 'subnet-choices-%s' % net.id
subnet_field = forms.ChoiceField(
choices=(), label=_("Neutron Subnet"),
widget=forms.Select(attrs={
'class': 'switched',
'data-switch-on': 'net',
'data-net-%s' % net.id: _("Neutron Subnet")
}))
self.fields[subnet_field_name] = subnet_field
subnet_choices = neutron.subnet_list(
request, network_id=net.id)
self.fields[subnet_field_name].choices = [
(' ', ' ')] + [(choice.id, choice.name_or_id)
for choice in subnet_choices]
else:
self.fields['nova_net_id'] = forms.ChoiceField(
choices=[(' ', ' ')] + [(choice.id, choice.name_or_id)
for choice in net_choices],
label=_("Nova Net"), widget=forms.Select(
attrs={'class': 'switched', 'data-slug': 'net'}))
def handle(self, request, data):
try:
send_data = {'name': data['name']}
if data['description']:
send_data['description'] = data['description']
share_net_id = data.get('neutron_net_id', data.get('nova_net_id'))
share_net_id = share_net_id.strip()
if self.neutron_enabled and share_net_id:
send_data['neutron_net_id'] = share_net_id
subnet_key = 'subnet-choices-%s' % share_net_id
if subnet_key in data:
send_data['neutron_subnet_id'] = data[subnet_key]
elif not self.neutron_enabled and share_net_id:
send_data['nova_net_id'] = data['nova_net_id']
share_network = manila.share_network_create(request, **send_data)
messages.success(request, _('Successfully created share'
' network: %s') % send_data['name'])
return share_network
except Exception:
exceptions.handle(request, _('Unable to create share network.'))
return False
class Update(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Share Name"))
description = forms.CharField(widget=forms.Textarea,
label=_("Description"), required=False)
def handle(self, request, data, *args, **kwargs):
share_net_id = self.initial['share_network_id']
try:
manila.share_network_update(request, share_net_id,
name=data['name'],
description=data['description'])
message = _('Updating share network "%s"') % data['name']
messages.info(request, message)
return True
except Exception:
redirect = reverse("horizon:project:shares:index")
exceptions.handle(request,
_('Unable to update share network.'),
redirect=redirect)
class AddSecurityServiceForm(forms.SelfHandlingForm):
sec_service = forms.MultipleChoiceField(
label=_("Networks"),
required=True,
widget=forms.CheckboxSelectMultiple(),
error_messages={
'required': _(
"At least one security service"
" must be specified.")})
def __init__(self, request, *args, **kwargs):
super(AddSecurityServiceForm, self).__init__(
request, *args, **kwargs)
sec_services_choices = manila.security_service_list(request)
self.fields['sec_service'].choices = [(' ', ' ')] + \
[(choice.id, choice.name or
choice.id) for choice in
sec_services_choices]
def handle(self, request, data):
pass
manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/templates/ 0000775 0001750 0001750 00000000000 13647271736 026202 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/templates/share_networks/ 0000775 0001750 0001750 00000000000 13647271736 031240 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/templates/share_networks/detail.html 0000664 0001750 0001750 00000000343 13647271543 033364 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Network Details" %}{% endblock %}
{% block main %}
{% blocktrans trimmed %}
Share networks contain network data, that will be used
for creation of service VM, where will be hosted shares.
{% endblocktrans %}
{% for sec_service in share_network.sec_services %}
{% url 'horizon:project:security_services:security_service_detail' sec_service.id as sec_service_url%}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/tables.py 0000664 0001750 0001750 00000011351 13647271543 026025 0 ustar zuul zuul 0000000 0000000 # 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.
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 openstack_dashboard.api import base
from openstack_dashboard.api import neutron
from manila_ui.api import manila
from manila_ui.api import network
DELETABLE_STATES = ("INACTIVE", "ERROR")
EDITABLE_STATES = ("INACTIVE", )
class Create(tables.LinkAction):
name = "create_share_network"
verbose_name = _("Create Share Network")
url = "horizon:project:share_networks:share_network_create"
classes = ("ajax-modal", "btn-create")
icon = "plus"
policy_rules = (("share", "share_network:create"),)
class Delete(tables.DeleteAction):
policy_rules = (("share", "share_network:delete"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Network",
u"Delete Share Networks",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Network",
u"Deleted Share Networks",
count
)
def delete(self, request, obj_id):
manila.share_network_delete(request, obj_id)
def allowed(self, request, obj=None):
if obj:
# NOTE: leave it True until statuses become used
# return obj.status in DELETABLE_STATES
return True
return True
class EditShareNetwork(tables.LinkAction):
name = "edit"
verbose_name = _("Edit Share Network")
url = "horizon:project:share_networks:share_network_update"
classes = ("ajax-modal", "btn-create")
policy_rules = (("share", "share_network:update"),)
def allowed(self, request, obj_id):
# sn = manila.share_network_get(request, obj_id)
# return sn.status in EDITABLE_STATES
# NOTE: leave it always True, until statuses become used
return True
class UpdateRow(tables.Row):
ajax = True
def get_data(self, request, share_net_id):
share_net = manila.share_network_get(request, share_net_id)
neutron_enabled = base.is_service_enabled(request, 'network')
if neutron_enabled:
share_net.neutron_net = neutron.network_get(
request, share_net.neutron_net_id).name_or_id
share_net.neutron_subnet = neutron.subnet_get(
request, share_net.neutron_subnet_id).name_or_id
else:
share_net.nova_net = network.network_get(
request, share_net.nova_net_id).name_or_id
return share_net
class ShareNetworksTable(tables.DataTable):
STATUS_CHOICES = (
("ACTIVE", True),
("INACTIVE", True),
("ERROR", False),
)
STATUS_DISPLAY_CHOICES = (
("ACTIVE", pgettext_lazy("Current status of share network",
u"Active")),
("INACTIVE", pgettext_lazy("Current status of share network",
u"Inactive")),
("ERROR", pgettext_lazy("Current status of share network", u"Error")),
)
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:project:share_networks:share_network_detail")
neutron_net = tables.Column("neutron_net", verbose_name=_("Neutron Net"))
neutron_subnet = tables.Column(
"neutron_subnet", verbose_name=_("Neutron Subnet"))
ip_version = tables.Column("ip_version", verbose_name=_("IP Version"))
network_type = tables.Column(
"network_type", verbose_name=_("Network Type"))
segmentation_id = tables.Column(
"segmentation_id", verbose_name=_("Segmentation Id"))
def get_object_display(self, share_network):
return share_network.name or str(share_network.id)
def get_object_id(self, share_network):
return str(share_network.id)
class Meta(object):
name = "share_networks"
verbose_name = _("Share Networks")
table_actions = (
tables.NameFilterAction,
Create,
Delete,
)
row_class = UpdateRow
row_actions = (
EditShareNetwork,
Delete,
)
manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/urls.py 0000664 0001750 0001750 00000002250 13647271543 025536 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.conf import urls
from manila_ui.dashboards.project.share_networks import views
urlpatterns = [
urls.url(
r'^$',
views.ShareNetworksView.as_view(),
name='index'),
urls.url(
r'^create_share_network$',
views.Create.as_view(),
name='share_network_create'),
urls.url(
r'^(?P[^/]+)/update$',
views.Update.as_view(),
name='share_network_update'),
urls.url(
r'^(?P[^/]+)$',
views.Detail.as_view(),
name='share_network_detail'),
]
manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/workflows.py 0000664 0001750 0001750 00000013635 13647271543 026617 0 ustar zuul zuul 0000000 0000000 # Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 forms
from horizon import workflows
from manila_ui.api import manila
class UpdateShareNetworkInfoAction(workflows.Action):
name = forms.CharField(label=_("Name"),
max_length=255)
description = forms.CharField(label=_("Description"),
max_length=255,
required=False)
def __init__(self, request, *args, **kwargs):
super(UpdateShareNetworkInfoAction, self).__init__(
request, *args, **kwargs)
share_network = manila.share_network_get(request,
self.initial['id'])
self.fields['name'].initial = share_network.name
self.fields['description'].initial = share_network.description
class Meta(object):
name = _("Share Network Info")
help_text = _("From here you can update share network info. ")
slug = "update-share_network_info"
def clean(self):
cleaned_data = super(UpdateShareNetworkInfoAction, self).clean()
return cleaned_data
class UpdateShareNetworkInfoStep(workflows.Step):
action_class = UpdateShareNetworkInfoAction
contributes = ("description",
"name")
class AddSecurityServiceAction(workflows.MembershipAction):
def __init__(self, request, *args, **kwargs):
super(AddSecurityServiceAction, self).__init__(request,
*args,
**kwargs)
err_msg = _('Unable to get the security services hosts')
default_role_field_name = self.get_default_role_field_name()
self.fields[default_role_field_name] = forms.CharField(required=False)
self.fields[default_role_field_name].initial = 'member'
field_name = self.get_member_field_name('member')
self.fields[field_name] = forms.MultipleChoiceField(required=False)
share_network_id = self.initial['id']
security_services = manila.share_network_security_service_list(
request, share_network_id)
sec_services_initial = [sec_service.id for sec_service
in security_services]
sec_services = []
try:
sec_services = manila.security_service_list(request)
except Exception:
exceptions.handle(request, err_msg)
sec_services_choices = [(sec_service.id,
sec_service.name or sec_service.id)
for sec_service in sec_services]
self.fields[field_name].choices = sec_services_choices
self.fields[field_name].initial = sec_services_initial
class Meta(object):
name = _("Security services within share network")
slug = "add_security_service"
class AddSecurityServiceStep(workflows.UpdateMembersStep):
action_class = AddSecurityServiceAction
help_text = _("Add security services to share network.")
available_list_title = _("Available security services")
members_list_title = _("Selected security services")
no_available_text = _("No security services found.")
no_members_text = _("No security services selected.")
show_roles = False
depends_on = ("id",)
contributes = ("security_services",)
def contribute(self, data, context):
if data:
member_field_name = self.get_member_field_name('member')
context['security_service'] = data.get(member_field_name, [])
return context
class UpdateShareNetworkWorkflow(workflows.Workflow):
slug = "update_share_network"
name = _("Update Share Network")
finalize_button_name = _("Update Share Network")
success_message = _('Updated share network "%s".')
failure_message = _('Unable to update share network "%s".')
success_url = 'horizon:project:share_networks:index'
default_steps = (UpdateShareNetworkInfoStep, AddSecurityServiceStep)
def format_status_message(self, message):
return message % self.context['name']
def handle(self, request, context):
try:
manila.share_network_update(request, context['id'],
description=context['description'],
name=context['name'])
sec_services = manila.security_service_list(request, search_opts={
'share_network_id': context['id']})
sec_services_old = set([sec_service.id
for sec_service in sec_services])
sec_services_new = set(context['security_service'])
for sec_service in sec_services_new - sec_services_old:
manila.share_network_security_service_add(request,
context['id'],
sec_service)
for sec_service in sec_services_old - sec_services_new:
manila.share_network_security_service_remove(request,
context['id'],
sec_service)
return True
except Exception:
exceptions.handle(request, _('Unable to update share network.'))
return False
manila-ui-3.0.0/manila_ui/dashboards/project/share_networks/__init__.py 0000664 0001750 0001750 00000000000 13647271543 026277 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/ 0000775 0001750 0001750 00000000000 13647271736 025566 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/views.py 0000664 0001750 0001750 00000015162 13647271543 027276 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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.
"""
Project views for managing share group snapshots.
"""
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import tabs
from horizon.utils import memoized
from manila_ui.api import manila
import manila_ui.dashboards.project.share_group_snapshots.forms as sgs_forms
import manila_ui.dashboards.project.share_group_snapshots.tables as sgs_tables
import manila_ui.dashboards.project.share_group_snapshots.tabs as sgs_tabs
class ShareGroupSnapshotsView(tables.MultiTableView):
table_classes = (
sgs_tables.ShareGroupSnapshotsTable,
)
template_name = "project/share_group_snapshots/index.html"
page_title = _("Share Group Snapshots")
@memoized.memoized_method
def get_share_group_snapshots_data(self):
share_group_snapshots = []
try:
share_group_snapshots = manila.share_group_snapshot_list(
self.request, search_opts={'all_tenants': True})
share_groups = manila.share_group_list(self.request)
sg_names = dict([(sg.id, sg.name or sg.id) for sg in share_groups])
for snapshot in share_group_snapshots:
snapshot.share_group = sg_names.get(snapshot.share_group_id)
except Exception:
msg = _("Unable to retrieve share group snapshot list.")
exceptions.handle(self.request, msg)
return share_group_snapshots
class ShareGroupSnapshotDetailView(tabs.TabView):
tab_group_class = sgs_tabs.ShareGroupSnapshotDetailTabs
template_name = "project/share_group_snapshots/detail.html"
redirect_url = reverse_lazy("horizon:project:share_group_snapshots:index")
def get_context_data(self, **kwargs):
context = super(ShareGroupSnapshotDetailView, self).get_context_data(
**kwargs)
snapshot = self.get_data()
snapshot_display_name = snapshot.name or snapshot.id
context["snapshot"] = snapshot
context["snapshot_display_name"] = snapshot_display_name
context["page_title"] = _(
"Share Group Snapshot Details: %(sgs_display_name)s") % (
{'sgs_display_name': snapshot_display_name})
return context
@memoized.memoized_method
def get_data(self):
try:
share_group_snapshot = manila.share_group_snapshot_get(
self.request, self.kwargs['share_group_snapshot_id'])
sg = manila.share_group_get(
self.request, share_group_snapshot.share_group_id)
share_group_snapshot.sg_name_or_id = sg.name or sg.id
except Exception:
exceptions.handle(
self.request,
_('Unable to retrieve share group snapshot details.'),
redirect=self.redirect_url)
return share_group_snapshot
def get_tabs(self, request, *args, **kwargs):
return self.tab_group_class(
request, share_group_snapshot=self.get_data(), **kwargs)
class CreateShareGroupSnapshotView(forms.ModalFormView):
form_class = sgs_forms.CreateShareGroupSnapshotForm
form_id = "create_share_group_snapshot"
template_name = 'project/share_group_snapshots/create.html'
modal_header = _("Create Share Group Snapshot")
modal_id = "create_share_group_snapshot_modal"
submit_label = _("Create Share Group Snapshot")
submit_url = "horizon:project:share_group_snapshots:create"
success_url = reverse_lazy('horizon:project:share_group_snapshots:index')
page_title = _('Create Share Group Snapshot')
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
sg_id = self.kwargs['share_group_id']
try:
sg = manila.share_group_get(self.request, sg_id)
context['share_group_name'] = sg.name or sg_id
except Exception:
exceptions.handle(
self.request,
_("Unable to get the specified share group '%s' for "
"snapshot creation.") % sg_id)
context['share_group_name'] = sg_id
context['share_group_id'] = sg_id
# TODO(vponomaryov): add support of quotas when it is implemented
# for share group snapshots on server side.
return context
def get_initial(self):
self.submit_url = reverse(self.submit_url, kwargs=self.kwargs)
return {'share_group_id': self.kwargs["share_group_id"]}
class UpdateShareGroupSnapshotView(forms.ModalFormView):
form_class = sgs_forms.UpdateShareGroupSnapshotForm
form_id = "update_share_group_snapshot"
template_name = 'project/share_group_snapshots/update.html'
modal_header = _("Update Share Group Snapshot")
modal_id = "update_share_group_snapshot_modal"
submit_label = _("Update")
submit_url = "horizon:project:share_group_snapshots:update"
success_url = reverse_lazy('horizon:project:share_group_snapshots:index')
page_title = _('Update Share Group')
@memoized.memoized_method
def get_object(self):
if not hasattr(self, "_object"):
try:
self._object = manila.share_group_snapshot_get(
self.request, self.kwargs['share_group_snapshot_id'])
except Exception:
msg = _('Unable to retrieve share group snapshot.')
url = reverse('horizon:project:share_group_snapshots:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
args = (self.get_object().id,)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
snapshot = self.get_object()
return {
'share_group_snapshot_id': self.kwargs["share_group_snapshot_id"],
'name': snapshot.name,
'description': snapshot.description,
}
manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/tabs.py 0000664 0001750 0001750 00000002275 13647271543 027073 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
from horizon import tabs
class ShareGroupSnapshotOverviewTab(tabs.Tab):
name = _("Share Group Snapshot Overview")
slug = "share_group_snapshot_overview_tab"
template_name = "project/share_group_snapshots/_detail.html"
def get_context_data(self, request):
return {"share_group_snapshot": self.tab_group.kwargs[
"share_group_snapshot"]}
class ShareGroupSnapshotDetailTabs(tabs.TabGroup):
slug = "share_group_snapshot_details"
tabs = (
ShareGroupSnapshotOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/panel.py 0000664 0001750 0001750 00000001737 13647271543 027243 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.project import dashboard
class ShareGroupSnapshots(horizon.Panel):
name = _("Share Group Snapshots")
slug = 'share_group_snapshots'
permissions = (
'openstack.services.share',
)
dashboard.Project.register(ShareGroupSnapshots)
manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/forms.py 0000664 0001750 0001750 00000005603 13647271543 027266 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from manila_ui.api import manila
class CreateShareGroupSnapshotForm(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Name"), required=True)
description = forms.CharField(
widget=forms.Textarea,
label=_("Description"),
required=False)
def __init__(self, request, *args, **kwargs):
super(self.__class__, self).__init__(request, *args, **kwargs)
# populate share_group_id
sg_id = kwargs.get('initial', {}).get('share_group_id', [])
self.fields['share_group_id'] = forms.CharField(
widget=forms.HiddenInput(), initial=sg_id)
def handle(self, request, data):
try:
snapshot = manila.share_group_snapshot_create(
request,
data['share_group_id'], data['name'], data['description'])
message = _('Creating share group snapshot "%s".') % data['name']
messages.success(request, message)
return snapshot
except Exception:
redirect = reverse("horizon:project:share_group_snapshots:index")
exceptions.handle(
request,
_('Unable to create share group snapshot.'),
redirect=redirect)
return False
class UpdateShareGroupSnapshotForm(forms.SelfHandlingForm):
name = forms.CharField(
max_length="255", label=_("Name"))
description = forms.CharField(
widget=forms.Textarea, label=_("Description"), required=False)
def handle(self, request, data):
sgs_id = self.initial['share_group_snapshot_id']
try:
manila.share_group_snapshot_update(
request, sgs_id, data['name'], data['description'])
message = _('Updating share group snapshot "%s"') % data['name']
messages.success(request, message)
return True
except Exception:
redirect = reverse("horizon:project:share_group_snapshots:index")
exceptions.handle(
request, _('Unable to update share group snapshot.'),
redirect=redirect)
return False
manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/templates/ 0000775 0001750 0001750 00000000000 13647271736 027564 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/templates/share_group_snapshots/ 0000775 0001750 0001750 00000000000 13647271736 034204 5 ustar zuul zuul 0000000 0000000 ././@LongLink 0000000 0000000 0000000 00000000157 00000000000 011220 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/templates/share_group_snapshots/detail.html manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/templates/share_group_snapshots/d0000664 0001750 0001750 00000000352 13647271543 034346 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Group Snapshot Details" %}{% endblock %}
{% block main %}
{% trans "From here you can modify name and description of a share group snapshot." %}
{% endblock %}
././@LongLink 0000000 0000000 0000000 00000000157 00000000000 011220 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/templates/share_group_snapshots/update.html manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/templates/share_group_snapshots/u0000664 0001750 0001750 00000000323 13647271543 034365 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Update Share Group Snapshot" %}{% endblock %}
{% block main %}
{% include 'project/share_group_snapshots/_update.html' %}
{% endblock %}
././@LongLink 0000000 0000000 0000000 00000000156 00000000000 011217 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/templates/share_group_snapshots/index.html manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/templates/share_group_snapshots/i0000664 0001750 0001750 00000000365 13647271543 034357 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Group Snapshots" %}{% endblock %}
{% block main %}
{{ share_group_snapshots_table.render }}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/tables.py 0000664 0001750 0001750 00000013120 13647271543 027403 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.template.defaultfilters import title
from django.urls import reverse
from django.utils.http import urlencode
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 tables
from horizon.utils import filters
from manila_ui.api import manila
class UpdateShareGroupSnapshot(tables.LinkAction):
name = "update_share_group_snapshot"
verbose_name = _("Update")
url = "horizon:project:share_group_snapshots:update"
classes = ("ajax-modal", "btn-camera")
def allowed(self, request, share_group_snapshot=None):
return share_group_snapshot.status in ("available", "error")
class CreateShareGroupSnapshot(tables.LinkAction):
name = "create_share_group_snapshot"
verbose_name = _("Create Share Group Snapshot")
url = "horizon:project:share_group_snapshots:create"
classes = ("ajax-modal", "btn-camera")
def allowed(self, request, share_group=None):
self.verbose_name = _("Create Share Group Snapshot")
classes = [c for c in self.classes if c != "disabled"]
self.classes = classes
return share_group.status == "available"
class CreateShareGroupFromSnapshot(tables.LinkAction):
name = "create_share_group_from_snapshot"
verbose_name = _("Create Share Group")
url = "horizon:project:share_groups:create"
classes = ("ajax-modal", "btn-camera")
def get_link_url(self, datum):
base_url = reverse(self.url)
params = urlencode({
"snapshot_id": self.table.get_object_id(datum)})
return "?".join([base_url, params])
def allowed(self, request, share_group=None):
return share_group.status == "available"
class ShareGroupSnapshotShareGroupNameColumn(tables.Column):
def get_link_url(self, snapshot):
return reverse(self.link, args=(snapshot.share_group_id,))
class DeleteShareGroupSnapshot(tables.DeleteAction):
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Group Snapshot",
u"Delete Share Group Snapshots",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Group Snapshot",
u"Deleted Share Group Snapshots",
count
)
def delete(self, request, obj_id):
obj = self.table.get_object_by_id(obj_id)
name = self.table.get_object_display(obj)
try:
manila.share_group_snapshot_delete(request, obj_id)
except Exception:
msg = _('Unable to delete share group snapshot "%s". '
'One or more share groups depend on it.')
exceptions.handle(self.request, msg % name)
raise
def allowed(self, request, snapshot=None):
if snapshot:
return snapshot.status.lower() in ('available', 'error')
return True
class UpdateShareGroupSnapshotRow(tables.Row):
ajax = True
def get_data(self, request, share_group_snapshot_id):
snapshot = manila.share_group_snapshot_get(
request, share_group_snapshot_id)
if not snapshot.name:
snapshot.name = share_group_snapshot_id
return snapshot
class ShareGroupSnapshotsTable(tables.DataTable):
STATUS_CHOICES = (
("available", True),
("creating", None),
("error", False),
)
STATUS_DISPLAY_CHOICES = (
("available",
pgettext_lazy("Current status of snapshot", u"Available")),
("creating", pgettext_lazy("Current status of snapshot", u"Creating")),
("error", pgettext_lazy("Current status of snapshot", u"Error")),
)
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:project:share_group_snapshots:detail")
description = tables.Column(
"description",
verbose_name=_("Description"),
truncate=40)
created_at = tables.Column(
"created_at",
verbose_name=_("Created at"),
filters=(
filters.parse_isotime,
))
status = tables.Column(
"status",
filters=(title,),
verbose_name=_("Status"),
status=True,
status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES)
source = ShareGroupSnapshotShareGroupNameColumn(
"share_group",
verbose_name=_("Source"),
link="horizon:project:share_groups:detail")
def get_object_display(self, obj):
return obj.name
class Meta(object):
name = "share_group_snapshots"
verbose_name = _("Share Group Snapshots")
status_columns = ["status"]
row_class = UpdateShareGroupSnapshotRow
table_actions = (
tables.NameFilterAction,
DeleteShareGroupSnapshot,
)
row_actions = (
CreateShareGroupFromSnapshot,
UpdateShareGroupSnapshot,
DeleteShareGroupSnapshot,
)
manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/urls.py 0000664 0001750 0001750 00000002575 13647271543 027132 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.conf import urls
from manila_ui.dashboards.project.share_group_snapshots import views
from manila_ui import features
if features.is_share_groups_enabled():
urlpatterns = [
urls.url(
r'^$',
views.ShareGroupSnapshotsView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)/snapshot_create/$',
views.CreateShareGroupSnapshotView.as_view(),
name='create'),
urls.url(
r'^(?P[^/]+)/$',
views.ShareGroupSnapshotDetailView.as_view(),
name='detail'),
urls.url(
r'^(?P[^/]+)/update/$',
views.UpdateShareGroupSnapshotView.as_view(),
name='update'),
]
manila-ui-3.0.0/manila_ui/dashboards/project/share_group_snapshots/__init__.py 0000664 0001750 0001750 00000000000 13647271543 027661 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/ 0000775 0001750 0001750 00000000000 13647271736 023647 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/views.py 0000664 0001750 0001750 00000013224 13647271543 025354 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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.
"""
Project views for managing share groups.
"""
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import tabs
from horizon.utils import memoized
from manila_ui.api import manila
from manila_ui.dashboards.project.share_groups import forms as sg_forms
from manila_ui.dashboards.project.share_groups import tables as sg_tables
from manila_ui.dashboards.project.share_groups import tabs as sg_tabs
class ShareGroupsView(tables.MultiTableView):
table_classes = (
sg_tables.ShareGroupsTable,
)
template_name = "project/share_groups/index.html"
page_title = _("Share Groups")
@memoized.memoized_method
def get_share_groups_data(self):
try:
share_groups = manila.share_group_list(
self.request, detailed=True)
except Exception:
share_groups = []
exceptions.handle(
self.request, _("Unable to retrieve share groups."))
return share_groups
class ShareGroupDetailView(tabs.TabView):
tab_group_class = sg_tabs.ShareGroupDetailTabs
template_name = 'project/share_groups/detail.html'
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
share_group = self.get_data()
context["share_group"] = share_group
context["page_title"] = (
_("Share Group Details: %s") % share_group.id)
return context
@memoized.memoized_method
def get_data(self):
try:
share_group_id = self.kwargs['share_group_id']
share_group = manila.share_group_get(self.request, share_group_id)
members = manila.share_list(
self.request, search_opts={"share_group_id": share_group_id})
share_group.members = members
share_types = manila.share_type_list(self.request)
share_group.share_group_type = manila.share_group_type_get(
self.request, share_group.share_group_type_id)
share_group.share_types = [
{"id": st.id,
"name": st.name,
"is_public": getattr(st, 'share_type_access:is_public'),
"dhss": st.extra_specs.get('driver_handles_share_servers')}
for st in share_types if st.id in share_group.share_types
]
return share_group
except Exception:
redirect = reverse('horizon:project:share_groups:index')
exceptions.handle(
self.request,
_('Unable to retrieve share group details.'),
redirect=redirect)
def get_tabs(self, request, *args, **kwargs):
share_group = self.get_data()
return self.tab_group_class(request, share_group=share_group, **kwargs)
class ShareGroupCreateView(forms.ModalFormView):
form_class = sg_forms.CreateShareGroupForm
form_id = "create_share_group"
template_name = 'project/share_groups/create.html'
modal_header = _("Create Share Group")
modal_id = "create_share_group_modal"
submit_label = _("Create")
submit_url = reverse_lazy("horizon:project:share_groups:create")
success_url = reverse_lazy("horizon:project:share_groups:index")
page_title = _('Create a Share')
def get_context_data(self, **kwargs):
context = super(ShareGroupCreateView, self).get_context_data(**kwargs)
try:
# TODO(vponomaryov): add quota logic here when quotas are
# implemented for share groups.
pass
except Exception:
exceptions.handle(self.request)
return context
class ShareGroupUpdateView(forms.ModalFormView):
form_class = sg_forms.UpdateShareGroupForm
form_id = "update_share_group"
template_name = 'project/share_groups/update.html'
modal_header = _("Update")
modal_id = "update_share_group_modal"
submit_label = _("Update")
submit_url = "horizon:project:share_groups:update"
success_url = reverse_lazy("horizon:project:share_groups:index")
page_title = _("Update Share Group")
def get_object(self):
if not hasattr(self, "_object"):
sg_id = self.kwargs['share_group_id']
try:
self._object = manila.share_group_get(self.request, sg_id)
except Exception:
msg = _('Unable to retrieve share group.')
url = reverse('horizon:project:share_groups:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(ShareGroupUpdateView, self).get_context_data(**kwargs)
return context
def get_initial(self):
self.submit_url = reverse(self.submit_url, kwargs=self.kwargs)
sg = self.get_object()
return {
'share_group_id': self.kwargs["share_group_id"],
'name': sg.name,
'description': sg.description,
}
manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/tabs.py 0000664 0001750 0001750 00000002142 13647271543 025145 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
from horizon import tabs
class ShareGroupOverviewTab(tabs.Tab):
name = _("Share Group Overview")
slug = "share_group_overview_tab"
template_name = "project/share_groups/_detail.html"
def get_context_data(self, request):
return {"share_group": self.tab_group.kwargs["share_group"]}
class ShareGroupDetailTabs(tabs.TabGroup):
slug = "share_group_details"
tabs = (
ShareGroupOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/panel.py 0000664 0001750 0001750 00000001675 13647271543 025325 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.project import dashboard
class ShareGroups(horizon.Panel):
name = _("Share Groups")
slug = 'share_groups'
permissions = (
'openstack.services.share',
)
dashboard.Project.register(ShareGroups)
manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/forms.py 0000664 0001750 0001750 00000025752 13647271543 025356 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.forms import ValidationError
from django.urls 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 manila_ui.api import manila
class CreateShareGroupForm(forms.SelfHandlingForm):
name = forms.CharField(label=_("Name"), max_length="255", required=True)
description = forms.CharField(
label=_("Description"),
max_length="255",
widget=forms.Textarea(attrs={"rows": 3}),
required=False)
def __init__(self, request, *args, **kwargs):
super(CreateShareGroupForm, self).__init__(request, *args, **kwargs)
self.st_field_name_prefix = "share-type-choices-"
self.fields["source_type"] = forms.ChoiceField(
label=_("Source Type"),
widget=forms.Select(attrs={
"class": "switchable",
"data-slug": "source",
}),
required=False)
self.fields["snapshot"] = forms.ChoiceField(
label=_("Use share group snapshot as a source"),
widget=forms.SelectWidget(attrs={
"class": "switched",
"data-switch-on": "source",
"data-source-snapshot": _("Share Group Snapshot"),
}),
required=True)
if ("snapshot_id" in request.GET or
kwargs.get("data", {}).get("snapshot")):
try:
snapshot = self.get_share_group_snapshot(
request,
request.GET.get(
"snapshot_id",
kwargs.get("data", {}).get("snapshot")))
self.fields["name"].initial = snapshot.name
self.fields["snapshot"].choices = (
(snapshot.id, snapshot.name or snapshot.id),
)
try:
# Set the share group type from the original share group
orig_sg = manila.share_group_get(
request, snapshot.share_group_id)
self.fields["sgt"].initial = orig_sg.share_group_type_id
except Exception:
pass
del self.fields["source_type"]
except Exception:
exceptions.handle(
request,
_("Unable to load the specified share group snapshot."))
else:
source_type_choices = []
try:
snapshot_list = manila.share_group_snapshot_list(request)
snapshots = [s for s in snapshot_list
if s.status == "available"]
if snapshots:
source_type_choices.append(("snapshot", _("Snapshot")))
self.fields["snapshot"].choices = (
[("", _("Choose a snapshot"))] +
[(s.id, s.name or s.id) for s in snapshots]
)
else:
del self.fields["snapshot"]
except Exception:
exceptions.handle(
request,
_("Unable to retrieve share group snapshots."))
if source_type_choices:
choices = ([('none', _("No source, empty share group"))] +
source_type_choices)
self.fields["source_type"].choices = choices
else:
del self.fields["source_type"]
self.fields["az"] = forms.ChoiceField(
label=_("Availability Zone"),
widget=forms.SelectWidget(attrs={
"class": "switched",
"data-switch-on": "source",
"data-source-none": _("Availability Zone"),
}),
required=False)
availability_zones = manila.availability_zone_list(request)
self.fields["az"].choices = (
[("", "")] + [(az.name, az.name) for az in availability_zones])
share_group_types = manila.share_group_type_list(request)
self.fields["sgt"] = forms.ChoiceField(
label=_("Share Group Type"),
widget=forms.fields.SelectWidget(attrs={
"class": "switched switchable",
"data-switch-on": "source",
"data-source-none": _("Share Group Type"),
"data-slug": "sgt",
}),
required=True)
self.fields["sgt"].choices = (
[("", "")] + [(sgt.id, sgt.name) for sgt in share_group_types])
# NOTE(vponomaryov): create separate set of available share types
# for each of share group types.
share_types = manila.share_type_list(request)
for sgt in share_group_types:
st_choices = (
[(st.id, st.name)
for st in share_types if st.id in sgt.share_types])
amount_of_choices = len(st_choices)
st_field_name = self.st_field_name_prefix + sgt.id
if amount_of_choices < 2:
st_field = forms.ChoiceField(
label=_("Share Types"),
choices=st_choices,
widget=forms.fields.SelectWidget(attrs={
"class": "switched",
"data-switch-on": "sgt",
"data-sgt-%s" % sgt.id: _(
"Share Types (one available)"),
}),
required=True)
else:
height = min(30 * amount_of_choices, 155)
st_field = forms.MultipleChoiceField(
label=_("Share Types"),
choices=st_choices,
widget=forms.fields.widgets.SelectMultiple(attrs={
"style": "max-height: %spx;" % height,
"class": "switched",
"data-switch-on": "sgt",
"data-sgt-%s" % sgt.id: _(
"Share Types (multiple available)"),
}),
required=False)
st_field.initial = st_choices[0]
self.fields[st_field_name] = st_field
self.fields["share_network"] = forms.ChoiceField(
label=_("Share Network"),
widget=forms.fields.SelectWidget(attrs={
"class": "switched",
"data-switch-on": "source",
"data-source-none": _("Share Network"),
}),
required=False)
share_networks = manila.share_network_list(request)
self.fields["share_network"].choices = (
[("", "")] +
[(sn.id, sn.name or sn.id) for sn in share_networks])
def clean(self):
cleaned_data = super(CreateShareGroupForm, self).clean()
form_errors = list(self.errors)
for error in form_errors:
sgt_name = error.split(self.st_field_name_prefix)[-1]
chosen_sgt = cleaned_data.get("sgt")
if (error.startswith(self.st_field_name_prefix) and
sgt_name != chosen_sgt):
cleaned_data[error] = "Not set"
self.errors.pop(error, None)
source_type = cleaned_data.get("source_type")
if source_type != "snapshot":
self.errors.pop("snapshot", None)
share_group_type = cleaned_data.get("sgt")
if share_group_type:
cleaned_data["share_types"] = cleaned_data.get(
self.st_field_name_prefix + share_group_type)
if isinstance(cleaned_data["share_types"], str):
cleaned_data["share_types"] = [cleaned_data["share_types"]]
else:
self.errors.pop("sgt", None)
return cleaned_data
def handle(self, request, data):
try:
source_type = data.get('source_type')
if (data.get("snapshot") and source_type in (None, 'snapshot')):
snapshot = self.get_share_group_snapshot(
request, data["snapshot"])
snapshot_id = snapshot.id
source_sg = manila.share_group_get(
request, snapshot.share_group_id)
data['sgt'] = source_sg.share_group_type_id
else:
snapshot_id = None
share_group = manila.share_group_create(
request,
name=data['name'],
description=data['description'],
share_group_type=data['sgt'],
share_types=None if snapshot_id else data.get('share_types'),
share_network=(
None if snapshot_id else data.get('share_network')),
source_share_group_snapshot=snapshot_id,
availability_zone=None if snapshot_id else data['az'])
message = _('Creating share group "%s"') % data['name']
messages.success(request, message)
return share_group
except ValidationError as e:
self.api_error(e.messages[0])
return False
except Exception:
exceptions.handle(request, ignore=True)
self.api_error(_("Unable to create share group."))
return False
@memoized.memoized
def get_share_group_snapshot(self, request, sg_snapshot_id):
return manila.share_group_snapshot_get(request, sg_snapshot_id)
class UpdateShareGroupForm(forms.SelfHandlingForm):
name = forms.CharField(
max_length="255", label=_("Share Group Name"))
description = forms.CharField(
widget=forms.Textarea, label=_("Description"), required=False)
def handle(self, request, data):
sg_id = self.initial['share_group_id']
try:
manila.share_group_update(
request, sg_id, data['name'], data['description'])
message = _('Updating share group "%s"') % data['name']
messages.success(request, message)
return True
except Exception:
redirect = reverse("horizon:project:share_groups:index")
exceptions.handle(
request, _('Unable to update share group.'), redirect=redirect)
return False
manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/templates/ 0000775 0001750 0001750 00000000000 13647271736 025645 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/templates/share_groups/ 0000775 0001750 0001750 00000000000 13647271736 030346 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/templates/share_groups/detail.html 0000664 0001750 0001750 00000000341 13647271543 032470 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Group Details" %}{% endblock %}
{% block main %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/tables.py 0000664 0001750 0001750 00000011602 13647271543 025467 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis, 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 django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
from horizon import tables
from manila_ui.api import manila
import manila_ui.dashboards.project.share_group_snapshots.tables as sgs_tables
class UpdateShareGroup(tables.LinkAction):
name = "update"
verbose_name = _("Update")
url = "horizon:project:share_groups:update"
classes = ("ajax-modal", "btn-create")
def allowed(self, request, share_group=None):
return share_group.status in ("available", "error")
class DeleteShareGroup(tables.DeleteAction):
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Group",
u"Delete Share Groups",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Group",
u"Deleted Share Groups",
count
)
def delete(self, request, obj_id):
manila.share_group_delete(request, obj_id)
def allowed(self, request, share_group=None):
if share_group:
# Row button
return (share_group.status.lower() in ('available', 'error'))
# Table button. Always return 'True'
return True
class CreateShareGroup(tables.LinkAction):
name = "create"
verbose_name = _("Create Share Group")
url = "horizon:project:share_groups:create"
classes = ("ajax-modal", "btn-create")
icon = "plus"
policy_rules = (("share", "share_group:create"),)
def allowed(self, request, share=None):
# TODO(vponomaryov): implement quota restriction when quota support
# is implemented for share groups.
return True
class UpdateShareGroupRow(tables.Row):
ajax = True
def get_data(self, request, sg_id):
sg = manila.share_group_get(request, sg_id)
return sg
class ShareGroupsTable(tables.DataTable):
def get_share_network_link(share_group):
if getattr(share_group, 'share_network_id', None):
return reverse(
"horizon:project:share_networks:share_network_detail",
args=(share_group.share_network_id,))
else:
return None
def get_source_share_group_snapshot_link(share_group):
if getattr(share_group, 'source_share_group_snapshot_id', None):
return reverse(
"horizon:project:share_group_snapshots:detail",
args=(share_group.source_share_group_snapshot_id,))
else:
return None
STATUS_CHOICES = (
("available", True),
("creating", None),
("deleting", None),
("error", False),
("error_deleting", False),
)
STATUS_DISPLAY_CHOICES = (
("available", u"Available"),
("creating", u"Creating"),
("deleting", u"Deleting"),
("error", u"Error"),
("error_deleting", u"Error deleting"),
)
name = tables.Column(
"name",
verbose_name=_("Name"),
link="horizon:project:share_groups:detail")
status = tables.Column(
"status",
verbose_name=_("Status"),
status=True,
status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES,
)
availability_zone = tables.Column(
"availability_zone",
verbose_name=_("Availability Zone"))
share_network_id = tables.Column(
"share_network_id",
verbose_name=_("Share Network"),
link=get_share_network_link)
source_share_group_snapshot_id = tables.Column(
"source_share_group_snapshot_id",
verbose_name=_("Source Share Group Snapshot"),
link=get_source_share_group_snapshot_link)
def get_object_display(self, share_group):
return str(share_group.id)
def get_object_id(self, share_group):
return str(share_group.id)
class Meta(object):
name = "share_groups"
verbose_name = _("Share Groups")
status_columns = ("status", )
row_class = UpdateShareGroupRow
table_actions = (
CreateShareGroup,
tables.NameFilterAction,
DeleteShareGroup,
)
row_actions = (
sgs_tables.CreateShareGroupSnapshot,
UpdateShareGroup,
DeleteShareGroup,
)
manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/urls.py 0000664 0001750 0001750 00000002436 13647271543 025207 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 Mirantis 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 django.conf import urls
from manila_ui.dashboards.project.share_groups import views
from manila_ui import features
if features.is_share_groups_enabled():
urlpatterns = [
urls.url(
r'^$',
views.ShareGroupsView.as_view(),
name='index'),
urls.url(
r'^create/$',
views.ShareGroupCreateView.as_view(),
name='create'),
urls.url(
r'^(?P[^/]+)/$',
views.ShareGroupDetailView.as_view(),
name='detail'),
urls.url(
r'^(?P[^/]+)/update/$',
views.ShareGroupUpdateView.as_view(),
name='update'),
]
manila-ui-3.0.0/manila_ui/dashboards/project/share_groups/__init__.py 0000664 0001750 0001750 00000000000 13647271543 025742 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/config.py 0000664 0001750 0001750 00000002347 13647271543 022767 0 ustar zuul zuul 0000000 0000000 #!/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.
#
# Starting with Django 1.7, when a django app is loaded, it is assigned a
# default label containing the portion of the application name after the last
# period, and this name has to be globally unique. When horizon project
# dashboard, openstack_dashboard.dashboards.project, is loaded, it is assigned
# the label 'project'. But when the manila dashboard
# manila_ui.dashboards.project is loaded, it label will conflict with
# horizon's. Therefore this AppConfig class exists merely to specify a unique
# configuration label and avoid this conflict.
#
from django import apps
class Config(apps.AppConfig):
name = 'manila_ui.dashboards.project'
label = 'manila_project'
manila-ui-3.0.0/manila_ui/dashboards/project/__init__.py 0000664 0001750 0001750 00000001366 13647271543 023261 0 ustar zuul zuul 0000000 0000000 #!/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.
# Specify a custom application configuration. The comments in that class give
# more background about why this is needed.
default_app_config = 'manila_ui.dashboards.project.config.Config'
manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/ 0000775 0001750 0001750 00000000000 13647271736 024352 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/views.py 0000664 0001750 0001750 00000022370 13647271543 026061 0 ustar zuul zuul 0000000 0000000 # 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.
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon import tabs
from horizon.utils import memoized
from manila_ui.api import manila
from manila_ui.dashboards.project.share_snapshots import forms as ss_forms
from manila_ui.dashboards.project.share_snapshots import tables as ss_tables
from manila_ui.dashboards.project.share_snapshots import tabs as ss_tabs
from manila_ui.dashboards import utils as ui_utils
class ShareSnapshotsView(tables.MultiTableView):
table_classes = (
ss_tables.ShareSnapshotsTable,
)
template_name = "project/share_snapshots/index.html"
page_title = _("Share Snapshots")
@memoized.memoized_method
def get_share_snapshots_data(self):
try:
snapshots = manila.share_snapshot_list(self.request)
shares = manila.share_list(self.request)
share_names = dict([(share.id, share.name or share.id)
for share in shares])
for snapshot in snapshots:
snapshot.share = share_names.get(snapshot.share_id)
except Exception:
msg = _("Unable to retrieve share snapshots list.")
exceptions.handle(self.request, msg)
return []
# Gather our tenants to correlate against IDs
return snapshots
class ShareSnapshotDetailView(tabs.TabView):
tab_group_class = ss_tabs.ShareSnapshotDetailTabs
template_name = 'project/share_snapshots/detail.html'
redirect_url = reverse_lazy('horizon:project:share_snapshots:index')
def get_context_data(self, **kwargs):
context = super(ShareSnapshotDetailView, self).get_context_data(
**kwargs)
snapshot = self.get_data()
snapshot_display_name = snapshot.name or snapshot.id
context["snapshot"] = snapshot
context["snapshot_display_name"] = snapshot_display_name
context["page_title"] = _("Snapshot Details: "
"%(snapshot_display_name)s") % (
{'snapshot_display_name': snapshot_display_name})
return context
@memoized.memoized_method
def get_data(self):
try:
snapshot_id = self.kwargs['snapshot_id']
snapshot = manila.share_snapshot_get(self.request, snapshot_id)
share = manila.share_get(self.request, snapshot.share_id)
if share.mount_snapshot_support:
snapshot.rules = manila.share_snapshot_rules_list(
self.request, snapshot_id)
snapshot.export_locations = (
manila.share_snap_export_location_list(
self.request, snapshot))
export_locations = [
exp['path'] for exp in snapshot.export_locations
]
snapshot.el_size = ui_utils.calculate_longest_str_size(
export_locations)
snapshot.share_name_or_id = share.name or share.id
except Exception:
exceptions.handle(
self.request,
_('Unable to retrieve snapshot details.'),
redirect=self.redirect_url)
return snapshot
def get_tabs(self, request, *args, **kwargs):
snapshot = self.get_data()
return self.tab_group_class(request, snapshot=snapshot, **kwargs)
class CreateShareSnapshotView(forms.ModalFormView):
form_class = ss_forms.CreateShareSnapshotForm
form_id = "create_share_snapshot"
template_name = 'project/share_snapshots/create.html'
modal_header = _("Create Share Snapshot")
modal_id = "create_share_snapshot_modal"
submit_label = _("Create Share Snapshot")
submit_url = "horizon:project:share_snapshots:share_snapshot_create"
success_url = reverse_lazy('horizon:project:share_snapshots:index')
page_title = _('Create Share Snapshot')
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
context['share_id'] = self.kwargs['share_id']
try:
context['usages'] = manila.tenant_absolute_limits(self.request)
except Exception:
exceptions.handle(self.request, _('Unable to retrieve quotas.'))
return context
def get_initial(self):
self.submit_url = reverse(self.submit_url, kwargs=self.kwargs)
return {'share_id': self.kwargs["share_id"]}
class UpdateShareSnapshotView(forms.ModalFormView):
form_class = ss_forms.UpdateShareSnapshotForm
form_id = "update_share_snapshot"
template_name = 'project/share_snapshots/update.html'
modal_header = _("Update Share Snapshot")
modal_id = "update_share_snapshot_modal"
submit_label = _("Update")
submit_url = "horizon:project:share_snapshots:share_snapshot_edit"
success_url = reverse_lazy('horizon:project:share_snapshots:index')
page_title = _('Edit Share Snapshot')
@memoized.memoized_method
def get_object(self):
if not hasattr(self, "_object"):
snap_id = self.kwargs['snapshot_id']
try:
self._object = manila.share_snapshot_get(self.request, snap_id)
except Exception:
msg = _('Unable to retrieve share snapshot.')
url = reverse('horizon:project:share_snapshots:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
args = (self.get_object().id,)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
snapshot = self.get_object()
return {'snapshot_id': self.kwargs["snapshot_id"],
'name': snapshot.name,
'description': snapshot.description}
class AddShareSnapshotRuleView(forms.ModalFormView):
form_class = ss_forms.AddShareSnapshotRule
form_id = "rule_add_snap"
template_name = 'project/share_snapshots/rule_add.html'
modal_header = _("Add Rule")
modal_id = "rule_add_share_snapshot_modal"
submit_label = _("Add")
submit_url = "horizon:project:share_snapshots:share_snapshot_rule_add"
success_url = reverse_lazy("horizon:project:share_snapshots:index")
page_title = _('Add Rule')
def get_object(self):
if not hasattr(self, "_object"):
snapshot_id = self.kwargs['snapshot_id']
try:
self._object = manila.share_snapshot_get(
self.request, snapshot_id)
except Exception:
msg = _('Unable to retrieve snapshot.')
url = reverse('horizon:project:share_snapshots:index')
exceptions.handle(self.request, msg, redirect=url)
return self._object
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
args = (self.get_object().id,)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
snapshot = self.get_object()
return {'snapshot_id': self.kwargs["snapshot_id"],
'name': snapshot.name,
'description': snapshot.description}
def get_success_url(self):
return reverse(
"horizon:project:share_snapshots:share_snapshot_manage_rules",
args=[self.kwargs['snapshot_id']])
class ManageShareSnapshotRulesView(tables.DataTableView):
table_class = ss_tables.ShareSnapshotRulesTable
template_name = 'project/share_snapshots/manage_rules.html'
def get_context_data(self, **kwargs):
context = super(self.__class__, self).get_context_data(**kwargs)
snapshot = manila.share_snapshot_get(
self.request, self.kwargs['snapshot_id'])
context['snapshot_display_name'] = snapshot.name or snapshot.id
context["snapshot"] = self.get_data()
context["page_title"] = _("Snapshot Rules: "
"%(snapshot_display_name)s") % {
'snapshot_display_name': context['snapshot_display_name']}
return context
@memoized.memoized_method
def get_data(self):
try:
snapshot_id = self.kwargs['snapshot_id']
rules = manila.share_snapshot_rules_list(
self.request, snapshot_id)
except Exception:
redirect = reverse('horizon:project:share_snapshots:index')
exceptions.handle(
self.request,
_('Unable to retrieve share snapshot rules.'),
redirect=redirect)
return rules
manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/tabs.py 0000664 0001750 0001750 00000002072 13647271543 025652 0 ustar zuul zuul 0000000 0000000 #
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# 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 tabs
class ShareSnapshotOverviewTab(tabs.Tab):
name = _("Share Snapshot Overview")
slug = "share_snapshot_overview_tab"
template_name = "project/share_snapshots/_detail.html"
def get_context_data(self, request):
return {"snapshot": self.tab_group.kwargs['snapshot']}
class ShareSnapshotDetailTabs(tabs.TabGroup):
slug = "share_snapshot_details"
tabs = (
ShareSnapshotOverviewTab,
)
manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/panel.py 0000664 0001750 0001750 00000001662 13647271543 026024 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.dashboards.project import dashboard
class ShareSnapshots(horizon.Panel):
name = _("Share Snapshots")
slug = 'share_snapshots'
permissions = (
'openstack.services.share',
)
dashboard.Project.register(ShareSnapshots)
manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/forms.py 0000664 0001750 0001750 00000007301 13647271543 026047 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2014 NetApp, 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.
"""
Views for managing share snapshots.
"""
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from manila_ui.api import manila
class CreateShareSnapshotForm(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Share Snapshot Name"))
description = forms.CharField(
widget=forms.Textarea,
label=_("Description"), required=False)
def __init__(self, request, *args, **kwargs):
super(self.__class__, self).__init__(request, *args, **kwargs)
# populate share_id
share_id = kwargs.get('initial', {}).get('share_id', [])
self.fields['share_id'] = forms.CharField(
widget=forms.HiddenInput(), initial=share_id)
def handle(self, request, data):
try:
snapshot = manila.share_snapshot_create(
request, data['share_id'], data['name'], data['description'])
message = _('Creating share snapshot "%s".') % data['name']
messages.success(request, message)
return snapshot
except Exception:
redirect = reverse("horizon:project:share_snapshots:index")
exceptions.handle(request,
_('Unable to create share snapshot.'),
redirect=redirect)
class UpdateShareSnapshotForm(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Share Snapshot Name"))
description = forms.CharField(
widget=forms.Textarea, label=_("Description"), required=False)
def handle(self, request, data):
snapshot_id = self.initial['snapshot_id']
try:
manila.share_snapshot_update(
request, snapshot_id, data['name'], data['description'])
message = _('Updating share snapshot "%s"') % data['name']
messages.success(request, message)
return True
except Exception:
exceptions.handle(request, _('Unable to update share snapshot.'))
class AddShareSnapshotRule(forms.SelfHandlingForm):
access_type = forms.ChoiceField(
label=_("Access Type"), required=True,
choices=(('ip', 'ip'), ('user', 'user'), ('cephx', 'cephx'),
('cert', 'cert')))
access_to = forms.CharField(
label=_("Access To"), max_length="255", required=True)
def handle(self, request, data):
snapshot_id = self.initial['snapshot_id']
try:
manila.share_snapshot_allow(
request, snapshot_id,
access_to=data['access_to'],
access_type=data['access_type'])
message = _('Creating snapshot rule for "%s"') % data['access_to']
messages.success(request, message)
return True
except Exception:
redirect = reverse(
"horizon:project:share_snapshots:share_snapshot_manage_rules",
args=[self.initial['snapshot_id']])
exceptions.handle(
request, _('Unable to add snapshot rule.'), redirect=redirect)
manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/templates/ 0000775 0001750 0001750 00000000000 13647271736 026350 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/templates/share_snapshots/ 0000775 0001750 0001750 00000000000 13647271736 031554 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/templates/share_snapshots/detail.html 0000664 0001750 0001750 00000000344 13647271543 033701 0 ustar zuul zuul 0000000 0000000 {% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Share Snapshot Details" %}{% endblock %}
{% block main %}
{% endblock %}
manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/tables.py 0000664 0001750 0001750 00000023754 13647271543 026205 0 ustar zuul zuul 0000000 0000000 # 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.
from django.template.defaultfilters import title
from django.urls import reverse
from django.utils.http import urlencode
from django.utils.text import format_lazy
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 tables
from manila_ui.api import manila
DELETABLE_STATES = ("available", "error")
class UpdateShareSnapshotRow(tables.Row):
ajax = True
def get_data(self, request, snapshot_id):
snapshot = manila.share_snapshot_get(request, snapshot_id)
if not snapshot.name:
snapshot.name = snapshot_id
return snapshot
def get_size(snapshot):
return _("%sGiB") % snapshot.size
class CreateShareSnapshot(tables.LinkAction):
name = "create_share_snapshot"
verbose_name = _("Create Share Snapshot")
url = "horizon:project:share_snapshots:share_snapshot_create"
classes = ("ajax-modal", "btn-camera")
policy_rules = (("share", "share:create_snapshot"),)
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "project_id", None)
return {"project_id": project_id}
def allowed(self, request, share=None):
usages = manila.tenant_absolute_limits(request)
snapshots_allowed = (usages['maxTotalShareSnapshots'] >
usages['totalShareSnapshotsUsed'] and
usages['maxTotalSnapshotGigabytes'] >
usages['totalSnapshotGigabytesUsed'])
if not snapshots_allowed:
if "disabled" not in self.classes:
self.classes = [c for c in self.classes] + ['disabled']
self.verbose_name = format_lazy(
'{verbose_name} {quota_exceeded}',
verbose_name=self.verbose_name,
quota_exceeded=_("(Quota exceeded)"))
else:
self.verbose_name = _("Create Share Snapshot")
classes = [c for c in self.classes if c != "disabled"]
self.classes = classes
# NOTE(vponomaryov): Disable form with creation of a snapshot for
# shares that has attr 'snapshot_support' equal to False.
if hasattr(share, 'snapshot_support'):
snapshot_support = share.snapshot_support
else:
# NOTE(vponomaryov): Allow creation of a snapshot for shares that
# do not have such attr for backward compatibility.
snapshot_support = True
return share.status in ("available", "in-use") and snapshot_support
class DeleteShareSnapshot(tables.DeleteAction):
policy_rules = (("share", "share:delete_snapshot"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Snapshot",
u"Delete Share Snapshots",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Snapshot",
u"Deleted Share Snapshots",
count
)
def get_policy_target(self, request, datum=None):
project_id = None
if datum:
project_id = getattr(datum, "project_id", None)
return {"project_id": project_id}
def delete(self, request, obj_id):
obj = self.table.get_object_by_id(obj_id)
name = self.table.get_object_display(obj)
try:
manila.share_snapshot_delete(request, obj_id)
except Exception:
msg = _('Unable to delete snapshot "%s". One or more shares '
'depend on it.')
exceptions.handle(self.request, msg % name)
raise
def allowed(self, request, snapshot=None):
if snapshot:
return snapshot.status in DELETABLE_STATES
return True
class CreateShareFromShareSnapshot(tables.LinkAction):
name = "create_share_from_share_snapshot"
verbose_name = _("Create Share")
url = "horizon:project:shares:create"
classes = ("ajax-modal", "btn-camera")
policy_rules = (("share", "share:create"),)
def get_link_url(self, datum):
base_url = reverse(self.url)
params = urlencode({"snapshot_id": self.table.get_object_id(datum)})
return "?".join([base_url, params])
def allowed(self, request, share=None):
return share.status == "available"
class EditShareSnapshot(tables.LinkAction):
name = "edit_share_snapshot"
verbose_name = _("Edit Share Snapshot")
url = "horizon:project:share_snapshots:share_snapshot_edit"
classes = ("ajax-modal", "btn-camera")
class ShareSnapshotShareNameColumn(tables.Column):
def get_link_url(self, snapshot):
return reverse(self.link, args=(snapshot.share_id,))
class ManageShareSnapshotRules(tables.LinkAction):
name = "share_snapshot_manage_rules"
verbose_name = _("Manage Share Snapshot Rules")
url = "horizon:project:share_snapshots:share_snapshot_manage_rules"
classes = ("btn-edit",)
policy_rules = (("share", "share:access_get_all"),)
def allowed(self, request, snapshot=None):
share = manila.share_get(request, snapshot.share_id)
return share.mount_snapshot_support
class AddShareSnapshotRule(tables.LinkAction):
name = "share_snapshot_rule_add"
verbose_name = _("Add Share Snapshot Rule")
url = 'horizon:project:share_snapshots:share_snapshot_rule_add'
classes = ("ajax-modal", "btn-create")
icon = "plus"
policy_rules = (("share", "share:allow_access"),)
def allowed(self, request, snapshot=None):
snapshot = manila.share_snapshot_get(
request, self.table.kwargs['snapshot_id'])
return snapshot.status in ("available", "in-use")
def get_link_url(self):
return reverse(self.url, args=[self.table.kwargs['snapshot_id']])
class DeleteShareSnapshotRule(tables.DeleteAction):
policy_rules = (("share", "share:deny_access"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Share Snapshot Rule",
u"Delete Share Snapshot Rules",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Deleted Share Snapshot Rule",
u"Deleted Share Snapshot Rules",
count
)
def delete(self, request, obj_id):
try:
manila.share_snapshot_deny(
request, self.table.kwargs['snapshot_id'], obj_id)
except Exception:
msg = _('Unable to delete snapshot rule "%s".') % obj_id
exceptions.handle(request, msg)
class UpdateShareSnapshotRuleRow(tables.Row):
ajax = True
def get_data(self, request, rule_id):
rules = manila.share_snapshot_rules_list(
request, self.table.kwargs['snapshot_id'])
if rules:
for rule in rules:
if rule.id == rule_id:
return rule
raise exceptions.NotFound
class ShareSnapshotRulesTable(tables.DataTable):
access_type = tables.Column("access_type", verbose_name=_("Access Type"))
access_to = tables.Column("access_to", verbose_name=_("Access to"))
status = tables.Column("state", verbose_name=_("Status"))
def get_object_display(self, obj):
return obj.id
class Meta(object):
name = "rules"
verbose_name = _("Share Snapshot Rules")
status_columns = ["status"]
row_class = UpdateShareSnapshotRuleRow
table_actions = (
AddShareSnapshotRule,
DeleteShareSnapshotRule,
)
row_actions = (
DeleteShareSnapshotRule,
)
class ShareSnapshotsTable(tables.DataTable):
STATUS_CHOICES = (
("in-use", True),
("available", True),
("creating", None),
("error", False),
)
STATUS_DISPLAY_CHOICES = (
("in-use", pgettext_lazy("Current status of snapshot", u"In-use")),
("available",
pgettext_lazy("Current status of snapshot", u"Available")),
("creating", pgettext_lazy("Current status of snapshot", u"Creating")),
("error", pgettext_lazy("Current status of snapshot", u"Error")),
)
name = tables.Column(
"name",
verbose_name=_("Name"),
link="horizon:project:share_snapshots:share_snapshot_detail")
description = tables.Column(
"description",
verbose_name=_("Description"),
truncate=40)
size = tables.Column(
get_size,
verbose_name=_("Size"),
attrs={'data-type': 'size'})
status = tables.Column(
"status",
filters=(title,),
verbose_name=_("Status"),
status=True,
status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES)
source = ShareSnapshotShareNameColumn(
"share",
verbose_name=_("Source"),
link="horizon:project:shares:detail")
def get_object_display(self, obj):
return obj.name
class Meta(object):
name = "share_snapshots"
verbose_name = _("Share Snapshots")
status_columns = ["status"]
row_class = UpdateShareSnapshotRow
table_actions = (
tables.NameFilterAction,
DeleteShareSnapshot,
)
row_actions = (
EditShareSnapshot,
CreateShareFromShareSnapshot,
ManageShareSnapshotRules,
DeleteShareSnapshot,
)
manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/urls.py 0000664 0001750 0001750 00000003113 13647271543 025703 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.conf import urls
from manila_ui.dashboards.project.share_snapshots import views
urlpatterns = [
urls.url(
r'^$',
views.ShareSnapshotsView.as_view(),
name='index'),
urls.url(
r'^(?P[^/]+)/share_snapshot_create/$',
views.CreateShareSnapshotView.as_view(),
name='share_snapshot_create'),
urls.url(
r'^(?P[^/]+)/share_snapshot_edit/$',
views.UpdateShareSnapshotView.as_view(),
name='share_snapshot_edit'),
urls.url(
r'^(?P[^/]+)$',
views.ShareSnapshotDetailView.as_view(),
name='share_snapshot_detail'),
urls.url(
r'^(?P[^/]+)/share_snapshot_rules/$',
views.ManageShareSnapshotRulesView.as_view(),
name='share_snapshot_manage_rules'),
urls.url(
r'^(?P[^/]+)/share_snapshot_rule_add/$',
views.AddShareSnapshotRuleView.as_view(),
name='share_snapshot_rule_add'),
]
manila-ui-3.0.0/manila_ui/dashboards/project/share_snapshots/__init__.py 0000664 0001750 0001750 00000000000 13647271543 026445 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/local/ 0000775 0001750 0001750 00000000000 13647271736 016460 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/ 0000775 0001750 0001750 00000000000 13647271736 020052 5 ustar zuul zuul 0000000 0000000 ././@LongLink 0000000 0000000 0000000 00000000157 00000000000 011220 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9020_manila_project_add_share_snapshots_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9020_manila_project_add_share_snapshots_panel_to_share_pane0000664 0001750 0001750 00000001337 13647271543 033737 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'project'
PANEL_GROUP = 'share'
PANEL = 'share_snapshots'
ADD_PANEL = 'manila_ui.dashboards.project.share_snapshots.panel.ShareSnapshots'
././@LongLink 0000000 0000000 0000000 00000000155 00000000000 011216 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9020_manila_admin_add_share_snapshots_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9020_manila_admin_add_share_snapshots_panel_to_share_panel_0000664 0001750 0001750 00000001333 13647271543 033670 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'share_snapshots'
ADD_PANEL = 'manila_ui.dashboards.admin.share_snapshots.panel.ShareSnapshots'
manila-ui-3.0.0/manila_ui/local/enabled/_9010_manila_admin_add_shares_panel_to_share_panel_group.py 0000664 0001750 0001750 00000001301 13647271543 033447 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'shares'
ADD_PANEL = 'manila_ui.dashboards.admin.shares.panel.Shares'
././@LongLink 0000000 0000000 0000000 00000000165 00000000000 011217 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9085_manila_project_add_share_group_snapshots_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9085_manila_project_add_share_group_snapshots_panel_to_shar0000664 0001750 0001750 00000001623 13647271543 034014 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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 manila_ui import features
PANEL_DASHBOARD = 'project'
PANEL_GROUP = 'share'
PANEL = 'share_group_snapshots'
if features.is_share_groups_enabled():
ADD_PANEL = ('manila_ui.dashboards.project.share_group_snapshots.panel.'
'ShareGroupSnapshots')
else:
REMOVE_PANEL = not features.is_share_groups_enabled()
././@LongLink 0000000 0000000 0000000 00000000161 00000000000 011213 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9050_manila_project_add_security_services_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9050_manila_project_add_security_services_panel_to_share_pa0000664 0001750 0001750 00000001354 13647271543 033764 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'project'
PANEL_GROUP = 'share'
PANEL = 'security_services'
ADD_PANEL = (
'manila_ui.dashboards.project.security_services.panel.SecurityServices')
././@LongLink 0000000 0000000 0000000 00000000152 00000000000 011213 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9080_manila_admin_add_share_groups_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9080_manila_admin_add_share_groups_panel_to_share_panel_gro0000664 0001750 0001750 00000001537 13647271543 033711 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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 manila_ui import features
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'share_groups'
if features.is_share_groups_enabled():
ADD_PANEL = 'manila_ui.dashboards.admin.share_groups.panel.ShareGroups'
else:
REMOVE_PANEL = not features.is_share_groups_enabled()
././@LongLink 0000000 0000000 0000000 00000000156 00000000000 011217 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9040_manila_project_add_share_networks_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9040_manila_project_add_share_networks_panel_to_share_panel0000664 0001750 0001750 00000001334 13647271543 033744 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'project'
PANEL_GROUP = 'share'
PANEL = 'share_networks'
ADD_PANEL = 'manila_ui.dashboards.project.share_networks.panel.ShareNetworks'
././@LongLink 0000000 0000000 0000000 00000000153 00000000000 011214 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9060_manila_admin_add_share_servers_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9060_manila_admin_add_share_servers_panel_to_share_panel_gr0000664 0001750 0001750 00000001325 13647271543 033675 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'share_servers'
ADD_PANEL = 'manila_ui.dashboards.admin.share_servers.panel.ShareServers'
././@LongLink 0000000 0000000 0000000 00000000157 00000000000 011220 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9090_manila_admin_add_share_group_types_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9090_manila_admin_add_share_group_types_panel_to_share_pane0000664 0001750 0001750 00000001570 13647271543 033725 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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 manila_ui import features
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'share_group_types'
if features.is_share_groups_enabled():
ADD_PANEL = (
'manila_ui.dashboards.admin.share_group_types.panel.ShareGroupTypes')
else:
REMOVE_PANEL = not features.is_share_groups_enabled()
././@LongLink 0000000 0000000 0000000 00000000154 00000000000 011215 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9080_manila_project_add_share_groups_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9080_manila_project_add_share_groups_panel_to_share_panel_g0000664 0001750 0001750 00000001543 13647271543 033723 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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 manila_ui import features
PANEL_DASHBOARD = 'project'
PANEL_GROUP = 'share'
PANEL = 'share_groups'
if features.is_share_groups_enabled():
ADD_PANEL = 'manila_ui.dashboards.project.share_groups.panel.ShareGroups'
else:
REMOVE_PANEL = not features.is_share_groups_enabled()
././@LongLink 0000000 0000000 0000000 00000000146 00000000000 011216 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9010_manila_project_add_shares_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9010_manila_project_add_shares_panel_to_share_panel_group.p0000664 0001750 0001750 00000001305 13647271543 033640 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'project'
PANEL_GROUP = 'share'
PANEL = 'shares'
ADD_PANEL = 'manila_ui.dashboards.project.shares.panel.Shares'
././@LongLink 0000000 0000000 0000000 00000000157 00000000000 011220 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9050_manila_admin_add_security_services_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9050_manila_admin_add_security_services_panel_to_share_pane0000664 0001750 0001750 00000001350 13647271543 033725 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'security_services'
ADD_PANEL = (
'manila_ui.dashboards.admin.security_services.panel.SecurityServices')
././@LongLink 0000000 0000000 0000000 00000000154 00000000000 011215 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9040_manila_admin_add_share_networks_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9040_manila_admin_add_share_networks_panel_to_share_panel_g0000664 0001750 0001750 00000001330 13647271543 033670 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'share_networks'
ADD_PANEL = 'manila_ui.dashboards.admin.share_networks.panel.ShareNetworks'
././@LongLink 0000000 0000000 0000000 00000000151 00000000000 011212 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9030_manila_admin_add_share_types_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9030_manila_admin_add_share_types_panel_to_share_panel_grou0000664 0001750 0001750 00000001317 13647271543 033712 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'share_types'
ADD_PANEL = 'manila_ui.dashboards.admin.share_types.panel.ShareTypes'
manila-ui-3.0.0/manila_ui/local/enabled/__init__.py 0000664 0001750 0001750 00000000000 13647271543 022145 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_80_manila_project_add_share_panel_group.py 0000664 0001750 0001750 00000002016 13647271543 030441 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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 manila_ui import exceptions
# The slug of the panel group to be added to HORIZON_CONFIG. Required.
PANEL_GROUP = 'share'
# The display name of the PANEL_GROUP. Required.
PANEL_GROUP_NAME = 'Share'
# The slug of the dashboard the PANEL_GROUP associated with. Required.
PANEL_GROUP_DASHBOARD = 'project'
ADD_EXCEPTIONS = {
'recoverable': exceptions.RECOVERABLE,
'not_found': exceptions.NOT_FOUND,
'unauthorized': exceptions.UNAUTHORIZED,
}
././@LongLink 0000000 0000000 0000000 00000000155 00000000000 011216 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9070_manila_admin_add_share_instances_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9070_manila_admin_add_share_instances_panel_to_share_panel_0000664 0001750 0001750 00000001333 13647271543 033642 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'share_instances'
ADD_PANEL = 'manila_ui.dashboards.admin.share_instances.panel.ShareInstances'
././@LongLink 0000000 0000000 0000000 00000000163 00000000000 011215 L ustar 0000000 0000000 manila-ui-3.0.0/manila_ui/local/enabled/_9085_manila_admin_add_share_group_snapshots_panel_to_share_panel_group.py manila-ui-3.0.0/manila_ui/local/enabled/_9085_manila_admin_add_share_group_snapshots_panel_to_share_0000664 0001750 0001750 00000001617 13647271543 033745 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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 manila_ui import features
PANEL_DASHBOARD = 'admin'
PANEL_GROUP = 'share'
PANEL = 'share_group_snapshots'
if features.is_share_groups_enabled():
ADD_PANEL = ('manila_ui.dashboards.admin.share_group_snapshots.panel.'
'ShareGroupSnapshots')
else:
REMOVE_PANEL = not features.is_share_groups_enabled()
manila-ui-3.0.0/manila_ui/local/enabled/_80_manila_admin_add_share_panel_group.py 0000664 0001750 0001750 00000002562 13647271543 030071 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
# The slug of the panel group to be added to HORIZON_CONFIG. Required.
PANEL_GROUP = 'share'
# The display name of the PANEL_GROUP. Required.
PANEL_GROUP_NAME = 'Share'
# The slug of the dashboard the PANEL_GROUP associated with. Required.
PANEL_GROUP_DASHBOARD = 'admin'
EXTRA_TABS = {
'openstack_dashboard.dashboards.admin.defaults.tabs.DefaultsTabs': (
'manila_ui.dashboards.admin.defaults.tabs.ShareQuotasTab',
),
}
EXTRA_STEPS = {
'openstack_dashboard.dashboards.identity.projects.workflows.UpdateQuota': (
'manila_ui.dashboards.identity.projects.workflows.UpdateShareQuota',
),
'openstack_dashboard.dashboards.admin.defaults.workflows.'
'UpdateDefaultQuotas': (
'manila_ui.dashboards.admin.defaults.workflows.'
'UpdateDefaultShareQuotasStep',
),
}
manila-ui-3.0.0/manila_ui/local/__init__.py 0000664 0001750 0001750 00000000000 13647271543 020553 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/local/local_settings.d/ 0000775 0001750 0001750 00000000000 13647271736 021714 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/local/local_settings.d/_90_manila_shares.py 0000664 0001750 0001750 00000002100 13647271543 025530 0 ustar zuul zuul 0000000 0000000 # Copyright 2016 Red Hat Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# The OPENSTACK_MANILA_FEATURES settings can be used to enable or disable
# the UI for the various services provided by Manila.
OPENSTACK_MANILA_FEATURES = {
'enable_share_groups': True,
'enable_replication': True,
'enable_migration': True,
'enable_public_share_type_creation': True,
'enable_public_share_group_type_creation': True,
'enable_public_shares': True,
'enabled_share_protocols': ['NFS', 'CIFS', 'GlusterFS', 'HDFS', 'CephFS',
'MapRFS'],
}
manila-ui-3.0.0/manila_ui/api/ 0000775 0001750 0001750 00000000000 13647271736 016137 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/api/network.py 0000664 0001750 0001750 00000001500 13647271543 020172 0 ustar zuul zuul 0000000 0000000 # Copyright (c) 2015 Mirantis, 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 openstack_dashboard.api import neutron
def network_list(request):
return neutron.network_list(request)
def network_get(request, net_id):
return neutron.network_get(request, net_id)
manila-ui-3.0.0/manila_ui/api/manila.py 0000664 0001750 0001750 00000051423 13647271543 017753 0 ustar zuul zuul 0000000 0000000 # Copyright 2012 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Copyright 2012 OpenStack Foundation
# Copyright 2012 Nebula, Inc.
# Copyright (c) 2012 X.commerce, a business unit of eBay 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 __future__ import absolute_import
from django.conf import settings
from horizon import exceptions
import logging
from openstack_dashboard.api import base
from manilaclient import client as manila_client
LOG = logging.getLogger(__name__)
MANILA_UI_USER_AGENT_REPR = "manila_ui_plugin_for_horizon"
MANILA_VERSION = "2.38"
MANILA_SERVICE_TYPE = "sharev2"
# API static values
SHARE_STATE_AVAILABLE = "available"
DEFAULT_QUOTA_NAME = 'default'
MANILA_QUOTA_FIELDS = {
"shares",
"share_gigabytes",
"share_snapshots",
"share_snapshot_gigabytes",
"share_networks",
}
# UI field names do not match data field names returned, have
# a map to convert them.
MANILA_QUOTA_FIELDS_DATA_MAP = {
"shares": "shares",
"share_gigabytes": "gigabytes",
"share_snapshots": "snapshots",
"share_snapshot_gigabytes": "snapshot_gigabytes",
"share_networks": "share_networks"
}
def manilaclient(request):
insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', False)
cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', None)
manila_url = ""
try:
manila_url = base.url_for(request, MANILA_SERVICE_TYPE)
except exceptions.ServiceCatalogException:
LOG.debug('no share service configured.')
return None
LOG.debug('manilaclient connection created using token "%s" and url "%s"' %
(request.user.token.id, manila_url))
c = manila_client.Client(
MANILA_VERSION,
username=request.user.username,
input_auth_token=request.user.token.id,
project_id=request.user.tenant_id,
service_catalog_url=manila_url,
insecure=insecure,
cacert=cacert,
http_log_debug=settings.DEBUG,
user_agent=MANILA_UI_USER_AGENT_REPR,
)
c.client.auth_token = request.user.token.id
c.client.management_url = manila_url
return c
def share_list(request, search_opts=None):
return manilaclient(request).shares.list(search_opts=search_opts)
def share_get(request, share_id):
share_data = manilaclient(request).shares.get(share_id)
return share_data
def share_create(request, size, name, description, proto, snapshot_id=None,
metadata=None, share_network=None, share_type=None,
is_public=None, availability_zone=None, share_group_id=None):
return manilaclient(request).shares.create(
proto, size, name=name, description=description,
share_network=share_network, snapshot_id=snapshot_id,
metadata=metadata, share_type=share_type, is_public=is_public,
availability_zone=availability_zone,
share_group_id=share_group_id,
)
def share_delete(request, share_id, share_group_id=None):
return manilaclient(request).shares.delete(
share_id,
share_group_id=share_group_id,
)
def share_update(request, share_id, name, description, is_public=''):
share_data = {'display_name': name, 'display_description': description}
if not isinstance(is_public, str):
is_public = str(is_public)
if is_public and is_public.lower() != 'none':
share_data['is_public'] = is_public
return manilaclient(request).shares.update(share_id, **share_data)
def share_rules_list(request, share_id):
return manilaclient(request).shares.access_list(share_id)
def share_export_location_list(request, share_id):
return manilaclient(request).share_export_locations.list(share_id)
def share_instance_export_location_list(request, share_instance_id):
return manilaclient(request).share_instance_export_locations.list(
share_instance_id)
def share_allow(request, share_id, access_type, access_to, access_level):
return manilaclient(request).shares.allow(
share_id, access_type, access_to, access_level)
def share_deny(request, share_id, rule_id):
return manilaclient(request).shares.deny(share_id, rule_id)
def share_manage(request, service_host, protocol, export_path,
driver_options=None, share_type=None,
name=None, description=None, is_public=False):
return manilaclient(request).shares.manage(
service_host=service_host,
protocol=protocol,
export_path=export_path,
driver_options=driver_options,
share_type=share_type,
name=name,
description=description,
is_public=is_public,
)
def migration_start(request, share, dest_host, force_host_assisted_migration,
writable, preserve_metadata, preserve_snapshots,
nondisruptive, new_share_network_id, new_share_type_id):
return manilaclient(request).shares.migration_start(
share,
host=dest_host,
force_host_assisted_migration=force_host_assisted_migration,
writable=writable,
preserve_metadata=preserve_metadata,
preserve_snapshots=preserve_snapshots,
nondisruptive=nondisruptive,
new_share_network_id=new_share_network_id,
new_share_type_id=new_share_type_id
)
def migration_complete(request, share):
return manilaclient(request).shares.migration_complete(share)
def migration_get_progress(request, share):
return manilaclient(request).shares.migration_get_progress(share)
def migration_cancel(request, share):
return manilaclient(request).shares.migration_cancel(share)
def share_unmanage(request, share):
# Param 'share' can be either string with ID or object with attr 'id'.
return manilaclient(request).shares.unmanage(share)
def share_extend(request, share_id, new_size):
return manilaclient(request).shares.extend(share_id, new_size)
def share_revert(request, share, snapshot):
"""Sends request to revert share to specific snapshot.
This API available only since 2.27 microversion.
:param share: Share class instance or share ID
:param snapshot: ShareSnapshot class instance or share snapshot ID
"""
return manilaclient(request).shares.revert_to_snapshot(share, snapshot)
def share_snapshot_get(request, snapshot_id):
return manilaclient(request).share_snapshots.get(snapshot_id)
def share_snapshot_update(request, snapshot_id, name, description):
snapshot_data = {'display_name': name,
'display_description': description}
return manilaclient(request).share_snapshots.update(
snapshot_id, **snapshot_data)
def share_snapshot_list(request, detailed=True, search_opts=None,
sort_key=None, sort_dir=None):
# Example of 'search_opts' value:
# {'share_id': 'id_of_existing_share'}
return manilaclient(request).share_snapshots.list(
detailed=detailed,
search_opts=search_opts,
sort_key=sort_key,
sort_dir=sort_dir,
)
def share_snapshot_create(request, share_id, name=None,
description=None, force=False):
return manilaclient(request).share_snapshots.create(
share_id, force=force, name=name, description=description)
def share_snapshot_delete(request, snapshot_id):
return manilaclient(request).share_snapshots.delete(snapshot_id)
def share_snapshot_allow(request, snapshot_id, access_type, access_to):
return manilaclient(request).share_snapshots.allow(
snapshot_id, access_type, access_to)
def share_snapshot_deny(request, snapshot_id, rule_id):
return manilaclient(request).share_snapshots.deny(snapshot_id, rule_id)
def share_snapshot_rules_list(request, snapshot_id):
return manilaclient(request).share_snapshots.access_list(snapshot_id)
def share_snap_export_location_list(request, snapshot):
return manilaclient(request).share_snapshot_export_locations.list(
snapshot=snapshot)
def share_snap_instance_export_location_list(request, snapshot_instance):
return manilaclient(request).share_snapshot_export_locations.list(
snapshot_instance=snapshot_instance)
def share_server_list(request, search_opts=None):
return manilaclient(request).share_servers.list(search_opts=search_opts)
def share_server_get(request, share_serv_id):
return manilaclient(request).share_servers.get(share_serv_id)
def share_server_delete(request, share_serv_id):
return manilaclient(request).share_servers.delete(share_serv_id)
def share_network_list(request, detailed=False, search_opts=None):
return manilaclient(request).share_networks.list(detailed=detailed,
search_opts=search_opts)
def share_network_create(request, neutron_net_id=None, neutron_subnet_id=None,
name=None, description=None):
return manilaclient(request).share_networks.create(
neutron_net_id=neutron_net_id, neutron_subnet_id=neutron_subnet_id,
name=name, description=description)
def share_network_get(request, share_net_id):
return manilaclient(request).share_networks.get(share_net_id)
def share_network_update(request, share_net_id, name=None, description=None):
return manilaclient(request).share_networks.update(
share_net_id, name=name, description=description)
def share_network_delete(request, share_network_id):
return manilaclient(request).share_networks.delete(share_network_id)
def security_service_list(request, search_opts=None):
return manilaclient(request).security_services.list(
detailed=True,
search_opts=search_opts)
def security_service_get(request, sec_service_id, search_opts=None):
return manilaclient(request).security_services.get(sec_service_id)
def security_service_create(request, type, dns_ip=None, server=None,
domain=None, user=None, password=None, name=None,
description=None):
return manilaclient(request).security_services.create(
type, dns_ip=dns_ip, server=server, domain=domain, user=user,
password=password, name=name, description=description)
def security_service_update(request, security_service_id, dns_ip=None,
server=None,
domain=None, user=None, password=None, name=None,
description=None):
return manilaclient(request).security_services.update(
security_service_id, dns_ip=dns_ip, server=server, domain=domain,
user=user, password=password, name=name, description=description,
)
def security_service_delete(request, security_service_id):
return manilaclient(request).security_services.delete(security_service_id)
def share_network_security_service_add(request, share_network_id,
security_service_id):
return manilaclient(request).share_networks.add_security_service(
share_network_id, security_service_id)
def share_network_security_service_remove(request, share_network_id,
security_service_id):
return manilaclient(request).share_networks.remove_security_service(
share_network_id, security_service_id)
def share_network_security_service_list(request, share_network_id):
return manilaclient(request).security_services.list(
search_opts={'share_network_id': share_network_id})
def share_set_metadata(request, share_id, metadata):
return manilaclient(request).shares.set_metadata(share_id, metadata)
def share_delete_metadata(request, share_id, keys):
return manilaclient(request).shares.delete_metadata(share_id, keys)
def tenant_quota_get(request, tenant_id):
return base.QuotaSet(manilaclient(request).quotas.get(tenant_id))
def _map_quota_names_for_update(data):
mapping = {
'share_gigabytes': 'gigabytes',
'share_snapshots': 'snapshots',
'share_snapshot_gigabytes': 'snapshot_gigabytes',
}
for k, v in mapping.items():
if k in data:
data[v] = data.pop(k)
return data
def tenant_quota_update(request, tenant_id, **kwargs):
_map_quota_names_for_update(kwargs)
return manilaclient(request).quotas.update(tenant_id, **kwargs)
def default_quota_get(request, tenant_id):
return base.QuotaSet(manilaclient(request).quotas.defaults(tenant_id))
def default_quota_update(request, **kwargs):
_map_quota_names_for_update(kwargs)
manilaclient(request).quota_classes.update(DEFAULT_QUOTA_NAME, **kwargs)
def share_type_list(request):
return manilaclient(request).share_types.list()
def share_type_get(request, share_type_id):
return manilaclient(request).share_types.get(share_type_id)
def share_type_create(request, name, spec_driver_handles_share_servers,
is_public=True):
return manilaclient(request).share_types.create(
name=name,
spec_driver_handles_share_servers=spec_driver_handles_share_servers,
is_public=is_public)
def share_type_delete(request, share_type_id):
return manilaclient(request).share_types.delete(share_type_id)
def share_type_get_extra_specs(request, share_type_id):
return manilaclient(request).share_types.get(share_type_id).get_keys()
def share_type_set_extra_specs(request, share_type_id, extra_specs):
return manilaclient(request).share_types.get(
share_type_id).set_keys(extra_specs)
def share_type_unset_extra_specs(request, share_type_id, keys):
return manilaclient(request).share_types.get(
share_type_id).unset_keys(keys)
def share_type_access_list(request, share_type_id):
return manilaclient(request).share_type_access.list(share_type_id)
def share_type_access_add(request, share_type_id, project_id):
return manilaclient(request).share_type_access.add_project_access(
share_type_id, project_id)
def share_type_access_remove(request, share_type_id, project_id):
return manilaclient(request).share_type_access.remove_project_access(
share_type_id, project_id)
def share_replica_list(request, share=None):
return manilaclient(request).share_replicas.list(share)
def share_replica_create(request, share, availability_zone,
share_network=None):
return manilaclient(request).share_replicas.create(
share,
availability_zone=availability_zone,
share_network=share_network)
def share_replica_get(request, replica):
return manilaclient(request).share_replicas.get(replica)
def share_replica_delete(request, replica):
return manilaclient(request).share_replicas.delete(replica)
def share_replica_promote(request, replica):
return manilaclient(request).share_replicas.promote(replica)
def share_replica_reset_status(request, replica, status):
return manilaclient(request).share_replicas.reset_state(
replica, status)
def share_replica_reset_state(request, replica, state):
return manilaclient(request).share_replicas.reset_replica_state(
replica, state)
def share_replica_resync(request, replica):
return manilaclient(request).share_replicas.resync(replica)
def tenant_absolute_limits(request):
limits = manilaclient(request).limits.get().absolute
limits_dict = {}
for limit in limits:
# -1 is used to represent unlimited quotas
if limit.value == -1:
limits_dict[limit.name] = float("inf")
else:
limits_dict[limit.name] = limit.value
return limits_dict
def share_instance_list(request):
return manilaclient(request).share_instances.list()
def share_instance_get(request, share_instance_id):
return manilaclient(request).share_instances.get(share_instance_id)
def availability_zone_list(request):
return manilaclient(request).availability_zones.list()
def pool_list(request, detailed=False):
return manilaclient(request).pools.list(detailed=detailed)
# ####### Share Groups # #######
def share_group_create(request, name, description=None,
share_group_type=None,
share_types=None,
share_network=None,
source_share_group_snapshot=None,
availability_zone=None):
return manilaclient(request).share_groups.create(
name=name,
description=description,
share_group_type=share_group_type,
share_types=share_types,
share_network=share_network,
source_share_group_snapshot=source_share_group_snapshot,
availability_zone=availability_zone,
)
def share_group_get(request, share_group):
return manilaclient(request).share_groups.get(share_group)
def share_group_update(request, share_group, name, description):
return manilaclient(request).share_groups.update(
share_group,
name=name,
description=description,
)
def share_group_delete(request, share_group, force=False):
return manilaclient(request).share_groups.delete(share_group, force=force)
def share_group_reset_state(request, share_group, state):
return manilaclient(request).share_groups.reset_state(share_group, state)
def share_group_list(request, detailed=True, search_opts=None, sort_key=None,
sort_dir=None):
return manilaclient(request).share_groups.list(
detailed=detailed,
search_opts=search_opts,
sort_key=sort_key,
sort_dir=sort_dir,
)
# ####### Share Group Snapshots # #######
def share_group_snapshot_create(request, share_group, name, description=None):
return manilaclient(request).share_group_snapshots.create(
share_group=share_group,
name=name,
description=description,
)
def share_group_snapshot_get(request, share_group_snapshot):
return manilaclient(request).share_group_snapshots.get(
share_group_snapshot)
def share_group_snapshot_update(request, share_group_snapshot, name,
description):
return manilaclient(request).share_group_snapshots.update(
share_group_snapshot,
name=name,
description=description,
)
def share_group_snapshot_delete(request, share_group_snapshot, force=False):
return manilaclient(request).share_group_snapshots.delete(
share_group_snapshot, force=force)
def share_group_snapshot_reset_state(request, share_group_snapshot, state):
return manilaclient(request).share_group_snapshots.reset_state(
share_group_snapshot, state)
def share_group_snapshot_list(request, detailed=True, search_opts=None,
sort_key=None, sort_dir=None):
return manilaclient(request).share_group_snapshots.list(
detailed=detailed,
search_opts=search_opts,
sort_key=sort_key,
sort_dir=sort_dir,
)
# ####### Share Group Types # ########
def share_group_type_create(request, name, share_types, is_public=False,
group_specs=None):
return manilaclient(request).share_group_types.create(
name=name, share_types=share_types, is_public=is_public,
group_specs=group_specs)
def share_group_type_get(request, share_group_type):
return manilaclient(request).share_group_types.get(share_group_type)
def share_group_type_list(request, show_all=True):
return manilaclient(request).share_group_types.list(show_all=show_all)
def share_group_type_delete(request, share_group_type):
return manilaclient(request).share_group_types.delete(share_group_type)
def share_group_type_access_list(request, share_group_type):
return manilaclient(request).share_group_type_access.list(share_group_type)
def share_group_type_access_add(request, share_group_type, project):
return manilaclient(request).share_group_type_access.add_project_access(
share_group_type, project)
def share_group_type_access_remove(request, share_group_type, project):
return manilaclient(request).share_group_type_access.remove_project_access(
share_group_type, project)
def share_group_type_set_specs(request, share_group_type, group_specs):
return manilaclient(request).share_group_types.get(
share_group_type).set_keys(group_specs)
def share_group_type_unset_specs(request, share_group_type, keys):
return manilaclient(request).share_group_types.get(
share_group_type).unset_keys(keys)
def share_group_type_get_specs(request, share_group_type):
return manilaclient(request).share_group_types.get(
share_group_type).get_keys()
manila-ui-3.0.0/manila_ui/api/__init__.py 0000664 0001750 0001750 00000000000 13647271543 020232 0 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/ 0000775 0001750 0001750 00000000000 13647271736 016625 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/tr_TR/ 0000775 0001750 0001750 00000000000 13647271736 017657 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/tr_TR/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021444 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/tr_TR/LC_MESSAGES/django.po 0000664 0001750 0001750 00000116572 13647271543 023256 0 ustar zuul zuul 0000000 0000000 # işbaran akçayır , 2017. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-09-16 12:05+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2017-08-25 07:29+0000\n"
"Last-Translator: Copied by Zanata \n"
"Language-Team: Turkish (Turkey)\n"
"Language: tr_TR\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Zanata 4.3.3\n"
"X-POOTLE-MTIME: 1495463317.000000\n"
#, python-format
msgid "%sGiB"
msgstr "%sGiB"
msgid "(Quota exceeded)"
msgstr "(Kota aşıldı)"
msgid "Access Key"
msgstr "Erişim Anahtarı"
msgid "Access Level"
msgstr "Erişim Seviyesi"
msgid "Access To"
msgstr "Erişim"
msgid "Access Type"
msgstr "Erişim Türü"
msgid "Access to"
msgstr "Erişim"
msgctxt "Current status of share network"
msgid "Active"
msgstr "Etkin"
msgctxt "Current status of share server"
msgid "Active"
msgstr "Etkin"
msgid "Add"
msgstr "Ekle"
msgid "Add Rule"
msgstr "Kural Ekle"
msgid "Add Security Service"
msgstr "Güvenlik Servisi Ekle"
msgid "Add Share Snapshot Rule"
msgstr "Paylaşım Anlık Görüntü Kuralı Ekle"
msgid "Add rule"
msgstr "Kural ekle"
msgid "Add security services to share network."
msgstr "Paylaşım ağına güvenlik servisleri ekle."
msgid "All keys and values must be in range from 1 to 255."
msgstr "Tüm anahtarlar ve değerler 1 ve 255 aralığında olmalı."
msgid "Allow project access to share group type."
msgstr "Paylaşım grubu türüne proje erişimine izin ver."
msgid "Allow project access to share type."
msgstr "Paylaşım türüne proje erişimi ver."
msgid "At least one security service must be specified."
msgstr "En az bir güvenlik servisi belirtilmeli."
msgid "At least one share type must be specified."
msgstr "En az bir paylaşım türü belirtilmelidir."
msgid "Availability Zone"
msgstr "Kullanılırlık Bölgesi"
msgid "Availability zone"
msgstr "Kullanılırlık bölgesi"
msgctxt "Current status of replica"
msgid "Available"
msgstr "Kullanılabilir"
msgctxt "Current status of share"
msgid "Available"
msgstr "Kullanılabilir"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "Uygun"
msgid "Available projects"
msgstr "Kullanılabilir projeler"
msgid "Available security services"
msgstr "Kullanılabilir güvenlik servisleri"
msgid "Cancel Migration"
msgstr "Göçü İptal Et"
msgid "Cancel migration"
msgstr "Göçü iptal et"
msgid "Cancel migration of a Share"
msgstr "Bir Paylaşımın göçünü iptal et"
msgid "Choose a snapshot"
msgstr "Bir anlık görüntü seçin"
msgid "Complete Migration"
msgstr "Göçü Tamamla"
msgid "Complete migration"
msgstr "Göçü tamamla"
msgid "Complete migration of a Share"
msgstr "Bir paylaşımın göçünü tamamla"
msgid "Confirm Migration Cancelling of Share"
msgstr "Paylaşım Göç İptalini Onayla"
msgid "Confirm Migration Completion of Share"
msgstr "Paylaşımın Göç Tamamlanmasını Onayla"
msgid "Confirm Obtaining migration progress of Share"
msgstr "Paylaşım göç sürecini Almayı onayla"
msgid "Confirm Password"
msgstr "Parolayı Onayla"
msgid "Confirm Unmanage Share"
msgstr "Paylaşım Yönetim İptalini Onayla"
msgid "Create"
msgstr "Oluştur"
msgid "Create Replica"
msgstr "Kopya Oluştur"
msgid "Create Security Service"
msgstr "Güvenlik Servisi Oluştur"
msgid "Create Share"
msgstr "Paylaşım Oluştur"
msgid "Create Share Group"
msgstr "Paylaşım Grubu Oluştur"
msgid "Create Share Group Snapshot"
msgstr "Paylaşım Grubu Anlık Görüntüsü Oluştur"
msgid "Create Share Group Type"
msgstr "Paylaşım Grubu Türü Oluştur"
msgid "Create Share Network"
msgstr "Paylaşım Ağı Oluştur"
msgid "Create Share Snapshot"
msgstr "Paylaşım Anlık Görüntüsü Oluştur"
msgid "Create Share Type"
msgstr "Paylaşım Türü Oluştur"
msgid "Create a Share"
msgstr "Bir Paylaşım Oluştur"
msgid "Created At"
msgstr "Oluşturulma Tarihi"
msgid "Created at"
msgstr "Oluşturulma"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "Oluşturuluyor"
msgctxt "Current status of share"
msgid "Creating"
msgstr "Oluşturuluyor"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "Oluşturuluyor"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "Oluşturuluyor"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "\"%s\" paylaşımı için kopya oluşturuluyor."
#, python-format
msgid "Creating rule for \"%s\""
msgstr "\"%s\" için kural oluşturuluyor"
#, python-format
msgid "Creating share \"%s\""
msgstr "\"%s\" paylaşımı oluşturuluyor"
#, python-format
msgid "Creating share group \"%s\""
msgstr "\"%s\" paylaşım grubu oluşturuluyor"
#, python-format
msgid "Creating share group snapshot \"%s\"."
msgstr "Paylaşım grubu anlık görüntüsü \"%s\" oluşturuluyor."
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "Paylaşım anlık görüntüsü \"%s\"."
#, python-format
msgid "Creating snapshot rule for \"%s\""
msgstr "\"%s\" için anlık görüntü kuralı oluşturuluyor"
msgid "Current Size (GiB)"
msgstr "Mevcut Boyut (GiB)"
msgid "DNS IP"
msgstr "DNS IP"
msgid "Delete Replica"
msgid_plural "Delete Replicas"
msgstr[0] "Kopyayı Sil"
msgstr[1] "Kopyaları Sil"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Kuralı Sil"
msgstr[1] "Kuralları Sil"
msgid "Delete Security Service"
msgid_plural "Delete Security Services"
msgstr[0] "Güvenlik Servisini Sil"
msgstr[1] "Güvenlik Servislerini Sil"
msgid "Delete Share"
msgid_plural "Delete Shares"
msgstr[0] "Paylaşımı Sil"
msgstr[1] "Paylaşımları Sil"
msgid "Delete Share Group"
msgid_plural "Delete Share Groups"
msgstr[0] "Paylaşım Grubunu Sil"
msgstr[1] "Paylaşım Gruplarını Sil"
msgid "Delete Share Group Snapshot"
msgid_plural "Delete Share Group Snapshots"
msgstr[0] "Paylaşım Grubu Anlık Görüntüsünü Sil"
msgstr[1] "Paylaşım Grubu Anlık Görüntülerini Sil"
msgid "Delete Share Group Type"
msgid_plural "Delete Share Group Types"
msgstr[0] "Paylaşım Grubu Türünü Sil"
msgstr[1] "Paylaşım Grubu Türlerini Sil"
msgid "Delete Share Network"
msgid_plural "Delete Share Networks"
msgstr[0] "Paylaşım Ağını Sil"
msgstr[1] "Paylaşım Ağlarını Sil"
msgid "Delete Share Server"
msgid_plural "Delete Share Server"
msgstr[0] "Paylaşım Sunucusu Sil"
msgstr[1] "Paylaşım Sunucularını Sil"
msgid "Delete Share Snapshot"
msgid_plural "Delete Share Snapshots"
msgstr[0] "Paylaşım Anlık Görüntüsünü Sİl"
msgstr[1] "Paylaşım Anlık Görüntülerini Sİl"
msgid "Delete Share Snapshot Rule"
msgid_plural "Delete Share Snapshot Rules"
msgstr[0] "Paylaşım Anlık Görüntü Kuralı Sil"
msgstr[1] "Paylaşım Anlık Görüntü Kurallarını Sil"
msgid "Delete Share Type"
msgid_plural "Delete Share Types"
msgstr[0] "Paylaşım Türünü Sil"
msgstr[1] "Paylaşım Türlerini Sil"
msgid "Delete Snapshot"
msgid_plural "Delete Snapshots"
msgstr[0] "Anlık Görüntü Sil"
msgstr[1] "Anlık Görüntüleri Sil"
msgid "Deleted Replica"
msgid_plural "Deleted Replicas"
msgstr[0] "Kopya Silindi"
msgstr[1] "Kopyalar Silindi"
msgid "Deleted Rule"
msgid_plural "Deleted Rules"
msgstr[0] "Kural Silindi"
msgstr[1] "Kurallar Silindi"
msgid "Deleted Security Service"
msgid_plural "Deleted Security Services"
msgstr[0] "Güvenlik Servisi Silindi"
msgstr[1] "Güvenlik Servisleri Silindi"
msgid "Deleted Share"
msgid_plural "Deleted Shares"
msgstr[0] "Paylaşım Silindi"
msgstr[1] "Paylaşımlar Silindi"
msgid "Deleted Share Group"
msgid_plural "Deleted Share Groups"
msgstr[0] "Paylaşım Grubunu Sil"
msgstr[1] "Paylaşım Gruplarını Sil"
msgid "Deleted Share Group Snapshot"
msgid_plural "Deleted Share Group Snapshots"
msgstr[0] "Paylaşım Grubu Anlık Görüntüsünü Sil"
msgstr[1] "Paylaşım Grubu Anlık Görüntülerini Sil"
msgid "Deleted Share Group Type"
msgid_plural "Deleted Share Group Types"
msgstr[0] "Paylaşım Grubu Türünü Sil"
msgstr[1] "Paylaşım Grubu Türlerini Sil"
msgid "Deleted Share Network"
msgid_plural "Deleted Share Networks"
msgstr[0] "Paylaşım Ağı Silindi"
msgstr[1] "Paylaşım Ağları Silindi"
msgid "Deleted Share Server"
msgid_plural "Deleted Share Server"
msgstr[0] "Paylaşım Sunucusu Silindi"
msgstr[1] "Paylaşım Sunucuları Silindi"
msgid "Deleted Share Snapshot"
msgid_plural "Deleted Share Snapshots"
msgstr[0] "Paylaşım Anlık Görüntüsünü Sil"
msgstr[1] "Paylaşım Anlık Görüntülerini Sil"
msgid "Deleted Share Snapshot Rule"
msgid_plural "Deleted Share Snapshot Rules"
msgstr[0] "Paylaşım Anlık Görüntü Kuralı Sil"
msgstr[1] "Paylaşım Anlık Görüntü Kurallarını Sil"
msgid "Deleted Share Type"
msgid_plural "Deleted Share Types"
msgstr[0] "Paylaşım Türü Silindi"
msgstr[1] "Paylaşım Türleri Silindi"
msgid "Deleted Snapshot"
msgid_plural "Deleted Snapshots"
msgstr[0] "Anlık Görüntü Silindi"
msgstr[1] "Anlık Görüntüler Silindi"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "Siliniyor"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "Siliniyor"
msgid "Description"
msgstr "Açıklama"
msgid "Destination host and pool where share will be migrated to."
msgstr "Paylaşımın geçirileceği hedef istemci ve havuz."
msgid "Domain"
msgstr "Alan"
msgid "Driver handles share servers"
msgstr "Sürücü paylaşım sunucuları ele alır"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "Sürücü seçenekleri (Genel sürücü için 'birim_kimliği', vs...)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "Kopya anahtarlar '%s'."
msgid "Edit"
msgstr "Düzenle"
msgid "Edit Security Service"
msgstr "Güvenlik Servisini Düzenle"
msgid "Edit Share"
msgstr "Paylaşımı Düzenle"
msgid "Edit Share Metadata"
msgstr "Paylaşım Metaverisini Düzenle"
msgid "Edit Share Network"
msgstr "Paylaşım Ağını Düzenle"
msgid "Edit Share Snapshot"
msgstr "Paylaşım Anlık Görüntüsü Düzenle"
msgid ""
"Enforces migration of the share snapshots to the destination. If set to "
"True, host-assisted migration will not be attempted."
msgstr ""
"Paylaşım anlık görüntülerinin hedefe göçünü zorlar. Doğru olarak "
"işaretlenirse, istemci-destekli göç denenmez."
msgid ""
"Enforces migration to be nondisruptive. If set to True, host-assisted "
"migration will not be attempted."
msgstr ""
"Göçün aksatmadan yapılmasına zorlar. Doğru olarak ayarlanırsa, istemci-"
"destekli göç denenmez."
msgid ""
"Enforces migration to keep the share writable while contents are being "
"moved. If set to True, host-assisted migration will not be attempted."
msgstr ""
"Göç sırasında içerik taşınırken paylaşımın yazılabilir kalmasını zorlar. "
"Doğru olarak ayarlanırsa, istemci-destekli göç denenmez."
msgid ""
"Enforces migration to preserve all file metadata when moving its contents. "
"If set to True, host-assisted migration will not be attempted."
msgstr ""
"Göç sırasında içeriği taşırken tüm metaveri dosyasının korunmasını zorlar. "
"Doğru olarak işaretlenirse, istemci-destekli göç denenmez."
msgid ""
"Enforces the use of the host-assisted migration approach, which bypasses "
"driver optimizations."
msgstr ""
"İstemci-destekli göç yaklaşımını kullanmaya zorlar, sürücü iyileştirmeleri "
"atlanır."
msgctxt "Current status of replica"
msgid "Error"
msgstr "Hata"
msgctxt "Current status of share"
msgid "Error"
msgstr "Hata"
msgctxt "Current status of share network"
msgid "Error"
msgstr "Hata"
msgctxt "Current status of share server"
msgid "Error"
msgstr "Hata"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "Hata"
msgid "Expected only pairs of key=value."
msgstr "Yalnızca anahtar=değer çiftleri bekleniyor."
msgid "Export location"
msgstr "Dışa aktarım konumu"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr ""
"Paylaşımın dışa aktarım konumu. Örneğin NFS için 1.2.3.4:/paylaşım/yolu"
msgid "Extend"
msgstr "Genişlet"
msgid "Extend Share"
msgstr "Paylaşımı Büyüt"
#, python-format
msgid "Extend share \"%s\""
msgstr "\"%s\" paylaşımını büyüt"
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "Genişletme Hatası"
msgid "Extra specs"
msgstr "Ek özellikler"
msgid "Force Host Assisted Migration"
msgstr "İstemci Destekli Göçe Zorla"
msgid "From here you can update share network info. "
msgstr "Burdan paylaşım ağı bilgisini güncelleyebilirsiniz. "
msgid "Get migration progress"
msgstr "Göç ilerlemesini al"
msgid ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgstr ""
"'driver_options' alanı için geçersiz değer alındı. Yalnızca anahtar=değer "
"çiftleri bekleniyor."
msgid "Group specs"
msgstr "Grup özellikleri"
msgid "Host"
msgstr "Sunucu"
msgid "Host of share"
msgstr "Paylaşım sunucusu"
msgid "Host to migrate share"
msgstr "Paylaşımın geçirileceği istemci"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr "Paylaşımın konumlandığı sunucu, örneğin: bir.sunucu@sürücü[#havuz]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP Sürümü"
msgid "Id"
msgstr "Id"
#, python-format
msgid ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgstr ""
"'spec_driver_handles_share_servers' ek özelliği için uygun olmayan değer "
"ayarlanmış. İzin verilen değerler %s. Büyük küçük harfe duyarsız."
msgctxt "Current status of share server"
msgid "In-use"
msgstr "Kullanımda"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "Kullanımda"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "Pasif"
#, python-format
msgid "Key '%s' has improper length."
msgstr "Anahtar '%s' uygunsuz uzunluğa sahip."
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "Anahtar boşluk içeremez. '%s' karakter dizisine göz atın."
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "Anahtarlar boşluk içermemeli. '%s'de hata."
msgid "Make visible for all"
msgstr "Herkes için görünür yap"
msgid "Manage"
msgstr "Yönet"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "Yönetme Hatası"
msgid "Manage Replicas"
msgstr "Kopyaları Yönet"
msgid "Manage Rules"
msgstr "Kuralları Yönet"
msgid "Manage Share"
msgstr "Paylaşımı Yönet"
msgid "Manage Share Group Type Access"
msgstr "Paylaşım Grubu Türü Erişimini Yönet"
msgid "Manage Share Snapshot Rules"
msgstr "Paylaşım Anlık Görüntü Kurallarını Yönet"
msgid "Manage Share Type Access"
msgstr "Paylaşım Türü Erişimini Yönet"
msgid "Metadata"
msgstr "Metaveri"
msgid "Migrate Share"
msgstr "Paylaşımı Göç Ettir"
msgid "Migrate a Share"
msgstr "Bir paylaşımı göç ettir"
msgctxt "Current status of share"
msgid "Migrating"
msgstr "Göç Ediyor"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "Göç konumu"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "%(name)s paylaşımının göçü yüzde %(progress)s."
msgid "Name"
msgstr "İsim"
msgid "Network Type"
msgstr "Ağ Türü"
msgid "Networks"
msgstr "Ağlar"
msgid "Neutron Net"
msgstr "Neutron Ağı"
msgid "Neutron Subnet"
msgstr "Neutron Alt Ağı"
msgid "New Size (GiB)"
msgstr "Yeni Boyut (GiB)"
msgid "New share network to be set in migrated share"
msgstr "Göç etmiş paylaşımda yeni paylaşım ağı ayarlanacak"
msgid "New share type to be set in migrating share"
msgstr "Göç eden paylaşımda ayarlanacak yeni paylaşım türü"
msgid "New size must be greater than current size."
msgstr "Yeni boyut mevcut boyuttan büyük olmalı."
msgid "No projects found."
msgstr "Proje bulunamadı."
msgid "No projects selected."
msgstr "Hiçbir proje seçili değil."
msgid "No security services found."
msgstr "Hiçbir güvenlik servisi bulunamadı."
msgid "No security services selected."
msgstr "Hiçbir güvenlik servisi seçilmemiş."
msgid "No source, empty share"
msgstr "Kaynak yok, boş paylaşım"
msgid "No source, empty share group"
msgstr "Kaynak yok, boş paylaşım grubu"
msgid "Nondisruptive"
msgstr "Aksatmadan"
msgid "Nova Net"
msgstr "Nova Ağı"
msgid "Obtain Progress"
msgstr "Süreci Al"
msgid "Obtain migration progress of a Share"
msgstr "Bir Paylaşımın göç sürecini al"
msgid "Overview"
msgstr "Genel Görünüm"
msgid "Password"
msgstr "Parola"
msgid "Passwords do not match."
msgstr "Parolalar eşleşmiyor."
msgid "Preserve Metadata"
msgstr "Metaveriyi Koru"
msgid "Preserve Snapshots"
msgstr "Anlık Görüntüleri Koru"
msgid "Project"
msgstr "Proje"
msgid "Projects with access to share group type"
msgstr "Paylaşım grubu türüne erişimi olan projeler"
msgid "Projects with access to share type"
msgstr "Paylaşım türüne erişimi olan projeler"
msgid "Protocol"
msgstr "İletişim Kuralı"
msgid "Public"
msgstr "Açık"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "Kopya Ayrıntıları: %(replica_display_name)s"
msgid "Replica State"
msgstr "Kopya Durumu"
msgid "Replicas"
msgstr "Kopyalar"
msgid "Reset Replica State"
msgstr "Kopya Durumunu Sıfırla"
msgid "Reset Replica Status"
msgstr "Kopya Durumunu Sıfırla"
msgid "Reset Share Group Snapshot Status"
msgstr "Paylaşım Grubu Anlık Görüntü Durumu"
msgid "Reset Share Group Status"
msgstr "Paylaşım Grubu Durumunu Sıfırla"
msgid "Reset Status"
msgstr "Durumu Sıfırla"
msgid "Reset replica state"
msgstr "Kopya durumunu sıfırla"
msgid "Reset replica status"
msgstr "Kopya durumunu sıfırla"
msgid "Reset state"
msgstr "Durumu sıfırla"
msgid "Reset status"
msgstr "Durumu sıfırla"
#, python-format
msgid "Reseting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
msgstr "Kopya ('%(id)s') durumu '%(from)s' den '%(to)s' e sıfırlanıyor."
#, python-format
msgid "Reseting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "Kopya ('%(id)s') durumu '%(from)s' den '%(to)s' e yeniden ayarlanıyor."
#, python-format
msgid "Reseting share group ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"('%(id)s') paylaşım grubu durumu '%(from)s' den '%(to)s' e sıfırlanıyor."
#, python-format
msgid ""
"Reseting share group snapshot ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Paylaşım grubu anlık görüntüsü ('%(id)s') durumu '%(from)s' den '%(to)s' e "
"yeniden ayarlanıyor."
msgid "Resync"
msgstr "Yeniden eşzamanla"
msgid "Resync Replica"
msgstr "Kopyayı Yeniden Eşzamanla"
msgid "Resync replica"
msgstr "Kopyayı yeniden eş zamanla"
#, python-format
msgid "Resync'ing replica '%s'"
msgstr "Kopya '%s' yeniden eş zamanlanıyor"
msgid "Revert Share"
msgstr "Paylaşımı Geri Döndür"
msgid "Revert Share to a Snapshot"
msgstr "Paylaşımı Anlık Görüntüye Geri Al"
msgid "Revert share to a snapshot"
msgstr "Paylaşımı bir anlık görüntüye geri al"
msgctxt "Current status of share"
msgid "Reverting Error"
msgstr "Geri Alma Hatası"
msgid "Rules"
msgstr "Kurallar"
msgid "Save Changes"
msgstr "Değişiklikleri Kaydet"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "Güvenlik Servisi Ayrıntıları: %(service_display_name)s"
msgid "Security Service Overview"
msgstr "Güvenlik Servisi Genel Görünümü"
msgid "Security Services"
msgstr "Güvenlik Servisleri"
msgid "Security services within share network"
msgstr "Paylaşım ağındaki güvenlik servisleri"
msgid "Segmentation Id"
msgstr "Dilimlendirme Kimliği"
msgid "Selected projects"
msgstr "Seçili projeler"
msgid "Selected security services"
msgstr "Seçili güvenlik servisleri"
msgid "Server"
msgstr "Sunucu"
msgid "Set Replica as Active"
msgstr "Kopyayı Etkin olarak Ayarla"
msgid "Set as Active"
msgstr "Etkin olarak Ayarla"
msgid "Set maximum quotas for the project."
msgstr "Proje için azami kotaları ayarla."
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "\"%s\" kopyası etkin olarak ayarlanıyor..."
#, python-format
msgid "Share \"%(s)s\" has been reverted to \"%(ss)s\" snapshot successfully"
msgstr "Paylaşım \"%(s)s\" \"%(ss)s\" anlık görüntüsüne başarıyla geri alındı"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "Paylaşım Ayrıntıları: %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "Paylaşım Ayrıntıları: %(share_name)s"
msgid "Share Group"
msgstr "Paylaşım Grubu"
#, python-format
msgid "Share Group Details: %s"
msgstr "Paylaşım Grubu Ayrıntıları: %s"
msgid "Share Group Name"
msgstr "Paylaşım Grubu İsmi"
msgid "Share Group Overview"
msgstr "Paylaşım Grubu Genel Görünümü"
msgid "Share Group Snapshot"
msgstr "Paylaşım Grubu Anlık Görüntüsü"
#, python-format
msgid "Share Group Snapshot Details: %(sgs_display_name)s"
msgstr "Paylaşım Grubu Anlık Görüntü Ayrıntıları: %(sgs_display_name)s"
msgid "Share Group Snapshot Overview"
msgstr "Paylaşım Grubu Anlık Görüntüsü Genel Görünümü"
msgid "Share Group Snapshots"
msgstr "Paylaşım Grubu Anlık Görüntüleri"
msgid "Share Group Type"
msgstr "Paylaşım Grubu Türü"
msgid "Share Group Types"
msgstr "Paylaşım Grubu Türleri"
msgid "Share Groups"
msgstr "Paylaşım Grupları"
msgid "Share ID"
msgstr "Paylaşım Kimliği"
#, python-format
msgid "Share Instance Details: %s"
msgstr "Paylaşım Sunucusu Ayrıntıları: %s"
msgid "Share Instance Overview"
msgstr "Paylaşım Sunucusu Genel Görünümü"
msgid "Share Instances"
msgstr "Paylaşım Sunucuları"
msgid "Share Name"
msgstr "Paylaşım İsmi"
msgid "Share Network"
msgstr "Paylaşım Ağı"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "Paylaşım Ağı Ayrıntıları: %(network_display_name)s"
msgid "Share Network Info"
msgstr "Paylaşım Ağı Bilgisi"
msgid "Share Network Overview"
msgstr "Paylaşım Ağı Genel Görünümü"
msgid "Share Networks"
msgstr "Paylaşım Ağları"
msgid "Share Overview"
msgstr "Paylaşım Genel Görünümü"
msgid "Share Protocol"
msgstr "Paylaşım Protokolü"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr "Paylaşım Kopyaları: %(share_display_name)s"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "Paylaşım Kuralları: %(share_display_name)s"
msgid "Share Server"
msgstr "Paylaşım Sunucu"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "Paylaşım Sunucusu Ayrıntıları: %(server_name)s"
msgid "Share Server Id"
msgstr "Paylaşım Sunucu Kimliği"
msgid "Share Server Overview"
msgstr "Paylaşım Sunucusu Genel Görünümü"
msgid "Share Servers"
msgstr "Paylaşım Sunucuları"
msgid "Share Snapshot Name"
msgstr "Paylaşım Anlık Görüntü İsmi"
msgid "Share Snapshot Overview"
msgstr "Paylaşım Anlık Görüntüsü Genel Görünümü"
msgid "Share Snapshot Rules"
msgstr "Paylaşım Anlık Görüntü Kuralları"
msgid "Share Snapshots"
msgstr "Paylaşım Anlık Görüntüleri"
msgid "Share Snapshots Storage"
msgstr "Paylaşım Anlık Görüntüleri Depolama"
msgid "Share Source"
msgstr "Paylaşım Kaynağı"
msgid "Share Storage"
msgstr "Paylaşım Depolama"
msgid "Share Type"
msgstr "Paylaşım Türü"
msgid "Share Types"
msgstr "Paylaşım Türleri"
msgid "Share Types (multiple available)"
msgstr "Paylaşım Türleri (birden çok kullanılabilir)"
msgid "Share Types (one available)"
msgstr "Paylaşım Türleri (biri kullanılabilir)"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"Kotanızda yalnız %(avail)iGiB olduğundan paylaşım %(req)iGiB olarak "
"büyütülemedi."
msgid "Share gigabytes"
msgstr "Paylaşım gigabayt"
msgid "Share name to be assigned"
msgstr "Atanacak paylaşım adı"
#, python-format
msgid "Share replica %s has been deleted."
msgstr "Paylaşım kopyası %s silindi."
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr ""
"Paylaşım boyutu anlık görüntü boyutuna eşit ya da boyutundan fazla olmalı "
"(%sGiB)"
msgid "Share snapshot gigabytes"
msgstr "Paylaşım anlık görüntü gigabaytları"
msgid "Share snapshots"
msgstr "Paylaşım anlık görüntüleri"
msgid "Share types"
msgstr "Paylaşım türleri"
msgid "Shares"
msgstr "Paylaşımlar"
msgid "Shares Networks"
msgstr "Paylaşım Ağları"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "Boyut"
msgid "Size (GiB)"
msgstr "Boyut (GiB)"
msgid "Snapshot"
msgstr "Anlık görüntü"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "Anlık Görüntü Ayrıntıları: %(snapshot_display_name)s"
msgid "Snapshot Overview"
msgstr "Anlık Görüntü Genel Görünümü"
#, python-format
msgid "Snapshot Rules: %(snapshot_display_name)s"
msgstr "Anlık Görüntü Kuralları: %(snapshot_display_name)s"
msgid "Source"
msgstr "Kaynak"
msgid "Source Share Group Snapshot"
msgstr "Paylaşım Grubu Anlık Görüntüsünü Kaynak Et"
msgid "Source Type"
msgstr "Kaynak Türü"
msgid ""
"Specify the new share network for the share. Do not specify this parameter "
"if the migrating share has to be retained within its current share network."
msgstr ""
"Paylaşım için yeni paylaşım ağını belirtin. Göç eden paylaşımın mevcut "
"paylaşım ağını koruması gerekiyorsa bu parametreyi belirtmeyin."
msgid ""
"Specify the new share type for the share. Do not specify this parameter if "
"the migrating share has to be retained with its current share type."
msgstr ""
"Paylaşım için yeni paylaşım türünü belirtin. Göç eden paylaşımın mevcut "
"paylaşım türünü koruması gerekiyorsa bu parametreyi belirtmeyin."
msgid "Start migration"
msgstr "Göçü başlat"
msgid "Status"
msgstr "Durum"
#, python-format
msgid "Successfully created security service: %s"
msgstr "Güvenlik servisi başarıyla oluşturuldu: %s"
#, python-format
msgid "Successfully created share group type: %s"
msgstr "Başarıyla paylaşım grubu türü oluşturuldu: %s"
#, python-format
msgid "Successfully created share network: %s"
msgstr "Paylaşım ağı başarıyla oluşturuldu: %s"
#, python-format
msgid "Successfully created share type: %s"
msgstr "Paylaşım türü başarıyla oluşturuldu: %s"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr "Paylaşımın göç iptali için istek başarıyla gönderildi: %s."
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr "Paylaşım göçünün tamamlanması isteği başarıyla gönderildi: %s."
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "Paylaşımı yönetme isteği başarıyla gönderildi: %s"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "İstek göç paylaşımına başarıyla gönderildi: %s."
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr "Paylaşımın yönetim iptali isteği başarıyla gönderildi: %s"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "'%s' paylaşım türü için ek özellikler başarıyla güncellendi."
#, python-format
msgid "Successfully updated group specs for share group type '%s'."
msgstr "'%s' paylaşım grubu türü için grup özellikleri başarıyla güncellendi."
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "Güvenlik servisi \"%s\" başarıyla güncellendi"
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr "Paylaşım boyutu anlık görüntü boyutundan az olamaz (%sGiB)"
msgid "Type"
msgstr "Tür"
msgid "Unable to add rule."
msgstr "Kural eklenemedi."
msgid "Unable to add snapshot rule."
msgstr "Anlık görüntü kuralı eklenemedi."
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr "%s paylaşımının göçü şu an iptal edilemiyor."
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "%s paylaşımının göçü tamamlanamadı."
msgid "Unable to create security service."
msgstr "Güvenlik servisi oluşturulamıyor."
msgid "Unable to create share group snapshot."
msgstr "Paylaşım grubu anlık görüntüsü oluşturulamadı."
msgid "Unable to create share group type."
msgstr "Paylaşım grubu türü oluşturulamadı."
msgid "Unable to create share group."
msgstr "Paylaşım grubu oluşturulamıyor."
msgid "Unable to create share network."
msgstr "Paylaşım ağı oluşturulamadı."
msgid "Unable to create share replica."
msgstr "Paylaşım kopyası oluşturulamadı."
msgid "Unable to create share snapshot."
msgstr "Paylaşım anlık görüntüsü oluşturulamıyor."
msgid "Unable to create share type."
msgstr "Paylaşım türü oluşturulamıyor."
msgid "Unable to create share."
msgstr "Paylaşım oluşturulamadı."
#, python-format
msgid "Unable to create share. %s"
msgstr "Paylaşım oluşturulamadı. %s"
#, python-format
msgid "Unable to delete replica \"%s\"."
msgstr "Kopya \"%s\" silinemedi."
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "\"%s\" kuralı silinemedi."
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "\"%s\" paylaşımı silinemedi. "
#, python-format
msgid ""
"Unable to delete share group snapshot \"%s\". One or more share groups "
"depend on it."
msgstr ""
"\"%s\" paylaşım grubu anlık görüntüsü silinemiyor. Bir ya da daha fazla "
"paylaşım grubu ona bağımlı."
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr ""
"\"%s\" anlık görüntüsü silinemedi. Bir ya da fazla paylaşım ona bağımlı."
#, python-format
msgid "Unable to delete snapshot rule \"%s\"."
msgstr "Anlık görüntü kuralı \"%s\" silinemiyor."
msgid "Unable to extend share."
msgstr "Paylaşım genişletilemedi."
msgid "Unable to get information about share group type access."
msgstr "Paylaşım grubu tür erişimiyle ilgili bilgi alınamadı."
msgid "Unable to get information about share type access."
msgstr "Paylaşım türü erişimi hakkında bilgi alınamadı."
msgid "Unable to get list of projects."
msgstr "Proje listesi alınamadı."
msgid "Unable to get the security services hosts"
msgstr "Güvenlik servisi sunucuları alınamadı"
#, python-format
msgid "Unable to get the specified share group '%s' for snapshot creation."
msgstr ""
"Anlık görüntü oluşturmak için belirtilen paylaşım grubu '%s' alınamadı."
msgid "Unable to load the specified share group snapshot."
msgstr "Belirtilen paylaşım grubu anlık görüntüsü yüklenemedi."
msgid "Unable to load the specified snapshot."
msgstr "Belirtilen anlık görüntü yüklenemedi."
msgid "Unable to manage share"
msgstr "Paylaşım yönetilemiyor"
#, python-format
msgid "Unable to migrate share %s."
msgstr "%s paylaşımı göç ettirilemedi."
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr "%s paylaşımının göç yüzdesi şu an alınamıyor."
#, python-format
msgid "Unable to reset state of replica '%s'."
msgstr "'%s' kopyasının durumu sıfırlanamadı."
#, python-format
msgid "Unable to reset status of replica '%s'."
msgstr "'%s' kopyasının durumu sıfırlanamadı."
#, python-format
msgid "Unable to reset status of share group '%s'."
msgstr "'%s' paylaşım grubu durumu sıfırlanamadı."
#, python-format
msgid "Unable to reset status of share group snapshot '%s'."
msgstr "'%s' paylaşım grubu anlık görüntüsü durumu sıfırlanamıyor."
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "Kopya '%s' yeniden eş zamanlanamadı."
msgid "Unable to retrieve list of projects."
msgstr "Projelerin listesi alınamadı."
msgid "Unable to retrieve quotas."
msgstr "Kotalar alınamıyor."
#, python-format
msgid "Unable to retrieve replica '%s'."
msgstr "Kopya '%s' alınamadı."
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "Güvenlik servisi '%s' ayrıntıları alınamıyor."
msgid "Unable to retrieve security services"
msgstr "Güvenlik servisleri alınamadı"
msgid "Unable to retrieve security_service."
msgstr "security_service alınamadı."
msgid "Unable to retrieve share details."
msgstr "Paylaşım ayrıntıları alınamadı."
#, python-format
msgid "Unable to retrieve share group '%s'."
msgstr "Paylaşım grubu '%s' alınamıyor."
msgid "Unable to retrieve share group details."
msgstr "Paylaşım grubu ayrıntıları alınamıyor."
#, python-format
msgid "Unable to retrieve share group snapshot '%s'."
msgstr "Paylaşım grubu anlık görüntüsü '%s' alınamıyor."
msgid "Unable to retrieve share group snapshot details."
msgstr "Paylaşım grubu anlık görüntü ayrıntıları alınamıyor."
msgid "Unable to retrieve share group snapshot list."
msgstr "Paylaşım grubu anlık görüntü listesi alınamıyor."
msgid "Unable to retrieve share group snapshot."
msgstr "Paylaşım grubu anlık görüntüsü alınamıyor."
msgid "Unable to retrieve share group snapshots."
msgstr "Paylaşım grubu anlık görüntüleri alınamadı."
msgid "Unable to retrieve share group types."
msgstr "Paylaşım grubu türleri alınamadı."
msgid "Unable to retrieve share group."
msgstr "Paylaşım grubu alınamıyor."
msgid "Unable to retrieve share groups."
msgstr "Paylaşım grupları alınamadı."
msgid "Unable to retrieve share instance details."
msgstr "Paylaşım sunucusu ayrıntıları alınamadı."
msgid "Unable to retrieve share instances."
msgstr "Paylaşım sunucuları alınamadı."
msgid "Unable to retrieve share limit information."
msgstr "Paylaşım sınır bilgisi alınamadı."
msgid "Unable to retrieve share list."
msgstr "Paylaşım listesi alınamadı."
msgid "Unable to retrieve share network details."
msgstr "Paylaşım ağı ayrıntıları alınamıyor."
msgid "Unable to retrieve share network."
msgstr "Paylaşım ağı alınamadı."
msgid "Unable to retrieve share networks"
msgstr "Paylaşım ağları alınamadı"
msgid "Unable to retrieve share replicas."
msgstr "Paylaşım kopyaları alınamadı."
msgid "Unable to retrieve share rules."
msgstr "Paylaşım kuralları alınamadı."
msgid "Unable to retrieve share server details."
msgstr "Paylaşım sunucusu ayrıntıları alınamıyor."
msgid "Unable to retrieve share servers"
msgstr "Paylaşım sunucuları alınamadı"
msgid "Unable to retrieve share snapshot list."
msgstr "Paylaşım anlık görüntü listesi alınamadı."
msgid "Unable to retrieve share snapshot rules."
msgstr "Paylaşım anlık görüntü kuralları alınamadı."
msgid "Unable to retrieve share snapshot."
msgstr "Paylaşım anlık görüntüsü alınamıyor."
msgid "Unable to retrieve share snapshots list."
msgstr "Paylaşım anlık görüntü listesi alınamıyor."
msgid "Unable to retrieve share snapshots."
msgstr "Paylaşım anlık görüntüleri alınamadı."
msgid "Unable to retrieve share types."
msgstr "Paylaşım türleri alınamadı."
msgid "Unable to retrieve share."
msgstr "Paylaşım alınamıyor."
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "Paylaşım alınamıyor. %s"
msgid "Unable to retrieve share_gruop_type."
msgstr "Paylaşım grup bütür alınamadı."
msgid "Unable to retrieve share_type."
msgstr "share_type alınamadı."
msgid "Unable to retrieve snapshot details."
msgstr "Anlık görüntü ayrıntıları alınamıyor."
msgid "Unable to retrieve snapshot."
msgstr "Anlık görüntü alınamıyor."
msgid "Unable to retrieve volume details."
msgstr "Birim ayrıntıları alınamıyor."
msgid "Unable to revert share to the snapshot."
msgstr "Paylaşım anlık görüntüye geri alınamadı."
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "'%s' kopyası etkin olarak ayarlanamadı."
msgid "Unable to unmanage share."
msgstr "Paylaşım yönetim iptali başarısız."
#, python-format
msgid "Unable to update access for share group type \"%s\"."
msgstr "\"%s\" paylaşım grubu türü için erişim güncellenemedi."
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "Paylaşım türü \"%s\" için erişim güncellenemiyor."
msgid "Unable to update default quotas."
msgstr "Öntanımlı kotalar güncellenemedi."
msgid "Unable to update extra_specs for share type."
msgstr "Paylaşım türü için ek_özellikler başarıyla güncellendi."
msgid "Unable to update group_specs for share group type."
msgstr "Paylaşım grubu türü için grup özellikleri güncellenemedi."
msgid "Unable to update security service."
msgstr "Güvenlik servisi güncellenemedi."
msgid "Unable to update share group snapshot."
msgstr "Paylaşım grubu anlık görüntüsü güncellenemedi."
msgid "Unable to update share group type."
msgstr "Paylaşım grubu türü güncellenemedi."
msgid "Unable to update share group."
msgstr "Paylaşım grubu güncellenemiyor."
msgid "Unable to update share metadata."
msgstr "Paylaşım metaverisi güncellenemedi."
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "Paylaşım ağı \"%s\" güncellenemedi."
msgid "Unable to update share network."
msgstr "Paylaşım ağı güncellenemedi."
msgid "Unable to update share snapshot."
msgstr "Paylaşım anlık görüntüsü güncellenemedi."
msgid "Unable to update share type."
msgstr "Paylaşım türü güncellenemiyor."
msgid "Unable to update share."
msgstr "Paylaşım güncellenemedi."
msgid "Unknown"
msgstr "Bilinmiyor"
msgid "Unmanage"
msgstr "Yönetimi Bırak"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "Yönetimi Bırakma Hatası"
msgid "Unmanage Share"
msgstr "Paylaşım Yönetimini Bırak"
msgid "Update"
msgstr "Güncelle"
msgid "Update Share Group"
msgstr "Paylaşım Grubunu Güncelle"
msgid "Update Share Group Snapshot"
msgstr "Paylaşım Grubu Anlık Görüntüsünü Güncelle"
msgid "Update Share Group Type"
msgstr "Paylaşım Grubu Türünü Güncelle"
msgid "Update Share Network"
msgstr "Paylaşım Ağını Güncelle"
msgid "Update Share Snapshot"
msgstr "Paylaşım Anlık Görüntüsünü Güncelle"
msgid "Update Share Type"
msgstr "Paylaşım Türünü Güncelle"
msgid "Update Share group Type"
msgstr "Paylaşım grubu Türünü Güncelle"
msgid "Updated At"
msgstr "Güncelleme Zamanı"
#, python-format
msgid "Updated access for share group type \"%s\"."
msgstr "\"%s\" paylaşım grubu türü için erişimi güncelle."
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "\"%s\" paylaşım türü için erişim güncellendi."
#, python-format
msgid "Updated share network \"%s\"."
msgstr "\"%s\" paylaşım ağı güncellendi."
#, python-format
msgid "Updating share \"%s\""
msgstr "\"%s\" paylaşımı güncelleniyor"
#, python-format
msgid "Updating share group \"%s\""
msgstr "\"%s\" paylaşım grubu güncelleniyor"
#, python-format
msgid "Updating share group snapshot \"%s\""
msgstr "Paylaşım grubu anlık görüntüsü \"%s\" güncelleniyor"
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "Paylaşım metaverisi \"%s\" güncelleniyor"
#, python-format
msgid "Updating share network \"%s\""
msgstr "Paylaşım ağı \"%s\" güncelleniyor"
#, python-format
msgid "Updating share snapshot \"%s\""
msgstr "Paylaşım anlık görüntüsü \"%s\" güncelleniyor"
msgid "Use share group snapshot as a source"
msgstr "Paylaşım grubu anlık görüntüsünü kaynak olarak kullan"
msgid "Use snapshot as a source"
msgstr "Anlık görüntüyü kaynak olarak kullan"
msgid "User"
msgstr "Kullanıcı"
msgid "Visibility"
msgstr "Görünürlük"
msgid "Writable"
msgstr "Yazılabilir"
msgid "key=value pairs per line can be set"
msgstr "satır başına anahtar=değer çiftleri ayarlanabilir"
manila-ui-3.0.0/manila_ui/locale/zh_CN/ 0000775 0001750 0001750 00000000000 13647271736 017626 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/zh_CN/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021413 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/zh_CN/LC_MESSAGES/django.po 0000664 0001750 0001750 00000061374 13647271543 023224 0 ustar zuul zuul 0000000 0000000 # sunanchen , 2016. #zanata
# zhongjun , 2016. #zanata
# zzxwill , 2016. #zanata
# Bin , 2017. #zanata
# WenChao Xiang , 2017. #zanata
# liujunpeng , 2017. #zanata
# vuuv , 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-09-16 12:05+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-12-24 05:06+0000\n"
"Last-Translator: vuuv \n"
"Language-Team: Chinese (China)\n"
"Language: zh_CN\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
#, python-format
msgid "%sGiB"
msgstr "%sGiB"
msgid "(Quota exceeded)"
msgstr "(超过配额)"
msgid "Access Key"
msgstr "访问密钥"
msgid "Access Level"
msgstr "访问级别"
msgid "Access To"
msgstr "访问"
msgid "Access Type"
msgstr "访问类型"
msgid "Access to"
msgstr "访问"
msgctxt "Current status of share network"
msgid "Active"
msgstr "活动"
msgctxt "Current status of share server"
msgid "Active"
msgstr "活动"
msgid "Add"
msgstr "增加"
msgid "Add Rule"
msgstr "增加规则"
msgid "Add Security Service"
msgstr "增加安全服务"
msgid "Add rule"
msgstr "增加规则"
msgid "Add security services to share network."
msgstr "给共享网络增加安全服务"
msgid "All keys and values must be in range from 1 to 255."
msgstr "所有的键和值都必须在1到255之间"
msgid "Allow project access to share type."
msgstr "允许项目连接到共享类型"
msgid "At least one security service must be specified."
msgstr "至少指定一项安全服务"
msgid "Availability Zone"
msgstr "可用域"
msgid "Availability zone"
msgstr "可用区"
msgctxt "Current status of replica"
msgid "Available"
msgstr "可用"
msgctxt "Current status of share"
msgid "Available"
msgstr "可用"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "可用"
msgid "Available projects"
msgstr "可用项目"
msgid "Available security services"
msgstr "可用安全服务"
msgid "Cancel Migration"
msgstr "取消迁移"
msgid "Cancel migration"
msgstr "取消迁移"
msgid "Cancel migration of a Share"
msgstr "取消迁移共享"
msgid "Choose a snapshot"
msgstr "选择一个快照"
msgid "Complete Migration"
msgstr "完成迁移"
msgid "Complete migration"
msgstr "完成迁移"
msgid "Complete migration of a Share"
msgstr "完成共享迁移"
msgid "Confirm Migration Cancelling of Share"
msgstr "确认共享迁移的取消"
msgid "Confirm Migration Completion of Share"
msgstr "确认共享迁移的完成"
msgid "Confirm Obtaining migration progress of Share"
msgstr "确认获取共享迁移的进度"
msgid "Confirm Password"
msgstr "确认密码"
msgid "Confirm Unmanage Share"
msgstr "确认取消管理共享"
msgid "Create"
msgstr "创建"
msgid "Create Replica"
msgstr "创建副本"
msgid "Create Security Service"
msgstr "创建安全服务"
msgid "Create Share"
msgstr "创建共享"
msgid "Create Share Network"
msgstr "创建共享网络"
msgid "Create Share Snapshot"
msgstr "创建共享快照"
msgid "Create Share Type"
msgstr "创建共享类型"
msgid "Create a Share"
msgstr "创建共享"
msgid "Created At"
msgstr "创建于"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "创建中"
msgctxt "Current status of share"
msgid "Creating"
msgstr "创建中"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "正在创建"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "正在创建"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "为共享\"%s\".创建副本。"
#, python-format
msgid "Creating rule for \"%s\""
msgstr "为 \"%s\"创建规则"
#, python-format
msgid "Creating share \"%s\""
msgstr "创建共享\"%s\""
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "创建共享快照\"%s\"中"
#, python-format
msgid "Creating snapshot rule for \"%s\""
msgstr "创建快照规则\"%s\""
msgid "Current Size (GiB)"
msgstr "当前大小(GiB)"
msgid "DNS IP"
msgstr "DNS IP地址"
msgid "Delete Security Service"
msgid_plural "Delete Security Services"
msgstr[0] "删除安全服务"
msgid "Delete Share Group Snapshot"
msgid_plural "Delete Share Group Snapshots"
msgstr[0] "删除共享组快照"
msgid "Deleted Security Service"
msgid_plural "Deleted Security Services"
msgstr[0] "删除安全服务"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "删除中"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "删除中"
msgid "Description"
msgstr "描述"
msgid "Destination host and pool where share will be migrated to."
msgstr " 共享迁移到的目的主机和池。"
msgid "Domain"
msgstr "域名"
msgid "Driver handles share servers"
msgstr "共享服务器"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "Driver选项(例如,设置'volume_id'为Generic driver)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "复制密钥'%s'"
msgid "Edit"
msgstr "编辑"
msgid "Edit Security Service"
msgstr "编辑安全服务"
msgid "Edit Share"
msgstr "编辑共享"
msgid "Edit Share Metadata"
msgstr "编辑共享元数据"
msgid "Edit Share Network"
msgstr "编辑共享网络"
msgid ""
"Enforces migration of the share snapshots to the destination. If set to "
"True, host-assisted migration will not be attempted."
msgstr "强制共享快照迁移到目的地。如果为True,主机辅助迁移将不会尝试。"
msgid ""
"Enforces migration to be nondisruptive. If set to True, host-assisted "
"migration will not be attempted."
msgstr "强制迁移不干扰。如果设置为True,将不尝试主机辅助迁移。"
msgid ""
"Enforces migration to keep the share writable while contents are being "
"moved. If set to True, host-assisted migration will not be attempted."
msgstr ""
"当内容被移动时,强制迁移保持共享可写。如果为True,主机辅助迁移将不会尝试。"
msgid ""
"Enforces migration to preserve all file metadata when moving its contents. "
"If set to True, host-assisted migration will not be attempted."
msgstr ""
"当移动它的内容时,强制迁移保留所有文件元数据。如果为True,主机辅助迁移将不会"
"尝试。"
msgid ""
"Enforces the use of the host-assisted migration approach, which bypasses "
"driver optimizations."
msgstr "强制使用主机辅助迁移方法,绕过驱动最优参数。"
msgctxt "Current status of replica"
msgid "Error"
msgstr "错误"
msgctxt "Current status of share"
msgid "Error"
msgstr "错误"
msgctxt "Current status of share network"
msgid "Error"
msgstr "错误"
msgctxt "Current status of share server"
msgid "Error"
msgstr "错误"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "错误"
msgid "Expected only pairs of key=value."
msgstr "只支持键值对的方式key=value"
msgid "Export location"
msgstr "导入位置"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr "导入共享的位置。例如,NFS: 1.2.3.4:/path/to/share"
msgid "Extend"
msgstr "扩展"
msgid "Extend Share"
msgstr "扩展共享"
#, python-format
msgid "Extend share \"%s\""
msgstr "扩展共享 \"%s\""
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "扩展错误"
msgid "Extra specs"
msgstr "额外规范"
msgid "Force Host Assisted Migration"
msgstr "强制主机协助迁移"
msgid "From here you can update share network info. "
msgstr "您可在此处更新共享网络信息。"
msgid "Get migration progress"
msgstr "获取迁移进度"
msgid ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgstr "'driver_options'设置了不正确的值。只支持键值对的方式key=value"
msgid "Host"
msgstr "主机"
msgid "Host of share"
msgstr "共享主机"
msgid "Host to migrate share"
msgstr "选择要迁移的主机。"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr "共享服务所处的主机,比如some.host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP版本"
msgid "Id"
msgstr "Id"
#, python-format
msgid ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgstr ""
"额外规范中'spec_driver_handles_share_servers'的值设置的不正确。允许的值为%s。"
"不区分大小写"
msgctxt "Current status of share server"
msgid "In-use"
msgstr "正在使用"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "正在使用"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "失效"
#, python-format
msgid "Key '%s' has improper length."
msgstr "密钥'%s'长度不符合要求"
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "密钥不能包含空格。参看字符串'%s'。"
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "密钥不能包含空格。'%s'中存在错误"
msgid "Make visible for all"
msgstr "对所有人可见"
msgid "Manage"
msgstr "管理"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "管理错误"
msgid "Manage Replicas"
msgstr "管理副本"
msgid "Manage Rules"
msgstr "管理规则"
msgid "Manage Share"
msgstr "管理共享"
msgid "Manage Share Type Access"
msgstr "管理共享类型的访问权限"
msgid "Metadata"
msgstr "元数据"
msgid "Migrate Share"
msgstr "共享迁移"
msgid "Migrate a Share"
msgstr "迁移共享"
msgctxt "Current status of share"
msgid "Migrating"
msgstr "迁移中"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "正在迁移至"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "共享%(name)s已迁移百分之%(progress)s。"
msgid "Name"
msgstr "名称"
msgid "Network Type"
msgstr "网络类型"
msgid "Networks"
msgstr "网络"
msgid "Neutron Net"
msgstr "Neutron网络"
msgid "Neutron Subnet"
msgstr "Neutron子网"
msgid "New Size (GiB)"
msgstr "新大小(GiB)"
msgid "New share network to be set in migrated share"
msgstr " 在迁移共享中,设置新的共享网络"
msgid "New share type to be set in migrating share"
msgstr "在迁移共享中设置共享类型"
msgid "New size must be greater than current size."
msgstr "新大小必须大于当前大小"
msgid "No projects found."
msgstr "没有找到任何项目"
msgid "No projects selected."
msgstr "为选择任何项目"
msgid "No security services found."
msgstr "未发现安全服务"
msgid "No security services selected."
msgstr "未选择安全服务"
msgid "No source, empty share"
msgstr "没有源,空的共享"
msgid "Nondisruptive"
msgstr "不干扰"
msgid "Nova Net"
msgstr "Nova网络"
msgid "Obtain Progress"
msgstr "获取进度"
msgid "Obtain migration progress of a Share"
msgstr "获取共享迁移的进度"
msgid "Overview"
msgstr "概览"
msgid "Password"
msgstr "密码"
msgid "Passwords do not match."
msgstr "密码不匹配"
msgid "Preserve Metadata"
msgstr "保护元数据"
msgid "Preserve Snapshots"
msgstr "保留快照"
msgid "Project"
msgstr "项目"
msgid "Projects with access to share type"
msgstr "项目访问分享类型"
msgid "Protocol"
msgstr "协议"
msgid "Public"
msgstr "公有"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "副本详情:%(replica_display_name)s"
msgid "Replica State"
msgstr "副本状态"
msgid "Replicas"
msgstr "副本"
msgid "Reset Replica State"
msgstr "重置副本状态"
msgid "Reset Replica Status"
msgstr "重置副本状态"
msgid "Reset replica state"
msgstr "重置副本状态"
msgid "Reset replica status"
msgstr "重置副本状态"
msgid "Reset state"
msgstr "重置状态"
msgid "Reset status"
msgstr "重置状态"
#, python-format
msgid "Reseting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
msgstr "正在重置副本 ('%(id)s') 状态从'%(from)s'到 '%(to)s'。"
#, python-format
msgid "Reseting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "重置副本 ('%(id)s') 状态从'%(from)s'到 '%(to)s'。"
#, python-format
msgid ""
"Reseting share group snapshot ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "重置共享组快照('%(id)s') 状态从'%(from)s'至'%(to)s'"
msgid "Resync"
msgstr "重新同步"
msgid "Resync Replica"
msgstr "重新同步副本"
msgid "Resync replica"
msgstr "重新同步副本"
#, python-format
msgid "Resync'ing replica '%s'"
msgstr "重新同步副本'%s'"
msgid "Rules"
msgstr "规则"
msgid "Save Changes"
msgstr "保存变更"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "安全服务详情: %(service_display_name)s"
msgid "Security Service Overview"
msgstr "安全服务概览"
msgid "Security Services"
msgstr "安全服务"
msgid "Security services within share network"
msgstr "共享网络内的安全服务"
msgid "Segmentation Id"
msgstr "分段ID"
msgid "Selected projects"
msgstr "选择项目"
msgid "Selected security services"
msgstr "选择安全服务"
msgid "Server"
msgstr "主机"
msgid "Set Replica as Active"
msgstr "设置副本状态为Active"
msgid "Set as Active"
msgstr "设置为Active"
msgid "Set maximum quotas for the project."
msgstr "为项目设置最大配额"
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "设置副本\"%s\"状态为active。。。"
msgid "Share"
msgstr "共享"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "共享详情: %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "共享详情: %(share_name)s"
msgid "Share Group Snapshots"
msgstr "共享组快照"
msgid "Share ID"
msgstr "共享ID"
#, python-format
msgid "Share Instance Details: %s"
msgstr "共享实例详情: %s"
msgid "Share Instances"
msgstr "共享实例"
msgid "Share Name"
msgstr "共享名称"
msgid "Share Network"
msgstr "共享网络"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "共享网络详情: %(network_display_name)s"
msgid "Share Network Info"
msgstr "共享网络信息"
msgid "Share Networks"
msgstr "共享网络"
msgid "Share Protocol"
msgstr "共享协议"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr "共享副本: %(share_display_name)s"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "共享规则: %(share_display_name)s"
msgid "Share Server"
msgstr "共享服务器"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "共享服务器详情: %(server_name)s"
msgid "Share Server Id"
msgstr "共享服务器Id"
msgid "Share Servers"
msgstr "共享服务器"
msgid "Share Snapshots"
msgstr "共享快照"
msgid "Share Snapshots Storage"
msgstr "共享快照存储"
msgid "Share Source"
msgstr "共享源"
msgid "Share Storage"
msgstr "共享存储"
msgid "Share Type"
msgstr "共享类型"
msgid "Share Types"
msgstr "共享类型"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr "共享不能扩展到 %(req)iGiB,因为您的可用配额只有 %(avail)iGiB。"
msgid "Share name to be assigned"
msgstr "指定分享名称"
#, python-format
msgid "Share replica %s has been deleted."
msgstr "共享副本'%s'已经被删除。"
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr "分享大小必须等于或者大于快照大小(%sGiB)"
msgid "Shares"
msgstr "共享"
msgid "Shares Networks"
msgstr "共享网络"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "大小"
msgid "Size (GiB)"
msgstr "大小(GiB)"
msgid "Snapshot"
msgstr "快照"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "快照详情: %(snapshot_display_name)s"
msgid "Snapshot Overview"
msgstr "快照概览"
#, python-format
msgid "Snapshot Rules: %(snapshot_display_name)s"
msgstr "快照规则:%(snapshot_display_name)s"
msgid "Source"
msgstr "源"
msgid ""
"Specify the new share network for the share. Do not specify this parameter "
"if the migrating share has to be retained within its current share network."
msgstr ""
"为共享指定新的共享网络。如果迁移共享被保留在它的当前共享网络时,不要指定这参"
"数。"
msgid ""
"Specify the new share type for the share. Do not specify this parameter if "
"the migrating share has to be retained with its current share type."
msgstr ""
"为共享指定新的共享类型。如果迁移共享被保留在它的当前共享类型时,不要指定这个"
"参数。"
msgid "Start migration"
msgstr "开始迁移"
msgid "Status"
msgstr "状态"
#, python-format
msgid "Successfully created security service: %s"
msgstr "成功创建安全服务%s"
#, python-format
msgid "Successfully created share network: %s"
msgstr "成功创建共享网络%s"
#, python-format
msgid "Successfully created share type: %s"
msgstr "创建共享类型%s成功"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr "成功发送取消共享: %s迁移的请求。"
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr "成功发送完成共享迁移: %s的请求。"
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "已成功发送管理卷 %s 的请求"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "已成功发送迁移共享: %s的请求。"
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr "已成功发送取消管理卷 %s 的请求"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "成功更新共享类型的额外规范'%s'"
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "成功更新安全服务\"%s\""
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr "共享大小不能小于快照大小(%sGiB)"
msgid "Type"
msgstr "类型"
msgid "Unable to add rule."
msgstr "无法增加规则"
msgid "Unable to add snapshot rule."
msgstr "不能添加快照规则。"
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr "当前无法取消共享%s的迁移。"
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "无法完成共享: %s的迁移。"
msgid "Unable to create security service."
msgstr "无法创建安全服务"
msgid "Unable to create share network."
msgstr "无法创建共享网络"
msgid "Unable to create share replica."
msgstr "无法创建共享副本。"
msgid "Unable to create share snapshot."
msgstr "无法创建共享快照"
msgid "Unable to create share type."
msgstr "无法创建共享类型"
msgid "Unable to create share."
msgstr "无法创建共享"
#, python-format
msgid "Unable to delete replica \"%s\"."
msgstr "无法删除副本'%s'。"
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "无法删除规则 \"%s\""
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "无法删除共享 \"%s\""
#, python-format
msgid ""
"Unable to delete share group snapshot \"%s\". One or more share groups "
"depend on it."
msgstr "无法删除共享组快照\"%s\",至少一个共享组与其存在依赖关系"
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr "无法删除快照\"%s\"。一个或多个共享正在使用"
#, python-format
msgid "Unable to delete snapshot rule \"%s\"."
msgstr "不能删除快照规则\"%s\"。"
msgid "Unable to extend share."
msgstr "无法扩展共享"
msgid "Unable to get information about share type access."
msgstr "无法获得共享类型访问信息"
msgid "Unable to get list of projects."
msgstr "无法获得项目列表"
msgid "Unable to get the security services hosts"
msgstr "无法获得安全服务主机"
msgid "Unable to load the specified snapshot."
msgstr "无法加载指定快照"
msgid "Unable to manage share"
msgstr "无法管理共享"
#, python-format
msgid "Unable to migrate share %s."
msgstr "无法迁移共享%s。"
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr "当前无法获得共享%s的迁移进度。"
#, python-format
msgid "Unable to reset state of replica '%s'."
msgstr "无法重置副本'%s'的状态。"
#, python-format
msgid "Unable to reset status of replica '%s'."
msgstr "无法重置副本'%s'的状态。"
#, python-format
msgid "Unable to reset status of share group snapshot '%s'."
msgstr "无法重置共享组快照'%s'的状态"
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "无法重新同步副本 '%s'。"
msgid "Unable to retrieve list of projects."
msgstr "无法检索项目列表"
msgid "Unable to retrieve quotas."
msgstr "无法检索配额"
#, python-format
msgid "Unable to retrieve replica '%s'."
msgstr "无法检索副本'%s'。"
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "无法检索安全服务详情'%s'"
msgid "Unable to retrieve security services"
msgstr "无法检索安全服务"
msgid "Unable to retrieve security_service."
msgstr "无法检索安全服务"
msgid "Unable to retrieve share details."
msgstr "无法检索共享详情"
msgid "Unable to retrieve share instance details."
msgstr "无法检索共享实例详情"
msgid "Unable to retrieve share instances."
msgstr "无法检索共享实例"
msgid "Unable to retrieve share limit information."
msgstr "无法检索共享限制信息"
msgid "Unable to retrieve share list."
msgstr "无法检索共享列表"
msgid "Unable to retrieve share network details."
msgstr "无法检索共享网络详情"
msgid "Unable to retrieve share network."
msgstr "无法检索共享网络"
msgid "Unable to retrieve share networks"
msgstr "无法检索共享网络"
msgid "Unable to retrieve share replicas."
msgstr "无法检索共享副本"
msgid "Unable to retrieve share rules."
msgstr "无法检索共享规则"
msgid "Unable to retrieve share server details."
msgstr "无法检索共享服务器详情"
msgid "Unable to retrieve share servers"
msgstr "无法检索共享服务器"
msgid "Unable to retrieve share snapshots list."
msgstr "无法检索共享快照列表"
msgid "Unable to retrieve share snapshots."
msgstr "无法检索共享快照"
msgid "Unable to retrieve share."
msgstr "无法检索共享"
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "无法检索共享。%s"
msgid "Unable to retrieve share_type."
msgstr "无法检索共享类型"
msgid "Unable to retrieve snapshot details."
msgstr "无法检索快照详情"
msgid "Unable to retrieve snapshot."
msgstr "无法检索快照"
msgid "Unable to retrieve volume details."
msgstr "无法检索卷详情"
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "无法设置副本'%s'状态为active。"
msgid "Unable to unmanage share."
msgstr "无法取消管理共享"
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "无法更新共享类型\"%s\"的访问权限"
msgid "Unable to update default quotas."
msgstr "无法更新默认配额"
msgid "Unable to update extra_specs for share type."
msgstr "无法更新共享类型的额外规范"
msgid "Unable to update security service."
msgstr "无法更新安全服务"
msgid "Unable to update share metadata."
msgstr "无法更新共享元数据"
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "无法更新共享网络 \"%s\""
msgid "Unable to update share network."
msgstr "无法更新共享网络"
msgid "Unable to update share type."
msgstr "无法更新共享类型"
msgid "Unable to update share."
msgstr "无法更新共享"
msgid "Unknown"
msgstr "未知"
msgid "Unmanage"
msgstr "取消管理"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "取消管理错误"
msgid "Unmanage Share"
msgstr "取消管理共享"
msgid "Update"
msgstr "更新"
msgid "Update Share Network"
msgstr "更新共享网络"
msgid "Update Share Type"
msgstr "更新共享类型"
msgid "Updated At"
msgstr "更新于"
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "更新共享类型\"%s\"的访问权限"
#, python-format
msgid "Updated share network \"%s\"."
msgstr "更新共享网络\"%s\""
#, python-format
msgid "Updating share \"%s\""
msgstr "正在更新共享 \"%s\""
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "正在更新共享元数据 \"%s\""
#, python-format
msgid "Updating share network \"%s\""
msgstr "更新共享网络\"%s\""
msgid "Use snapshot as a source"
msgstr "使用快照作为源"
msgid "User"
msgstr "用户"
msgid "Visibility"
msgstr "可见性"
msgid "Writable"
msgstr "可写入的"
msgid "key=value pairs per line can be set"
msgstr "每一行设置键值对"
manila-ui-3.0.0/manila_ui/locale/cs/ 0000775 0001750 0001750 00000000000 13647271736 017232 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/cs/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021017 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/cs/LC_MESSAGES/django.po 0000664 0001750 0001750 00000047442 13647271543 022630 0 ustar zuul zuul 0000000 0000000 # Stanislav Ulrych , 2016. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-09-16 12:05+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-24 11:18+0000\n"
"Last-Translator: Stanislav Ulrych \n"
"Language-Team: Czech\n"
"Language: cs\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
#, python-format
msgid "%sGiB"
msgstr "%sGiB"
msgid "(Quota exceeded)"
msgstr "(kvóta překročena)"
msgid "Access Level"
msgstr "Úroveň přístupu"
msgid "Access To"
msgstr "Přístup do"
msgid "Access Type"
msgstr "Typ přístupu"
msgid "Access to"
msgstr "Přístup do"
msgctxt "Current status of share network"
msgid "Active"
msgstr "Aktivní"
msgctxt "Current status of share server"
msgid "Active"
msgstr "Aktivní"
msgid "Add"
msgstr "Přidat"
msgid "Add Rule"
msgstr "Přidat pravidlo"
msgid "Add Security Service"
msgstr "Přidat bezpečnostní službu"
msgid "Add rule"
msgstr "Přidat pravidlo"
msgid "Add security services to share network."
msgstr "Přidat bezpečnostní služby do sítě sdílení."
msgid "All keys and values must be in range from 1 to 255."
msgstr "Všechny klíče a hodnoty musí být v rozsau 1 až 255."
msgid "Allow project access to share type."
msgstr "Povolit projektu přístup k typu sdílení"
msgid "At least one security service must be specified."
msgstr "Musí být zadána alespoň jedna bezpečnostní služba."
msgid "Availability Zone"
msgstr "Zóna dostupnosti"
msgid "Availability zone"
msgstr "Zóna dostupnosti"
msgctxt "Current status of replica"
msgid "Available"
msgstr "Dostupné"
msgctxt "Current status of share"
msgid "Available"
msgstr "Dostupné"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "Dostupné"
msgid "Available projects"
msgstr "Dostupné projekty"
msgid "Available security services"
msgstr "Dostupné bezpečnostní služby"
msgid "Cancel Migration"
msgstr "Zrušit migraci"
msgid "Cancel migration"
msgstr "Zrušit migraci"
msgid "Cancel migration of a Share"
msgstr "Zrušit migraci sdílení"
msgid "Choose a snapshot"
msgstr "Zvolte snapshot"
msgid "Complete Migration"
msgstr "Dokončit migraci"
msgid "Complete migration"
msgstr "Dokončit migraci"
msgid "Complete migration of a Share"
msgstr "Dokončit migraci sdílení"
msgid "Confirm Migration Cancelling of Share"
msgstr "Potvrdit zrušení migrace sdílení"
msgid "Confirm Migration Completion of Share"
msgstr "Potvrdit dokončení migraci sdílení"
msgid "Confirm Password"
msgstr "Potvrdit heslo"
msgid "Create"
msgstr "Vytvořit"
msgid "Create Replica"
msgstr "Vytvořit repliku"
msgid "Create Security Service"
msgstr "Vytvořit bezpečnostní službu"
msgid "Create Share"
msgstr "Vytvořit sdílení"
msgid "Create Share Network"
msgstr "Vytvořit síť sdílení"
msgid "Create Share Snapshot"
msgstr "Vytvořit snapshot sdílení."
msgid "Create Share Type"
msgstr "Vytvořit typ sdílení"
msgid "Create a Share"
msgstr "Vytvořit sdílení"
msgid "Created At"
msgstr "Vytvořeno"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "Vytváření"
msgctxt "Current status of share"
msgid "Creating"
msgstr "Vytváření"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "Vytváření"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "Výtvářeno"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "Vytváření repliky pro sdílení \"%s\"."
#, python-format
msgid "Creating rule for \"%s\""
msgstr "Vytváření pravidla pro \"%s\""
#, python-format
msgid "Creating share \"%s\""
msgstr "Vytváření sdílení \"%s\""
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "Vytváření snapshotu sdílení \"%s\"."
msgid "Current Size (GiB)"
msgstr "Současná velikost (GiB)"
msgid "DNS IP"
msgstr "DNS IP"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "Mazání"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "Mazání"
msgid "Description"
msgstr "Popis"
msgid "Domain"
msgstr "Doména"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "Volby driveru ('volume_id' pro generický driver atd.)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "Duplikátní klíče '%s'."
msgid "Edit"
msgstr "Upravit"
msgid "Edit Security Service"
msgstr "Upravit bezpečnostní službu"
msgid "Edit Share"
msgstr "Upravit sdílení"
msgid "Edit Share Metadata"
msgstr "Upravit metadata sdílení"
msgid "Edit Share Network"
msgstr "Upravit síť sdílení"
msgctxt "Current status of replica"
msgid "Error"
msgstr "Chyba"
msgctxt "Current status of share"
msgid "Error"
msgstr "Chyba"
msgctxt "Current status of share network"
msgid "Error"
msgstr "Chyba"
msgctxt "Current status of share server"
msgid "Error"
msgstr "Chyba"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "Chyba"
msgid "Extend"
msgstr "Rozšířit"
msgid "Extend Share"
msgstr "Rozšířit sdílení"
#, python-format
msgid "Extend share \"%s\""
msgstr "Zvětšit sdílení \"%s\""
msgid "Extra specs"
msgstr "Dodatečné specifikace"
msgid "Force Host Assisted Migration"
msgstr "Vynutit migraci asistovanou hostitelem"
msgid "From here you can update share network info. "
msgstr "Zde můžete upravit informace o síti sdílení."
msgid "Host"
msgstr "Hostitel"
msgid "Host of share"
msgstr "Hostitel sdílení"
msgid "Host to migrate share"
msgstr "Hostitel na který má být sdílení migrováno"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr "Hostitel, na němž se sdílení nachází, příklad: some.host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "Verze IP"
msgid "Id"
msgstr "Id"
msgctxt "Current status of share server"
msgid "In-use"
msgstr "Používá se"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "Používá se"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "Neaktivní"
#, python-format
msgid "Key '%s' has improper length."
msgstr "Klíč '%s' nemá správnou délku."
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "Klíč nemůže obsahovat mezery. Viz řetězec '%s'."
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "Klíče nemohou obsahovat mezery. Chyba v '%s'."
msgid "Make visible for all"
msgstr "Učinit viditelné pro všechny"
msgid "Manage"
msgstr "Spravovat"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "Spravovat chyby"
msgid "Manage Rules"
msgstr "Správa pravidel"
msgid "Manage Share Type Access"
msgstr "Spravovat přístup typů sdílení"
msgid "Metadata"
msgstr "Metadata"
msgid "Migrate Share"
msgstr "Migrovat sdílení"
msgid "Migrate a Share"
msgstr "Migrovat sdílení"
msgctxt "Current status of share"
msgid "Migrating"
msgstr "Migrace"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "Migrace do"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "Migrace sdílení %(name)s je hotová z %(progress)s procent."
msgid "Name"
msgstr "Název"
msgid "Network Type"
msgstr "Typ sítě"
msgid "Networks"
msgstr "Sítě"
msgid "Neutron Net"
msgstr "Neutron síť"
msgid "Neutron Subnet"
msgstr "Neutron podsíť"
msgid "New Size (GiB)"
msgstr "Nová velkost (GiB)"
msgid "New share network to be set in migrated share"
msgstr "Nová síť sdílení pro zmigrované sdílení"
msgid "New size must be greater than current size."
msgstr "Nová velikost musí být větší než současná."
msgid "No projects found."
msgstr "Nenalezeny žádné projekty."
msgid "No projects selected."
msgstr "Nevybrány žádné projekty."
msgid "No security services found."
msgstr "Nenalezeny žádné bezpečnostní služby."
msgid "No security services selected."
msgstr "Nevybrány žádné bezpečnostní služby."
msgid "No source, empty share"
msgstr "Žádný zdroj, prázdné sdílení"
msgid "Nova Net"
msgstr "Nova Net"
msgid "Overview"
msgstr "Přehled"
msgid "Password"
msgstr "Heslo"
msgid "Passwords do not match."
msgstr "Hesla se neshodují."
msgid "Preserve Metadata"
msgstr "Zachovat metadata"
msgid "Project"
msgstr "Projekt"
msgid "Projects with access to share type"
msgstr "Projekty s přístupem k typu sdílení"
msgid "Protocol"
msgstr "Protokol"
msgid "Public"
msgstr "Veřejný"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "Detaily repliky: %(replica_display_name)s"
msgid "Replica State"
msgstr "Stav repliky"
msgid "Rules"
msgstr "Pravidla"
msgid "Save Changes"
msgstr "Uložit změny"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "Detaily bezpečnostní služby: %(service_display_name)s"
msgid "Security Services"
msgstr "Bezpečnostní služby"
msgid "Security services within share network"
msgstr "Bezpečnostní služby v síti sdílení"
msgid "Segmentation Id"
msgstr "ID segmentace"
msgid "Selected projects"
msgstr "Vybrané projekty"
msgid "Selected security services"
msgstr "Vybrané bezpečnostní služby"
msgid "Server"
msgstr "Server"
msgid "Set Replica as Active"
msgstr "Nastavit repliku jako aktivní"
msgid "Set as Active"
msgstr "Nastavit jako aktivní"
msgid "Set maximum quotas for the project."
msgstr "Nastavit maximální kvóty pro projekt."
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "Nastavování repliky \"%s\" jako aktivní..."
msgid "Share"
msgstr "Sdílení"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "Detaily sdílení: %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "Detaily sdílení: %(share_name)s"
msgid "Share ID"
msgstr "Share ID"
#, python-format
msgid "Share Instance Details: %s"
msgstr "Detaily instance sdílení: %s"
msgid "Share Instances"
msgstr "Instance sdílení"
msgid "Share Name"
msgstr "Název sdílení"
msgid "Share Network"
msgstr "Síť sdílení"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "Detaily sítě sdílení: %(network_display_name)s"
msgid "Share Network Info"
msgstr "Informace o síti sdílení"
msgid "Share Networks"
msgstr "Sítě sdílení"
msgid "Share Protocol"
msgstr "Protokol sdílení"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr "Repliky sdílení: %(share_display_name)s"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "Pravidla sdílení: %(share_display_name)s"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "Detaily serveru sdílení: %(server_name)s"
msgid "Share Server Id"
msgstr "Id serveru sdílení"
msgid "Share Servers"
msgstr "Servery sdílení"
msgid "Share Snapshots"
msgstr "Snapshoty sdílení"
msgid "Share Snapshots Storage"
msgstr "Úložiště snapshotů sdílení"
msgid "Share Source"
msgstr "Zdroj sdílení"
msgid "Share Storage"
msgstr "Sdílené úložiště"
msgid "Share Type"
msgstr "Typ sdílení"
msgid "Share Types"
msgstr "Typy sdílení"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"Sdílení nemůže být zvětšeno na %(req)iGiB, protože máte dostupných pouze "
"%(avail)iGiB z vaší kvóty."
msgid "Share name to be assigned"
msgstr "Název sdílení, který bude přidělen."
#, python-format
msgid "Share replica %s has been deleted."
msgstr "Replika sdílení %s byla smazána."
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr "Velikost sdílení musí být větší nebo roven velikosti snapshotu (%sGiB)"
msgid "Shares"
msgstr "Sdílení"
msgid "Shares Networks"
msgstr "Sítě sdílení"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "Velikost"
msgid "Size (GiB)"
msgstr "Velikost (GiB)"
msgid "Snapshot"
msgstr "Snapshot"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "Detaily snapshot: %(snapshot_display_name)s"
msgid "Snapshot Overview"
msgstr "Přehled snapshotů"
msgid "Source"
msgstr "Zdroj"
msgid "Start migration"
msgstr "Spustit migraci"
msgid "Status"
msgstr "Status"
#, python-format
msgid "Successfully created security service: %s"
msgstr "Úspěšně vytvořena bezpečnostní služba: %s"
#, python-format
msgid "Successfully created share network: %s"
msgstr "Úspěšně vytvořena síť sdílení: %s"
#, python-format
msgid "Successfully created share type: %s"
msgstr "Úspěšně vytvořen typ sdílení: %s"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr "Požadavek na zrušení migrace sdílení odeslán úspěšně: %s."
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr "Požadavek na dokončení migrace sdílení odeslán úspěšně: %s."
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "Žádost o správu sdílení byla úspěšně odeslána: %s"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "Požadavek na migraci sdílení odeslán úspěšně: %s."
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr "Žádost o zrušení správy sdílení byla úspěšně odeslána: %s"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "Úspěšně aktualizovány dodatečné specifikace pro typ sdílení '%s'."
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "Úspěšně aktualizována bezpečnostní služba: %s"
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr "Velikost sdílení nemůže být menší než velikost snapshotu (%sGiB)"
msgid "Type"
msgstr "Typ"
msgid "Unable to add rule."
msgstr "Nelze přidat pravidlo."
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr "Momentálně nelze zrušit migraci sdílení %s."
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "Nelze dokončit migraci sdílení %s."
msgid "Unable to create security service."
msgstr "Nelze vytvořit bezpečnostní službu."
msgid "Unable to create share network."
msgstr "Nelze vytvořit sít sdílení."
msgid "Unable to create share replica."
msgstr "Nelze vytvořit repliku sdílení."
msgid "Unable to create share snapshot."
msgstr "Nelze vytvořit snapshot sdílení."
msgid "Unable to create share type."
msgstr "Nelze vytvořit typ sdílení."
msgid "Unable to create share."
msgstr "Nelze vytvořit sdílení."
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "Nelze smazat pravidlo \"%s\"."
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "Nelze smazat sdílení \"%s\". "
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr "Nelze smazat snapshot \"%s\". Jedno nebo více sdílení na něm závisí."
msgid "Unable to extend share."
msgstr "Nelze zvětšit sdílení."
msgid "Unable to get information about share type access."
msgstr "Nelze získat informaci o přístupu ke sdílení"
msgid "Unable to get list of projects."
msgstr "Nelze získat seznam projektů."
msgid "Unable to get the security services hosts"
msgstr "Nelze získat hostitele bezpečnostních služeb"
msgid "Unable to load the specified snapshot."
msgstr "Nelze načíst zadaný snapshot."
msgid "Unable to manage share"
msgstr "Nelze spravovat sdílení."
#, python-format
msgid "Unable to migrate share %s."
msgstr "Nelze migrovat sdílení %s."
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr "Momentálně nelze získat stav procesu migrace sdílení %s."
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "Nelze synchronizovat repliku '%s'."
msgid "Unable to retrieve list of projects."
msgstr "Nelze získat seznam projektů."
msgid "Unable to retrieve quotas."
msgstr "Nelze získat kvóty."
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "Nelze získat detaily o bezpečnostní službě '%s'."
msgid "Unable to retrieve security services"
msgstr "Nelze získat bezpečnostní služby."
msgid "Unable to retrieve security_service."
msgstr "Nelze získat security_service."
msgid "Unable to retrieve share details."
msgstr "Nelze získat detaily sdílení."
msgid "Unable to retrieve share instance details."
msgstr "Nelze získat detaily instance sdílení."
msgid "Unable to retrieve share instances."
msgstr "Nelze získat instance sdílení."
msgid "Unable to retrieve share list."
msgstr "Nelze získat seznam sdílení."
msgid "Unable to retrieve share network details."
msgstr "Nelze získat detaily sítě sdílení."
msgid "Unable to retrieve share network."
msgstr "Nelze získat sít sdílení."
msgid "Unable to retrieve share networks"
msgstr "Nelze získat sítě sdílení"
msgid "Unable to retrieve share replicas."
msgstr "Nelze získat repliky sdílení."
msgid "Unable to retrieve share rules."
msgstr "Nelze získat pravidla sdílení."
msgid "Unable to retrieve share server details."
msgstr "Nelze získat detaily serveru sdílení."
msgid "Unable to retrieve share servers"
msgstr "Nelze získat servery sdílení"
msgid "Unable to retrieve share snapshots list."
msgstr "Nelze získat seznam snapshotů sdílení."
msgid "Unable to retrieve share snapshots."
msgstr "Nelze získat snapshoty sdílení."
msgid "Unable to retrieve share."
msgstr "Nelze získat sdílení."
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "Nelze získat sdílení. %s"
msgid "Unable to retrieve share_type."
msgstr "Nelze získat share_type."
msgid "Unable to retrieve snapshot details."
msgstr "Nelze získat detaily snapshotu."
msgid "Unable to retrieve snapshot."
msgstr "Nelze získat snapshot."
msgid "Unable to retrieve volume details."
msgstr "Nelze získat detaily svazku."
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "Nelze nastavit repliku '%s' jako aktivní."
msgid "Unable to unmanage share."
msgstr "Nelze zrušit správu sdílení."
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "Nelze aktualizovat přístup pro typ sdílení \"%s\"."
msgid "Unable to update default quotas."
msgstr "Nelze aktualizovat výchozí kvóty."
msgid "Unable to update extra_specs for share type."
msgstr "Nelze aktualizovat extra_specs pro typ sdílení."
msgid "Unable to update security service."
msgstr "Nelze aktualizovat bezpečnostní službu."
msgid "Unable to update share metadata."
msgstr "Nelze aktualizovat metadata sdílení."
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "Nelze aktualizovat síť sdílení \"%s\"."
msgid "Unable to update share network."
msgstr "Nelze aktualizovat síť sdílení."
msgid "Unable to update share type."
msgstr "Nelze aktualizovat typ sdílení."
msgid "Unable to update share."
msgstr "Nelze aktualizovat sdílení."
msgid "Unknown"
msgstr "Neznámé"
msgid "Unmanage"
msgstr "Zrušit správu"
msgid "Update"
msgstr "Aktualizovat"
msgid "Update Share Network"
msgstr "Aktualizovat síť sdílení"
msgid "Updated At"
msgstr "Aktualizováno"
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "Aktualizován přístup pro typ sdílení \"%s\"."
#, python-format
msgid "Updated share network \"%s\"."
msgstr "Aktualizována síť sdílení \"%s\"."
#, python-format
msgid "Updating share \"%s\""
msgstr "Aktualizace sdílení \"%s\""
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "Aktualizace metadat sdílení \"%s\""
#, python-format
msgid "Updating share network \"%s\""
msgstr "Aktualizace sítě sdílení \"%s\""
msgid "Use snapshot as a source"
msgstr "Použít snapshot jako zdroj"
msgid "User"
msgstr "Uživatel"
msgid "Writable"
msgstr "Zapisovatelný"
manila-ui-3.0.0/manila_ui/locale/ja/ 0000775 0001750 0001750 00000000000 13647271736 017217 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/ja/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021004 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/ja/LC_MESSAGES/django.po 0000664 0001750 0001750 00000053561 13647271543 022614 0 ustar zuul zuul 0000000 0000000 # Akihiro Motoki , 2016. #zanata
# Shu Muto , 2016. #zanata
# Kyohei Moriyama , 2017. #zanata
# Yuko Katabami , 2017. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-04-18 02:02+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2017-09-14 05:37+0000\n"
"Last-Translator: Kyohei Moriyama \n"
"Language-Team: Japanese\n"
"Language: ja\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
#, python-format
msgid "%sGiB"
msgstr "%sGiB"
msgid "(Quota exceeded)"
msgstr "(クォータを超過しました)"
msgid "Access Level"
msgstr "アクセスレベル"
msgid "Access To"
msgstr "接続先"
msgid "Access Type"
msgstr "アクセス種別"
msgid "Access to"
msgstr "接続先"
msgctxt "Current status of share network"
msgid "Active"
msgstr "稼働中"
msgctxt "Current status of share server"
msgid "Active"
msgstr "稼働中"
msgid "Add"
msgstr "追加"
msgid "Add Rule"
msgstr "ルールの追加"
msgid "Add Security Service"
msgstr "セキュリティーサービスの追加"
msgid "Add rule"
msgstr "ルールの追加"
msgid "Add security services to share network."
msgstr "ファイル共有ネットワークにセキュリティーサービスを追加します。"
msgid "All keys and values must be in range from 1 to 255."
msgstr "すべてのキーと値は 1 から 255 の範囲でなければいけません。"
msgid "Allow project access to share type."
msgstr "ファイル共有種別への接続をプロジェクトに許可します。"
msgid "At least one security service must be specified."
msgstr "少なくとも 1 つのセキュリティサービスを指定する必要があります。"
msgid "Availability Zone"
msgstr "アベイラビリティーゾーン"
msgctxt "Current status of share"
msgid "Available"
msgstr "利用可能"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "利用可能"
msgid "Available projects"
msgstr "使用可能なプロジェクト"
msgid "Available security services"
msgstr "利用可能なセキュリティーサービス"
msgid "Cancel Migration"
msgstr "移行の取り消し"
msgid "Cancel migration of a Share"
msgstr "ファイル共有の移行の取り消し"
msgid "Choose a snapshot"
msgstr "スナップショットを選択してください"
msgid "Confirm Migration Cancelling of Share"
msgstr "ファイル共有の移行の確認"
msgid "Confirm Password"
msgstr "パスワード(確認)"
msgid "Confirm Unmanage Share"
msgstr "ファイル共有の管理解除の確認"
msgid "Create"
msgstr "作成"
msgid "Create Security Service"
msgstr "セキュリティーサービスの作成"
msgid "Create Share"
msgstr "ファイル共有の作成"
#, fuzzy
msgid "Create Share Network"
msgstr "ファイル共有ネットワークの作成"
msgid "Create Share Snapshot"
msgstr "ファイル共有スナップショットの作成"
msgid "Create Share Type"
msgstr "ファイル共有種別の作成"
msgid "Create a Share"
msgstr "ファイル共有の作成"
msgctxt "Current status of share"
msgid "Creating"
msgstr "作成中"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "作成中"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "作成中"
#, python-format
msgid "Creating rule for \"%s\""
msgstr "「%s」のルールを作成中"
#, python-format
msgid "Creating share \"%s\""
msgstr "ファイル共有「%s」を作成中"
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "ファイル共有スナップショット \"%s\" を作成しています。"
msgid "Current Size (GiB)"
msgstr "現在のサイズ (GiB)"
msgid "DNS IP"
msgstr "DNS IP"
msgid "Delete Security Service"
msgid_plural "Delete Security Services"
msgstr[0] "セキュリティサービスを削除します"
msgid "Delete Share Group Snapshot"
msgid_plural "Delete Share Group Snapshots"
msgstr[0] "共有グループスナップショットを削除する"
msgid "Deleted Security Service"
msgid_plural "Deleted Security Services"
msgstr[0] "セキュリティサービスを削除しました"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "削除中"
msgid "Description"
msgstr "説明"
msgid "Domain"
msgstr "ドメイン"
msgid "Driver handles share servers"
msgstr "ファイル共有サーバーを処理するドライバー"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "ドライバーオプション(Genericドライバーの「volume_id」、など)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "キー「%s」が重複しています"
msgid "Edit"
msgstr "編集"
msgid "Edit Security Service"
msgstr "セキュリティーサービスの編集"
msgid "Edit Share"
msgstr "ファイル共有の編集"
msgid "Edit Share Metadata"
msgstr "ファイル共有のメタデータの編集"
#, fuzzy
msgid "Edit Share Network"
msgstr "ファイル共有ネットワークの編集"
msgctxt "Current status of share"
msgid "Error"
msgstr "エラー"
msgctxt "Current status of share network"
msgid "Error"
msgstr "エラー"
msgctxt "Current status of share server"
msgid "Error"
msgstr "エラー"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "エラー"
msgid "Expected only pairs of key=value."
msgstr "キー=値のペアのみ設定できます。"
msgid "Export location"
msgstr "エクスポート場所"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr "ファイル共有のエクスポート場所。NFSの例: 1.2.3.4:/path/to/share"
msgid "Extend"
msgstr "拡張"
msgid "Extend Share"
msgstr "ファイル共有の拡張"
#, python-format
msgid "Extend share \"%s\""
msgstr "ファイル共有「%s」の拡張"
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "拡張中のエラー"
msgid "Extra specs"
msgstr "追加スペック"
msgid "From here you can update share network info. "
msgstr "ここから、ファイル共有ネットワーク情報を更新できます。"
msgid ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgstr ""
"フィールド「driver_options」に不適切な値があります。キー=値のペアのみ設定でき"
"ます。"
msgid "Host"
msgstr "ホスト"
msgid "Host of share"
msgstr "ファイル共有のホスト"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr "ファイル共有が配置されるホスト。例: some.host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP バージョン"
msgid "Id"
msgstr "ID"
#, python-format
msgid ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgstr ""
"必須の追加のスペック「spec_driver_handles_share_servers」に不適切な値が設定さ"
"れました。%s が使用できます。 大文字小文字を区別しません。"
msgctxt "Current status of share server"
msgid "In-use"
msgstr "使用中"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "使用中"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "非稼働"
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "キーに空白は使えません。「%s」を確認してください。"
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "キーに空白は使えません。「%s」にエラーがあります。"
msgid "Make visible for all"
msgstr "全ユーザーに公開する"
msgid "Manage"
msgstr "管理"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "管理エラー"
msgid "Manage Rules"
msgstr "ルールの管理"
msgid "Manage Share"
msgstr "ファイル共有の管理"
msgid "Manage Share Type Access"
msgstr "ファイル共有種別の接続の管理"
msgid "Metadata"
msgstr "メタデータ"
msgid "Migrate a Share"
msgstr "ファイル共有の移行"
msgid "Name"
msgstr "名前"
msgid "Network Type"
msgstr "ネットワーク種別"
msgid "Networks"
msgstr "ネットワーク"
msgid "Neutron Net"
msgstr "Neutron ネットワーク"
msgid "Neutron Subnet"
msgstr "Neutron サブネット"
msgid "New Size (GiB)"
msgstr "新しいサイズ (GiB)"
msgid "New size must be greater than current size."
msgstr "変更後のサイズは現在のサイズより大きくなければいけません。"
msgid "No projects found."
msgstr "プロジェクトが見つかりませんでした。"
msgid "No projects selected."
msgstr "どのプロジェクトも選択されていません。"
msgid "No security services found."
msgstr "セキュリティサービスがありません。"
msgid "No security services selected."
msgstr "セキュリティサービスが選択されていません。"
msgid "No source, empty share"
msgstr "ソースの指定なし (空のファイル共有)"
msgid "Nova Net"
msgstr "Nova ネットワーク"
msgid "Overview"
msgstr "概要"
msgid "Password"
msgstr "パスワード"
msgid "Passwords do not match."
msgstr "パスワードが一致しません。"
msgid "Project"
msgstr "プロジェクト"
msgid "Projects with access to share type"
msgstr "ファイル共有種別に接続するプロジェクト"
msgid "Protocol"
msgstr "プロトコル"
msgid "Public"
msgstr "パブリック"
#, python-format
msgid ""
"Reseting share group snapshot ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"共有グループスナップショット ('%(id)s')状態を '%(from)s' から '%(to)s'へリ"
"セットします"
msgid "Rules"
msgstr "ルール"
msgid "Save Changes"
msgstr "変更の保存"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "セキュリティサービスの詳細: %(service_display_name)s"
msgid "Security Service Overview"
msgstr "セキュリティサービス概要"
msgid "Security Services"
msgstr "セキュリティーサービス"
msgid "Security services within share network"
msgstr "ファイル共有ネットワーク内のセキュリティーサービス"
msgid "Segmentation Id"
msgstr "セグメント ID"
msgid "Selected projects"
msgstr "選択済みのプロジェクト"
msgid "Selected security services"
msgstr "選択済みのセキュリティーサービス"
msgid "Server"
msgstr "サーバー"
msgid "Set maximum quotas for the project."
msgstr "このプロジェクトの最大クォータを設定します。"
msgid "Share"
msgstr "ファイル共有"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "ファイル共有の詳細: %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "ファイル共有の詳細: %(share_name)s"
msgid "Share Group Snapshots"
msgstr "共有グループスナップショット"
msgid "Share ID"
msgstr "ファイル共有 ID"
#, python-format
msgid "Share Instance Details: %s"
msgstr "ファイル共有インスタンスの詳細: %s"
msgid "Share Instances"
msgstr "ファイル共有インスタンス"
msgid "Share Name"
msgstr "ファイル共有名"
msgid "Share Network"
msgstr "ファイル共有ネットワーク"
#, fuzzy, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "ファイル共有ネットワークの詳細: %(network_display_name)s"
#, fuzzy
msgid "Share Network Info"
msgstr "ファイル共有ネットワーク情報"
msgid "Share Networks"
msgstr "ファイル共有ネットワーク"
msgid "Share Protocol"
msgstr "ファイル共有プロトコル"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "ファイル共有ルール: %(share_display_name)s"
msgid "Share Server"
msgstr "ファイル共有サーバー"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "ファイル共有サーバーの詳細: %(server_name)s"
msgid "Share Server Id"
msgstr "ファイル共有サーバー ID"
msgid "Share Servers"
msgstr "ファイル共有サーバー"
msgid "Share Snapshots"
msgstr "ファイル共有のスナップショット"
msgid "Share Snapshots Storage"
msgstr "ファイル共有のスナップショットストレージ"
msgid "Share Source"
msgstr "ファイル共有ソース"
msgid "Share Storage"
msgstr "ファイル共有のストレージ"
msgid "Share Type"
msgstr "ファイル共有種別"
msgid "Share Types"
msgstr "ファイル共有種別"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"ファイル共有を %(req)iGiB に拡張することができません。利用できるクォータは "
"%(avail)iGiB しかありません。"
msgid "Share name to be assigned"
msgstr "割り当てらるファイル共有名"
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr ""
"ファイル共有サイズはスナップショットサイズ (%sGiB) 以上でなければいけません。"
msgid "Shares"
msgstr "ファイル共有"
#, fuzzy
msgid "Shares Networks"
msgstr "ファイル共有ネットワーク"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "サイズ"
msgid "Size (GiB)"
msgstr "サイズ (GiB)"
msgid "Snapshot"
msgstr "スナップショット"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "スナップショットの詳細: %(snapshot_display_name)s"
msgid "Snapshot Overview"
msgstr "スナップショットの概要"
msgid "Source"
msgstr "ソース"
msgid "Status"
msgstr "ステータス"
#, python-format
msgid "Successfully created security service: %s"
msgstr "セキュリティーサービス %s を正常に作成しました。"
#, python-format
msgid "Successfully created share network: %s"
msgstr "ファイル共有ネットワークが正常に作成されました: %s"
#, python-format
msgid "Successfully created share type: %s"
msgstr "ファイル共有種別が正常に作成されました: %s"
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "ファイル共有 %s の管理要求は正常に行われました。"
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr "ファイル共有 %s の管理解除要求は正常に行われました。"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "ファイル共有種別「%s」の追加スペックの更新に成功しました。"
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "セキュリティーサービス %s を正常に更新しました"
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr ""
"ファイル共有サイズはスナップショットサイズ (%sGiB) 未満にはできません。"
msgid "Type"
msgstr "種別"
msgid "Unable to add rule."
msgstr "ルールを追加できません。"
msgid "Unable to create security service."
msgstr "セキュリティーサービスを作成できません。"
msgid "Unable to create share network."
msgstr "ファイル共有ネットワークを作成できません。"
msgid "Unable to create share snapshot."
msgstr "ファイル共有スナップショットを作成できません。"
msgid "Unable to create share type."
msgstr "ファイル共有種別を作成できません。"
msgid "Unable to create share."
msgstr "ファイル共有を作成できません。"
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "ルール「%s」を削除できません。"
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "ファイル共有 「%s」を削除できません。"
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr ""
"スナップショット「%s」は削除できません。 1 つ以上のファイル共有が依存してい"
"ます。"
msgid "Unable to extend share."
msgstr "ファイル共有を拡張できません。"
msgid "Unable to get information about share type access."
msgstr "ファイル共有種別の接続に関する情報を取得できません。"
msgid "Unable to get list of projects."
msgstr "プロジェクトの一覧を取得できません"
msgid "Unable to get the security services hosts"
msgstr "セキュリティーサービスのホストを取得できません。"
msgid "Unable to load the specified snapshot."
msgstr "指定されたスナップショットを読み込めません。"
msgid "Unable to manage share"
msgstr "ファイル共有を管理できません。"
#, python-format
msgid "Unable to reset status of share group snapshot '%s'."
msgstr "共有グループスナップショット'%s'の状態をリセットできません"
msgid "Unable to retrieve list of projects."
msgstr "プロジェクトの一覧を取得できません。"
msgid "Unable to retrieve quotas."
msgstr "クォータを取得できません。"
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "セキュリティーサービス「%s」の詳細を取得できません。"
msgid "Unable to retrieve security services"
msgstr "セキュリティーサービスの一覧を取得できません"
msgid "Unable to retrieve security_service."
msgstr "セキュリティサービスを取得できません。"
msgid "Unable to retrieve share details."
msgstr "ファイル共有の詳細を取得できません。"
msgid "Unable to retrieve share instance details."
msgstr "ファイル共有インスタンスの詳細を取得できません。"
msgid "Unable to retrieve share instances."
msgstr "ファイル共有インスタンスの一覧を取得できません"
msgid "Unable to retrieve share limit information."
msgstr "ファイル共有のリソース上限情報を取得できません。"
msgid "Unable to retrieve share list."
msgstr "ファイル共有の一覧を取得できません。"
#, fuzzy
msgid "Unable to retrieve share network details."
msgstr "ファイル共有ネットワークの詳細を取得できません。"
msgid "Unable to retrieve share network."
msgstr "ファイル共有ネットワークを取得できません。"
msgid "Unable to retrieve share networks"
msgstr "ファイル共有ネットワークの一覧を取得できません"
msgid "Unable to retrieve share rules."
msgstr "ファイル共有ルールの一覧を取得できません。"
msgid "Unable to retrieve share server details."
msgstr "ファイル共有サーバーの詳細を取得できません。"
msgid "Unable to retrieve share servers"
msgstr "ファイル共有サーバーの一覧を取得できません"
msgid "Unable to retrieve share snapshots list."
msgstr "ファイル共有スナップショットの一覧を取得できません。"
msgid "Unable to retrieve share snapshots."
msgstr "ファイル共有スナップショットの一覧を取得できません。"
msgid "Unable to retrieve share."
msgstr "ファイル共有を取得できません。"
msgid "Unable to retrieve share_type."
msgstr "ファイル共有種別を取得できません。"
msgid "Unable to retrieve snapshot details."
msgstr "スナップショットの詳細を取得できません。"
msgid "Unable to retrieve snapshot."
msgstr "スナップショットを取得できません。"
msgid "Unable to retrieve volume details."
msgstr "ボリュームの詳細を取得できません。"
msgid "Unable to unmanage share."
msgstr "ファイル共有の管理を解除できません。"
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "ファイル共有種別「%s」の接続を更新できません。"
msgid "Unable to update default quotas."
msgstr "標準のクォータを更新できません。"
msgid "Unable to update extra_specs for share type."
msgstr "ファイル共有種別の追加スペックを更新できません。"
msgid "Unable to update security service."
msgstr "セキュリティーサービスを更新できません。"
msgid "Unable to update share metadata."
msgstr "ファイル共有のメタデータを更新できません。"
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "ファイル共有ネットワーク「%s」を更新できません。"
msgid "Unable to update share network."
msgstr "ファイル共有ネットワークを更新できません。"
msgid "Unable to update share type."
msgstr "ファイル共有種別を更新できません。"
msgid "Unable to update share."
msgstr "ファイル共有を更新できません。"
msgid "Unknown"
msgstr "不明"
msgid "Unmanage"
msgstr "管理解除"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "管理解除エラー"
msgid "Unmanage Share"
msgstr "ファイル共有の管理解除"
msgid "Update"
msgstr "更新"
#, fuzzy
msgid "Update Share Network"
msgstr "ファイル共有ネットワークの更新"
msgid "Update Share Type"
msgstr "ファイル共有種別の更新"
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "ファイル共有種別「%s」の接続を更新しました。"
#, python-format
msgid "Updated share network \"%s\"."
msgstr "ファイル共有ネットワーク「%s」を更新しました。"
#, python-format
msgid "Updating share \"%s\""
msgstr "ファイル共有 \"%s\" を更新中"
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "ファイル共有のメタデータ \"%s\" を更新中"
#, python-format
msgid "Updating share network \"%s\""
msgstr "ファイル共有ネットワーク「%s」を更新しています"
msgid "Use snapshot as a source"
msgstr "スナップショットをソースとして使用する"
msgid "User"
msgstr "ユーザー"
msgid "Visibility"
msgstr "公開範囲"
msgid "key=value pairs per line can be set"
msgstr "「キー=値」のペアを行ごとに設定できます"
manila-ui-3.0.0/manila_ui/locale/ru/ 0000775 0001750 0001750 00000000000 13647271736 017253 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/ru/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021040 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/ru/LC_MESSAGES/django.po 0000664 0001750 0001750 00000077006 13647271543 022650 0 ustar zuul zuul 0000000 0000000 # Aleksey Alekseenko <9118250541@mail.ru>, 2016. #zanata
# Alexander , 2016. #zanata
# Artem , 2016. #zanata
# Ilya Alekseyev , 2016. #zanata
# Ivan Startsev , 2016. #zanata
# Valentin Chikunov , 2016. #zanata
# Valeriy Ponomaryov , 2016. #zanata
# Artem , 2017. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-09-16 12:05+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2017-02-06 02:19+0000\n"
"Last-Translator: Artem \n"
"Language-Team: Russian\n"
"Language: ru\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
#, python-format
msgid "%sGiB"
msgstr "%s ГиБ"
msgid "(Quota exceeded)"
msgstr "(Превышена квота)"
msgid "Access Key"
msgstr "Ключ доступа"
msgid "Access Level"
msgstr "Уровень доступа"
msgid "Access To"
msgstr "Доступ к"
msgid "Access Type"
msgstr "Тип доступа"
msgid "Access to"
msgstr "Доступ к"
msgctxt "Current status of share network"
msgid "Active"
msgstr "Активный"
msgctxt "Current status of share server"
msgid "Active"
msgstr "Активный"
msgid "Add"
msgstr "Добавить"
msgid "Add Rule"
msgstr "Добавить правило"
msgid "Add Security Service"
msgstr "Добавить службу безопасности"
msgid "Add rule"
msgstr "Добавить правило"
msgid "Add security services to share network."
msgstr "Добавить службы безопасности в сеть общего ресурса."
msgid "All keys and values must be in range from 1 to 255."
msgstr "Все ключи и значения должны быть в диапазоне от 1 до 255"
msgid "Allow project access to share type."
msgstr "Разрешить проектам доступ к типу общего ресурса."
msgid "At least one security service must be specified."
msgstr "По крайней мере одна служба безопасности должна быть определена."
msgid "Availability Zone"
msgstr "Зона доступности"
msgid "Availability zone"
msgstr "Зона доступности"
msgctxt "Current status of replica"
msgid "Available"
msgstr "Доступна"
msgctxt "Current status of share"
msgid "Available"
msgstr "Доступен"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "Доступно"
msgid "Available projects"
msgstr "Доступные проекты"
msgid "Available security services"
msgstr "Доступные службы безопасности."
msgid "Cancel Migration"
msgstr "Отменить миграцию"
msgid "Cancel migration"
msgstr "Отменить миграцию"
msgid "Cancel migration of a Share"
msgstr "Отменить миграцию общего ресурса"
msgid "Choose a snapshot"
msgstr "Выберете снимок"
msgid "Complete Migration"
msgstr "Завершите миграцию"
msgid "Complete migration"
msgstr "Завершить миграцию"
msgid "Complete migration of a Share"
msgstr "Завершите миграцию общего ресурса"
msgid "Confirm Migration Cancelling of Share"
msgstr "Подтвердите отмену миграции общего ресурса"
msgid "Confirm Migration Completion of Share"
msgstr "Подтвердите завершение миграции общего ресурса"
msgid "Confirm Obtaining migration progress of Share"
msgstr "Подтвердите получение информации о прогрессе миграции общего ресурса"
msgid "Confirm Password"
msgstr "Подтвердите пароль"
msgid "Confirm Unmanage Share"
msgstr "Подтвердить разрегистрацию общего ресурса"
msgid "Create"
msgstr "Создать"
msgid "Create Replica"
msgstr "Создать реплику"
msgid "Create Security Service"
msgstr "Создать службу безопасности"
msgid "Create Share"
msgstr "Создать общий ресурс"
msgid "Create Share Network"
msgstr "Создать сеть общего ресурса"
msgid "Create Share Snapshot"
msgstr "Создать снимок общего ресурса"
msgid "Create Share Type"
msgstr "Создать тип общего ресурса"
msgid "Create a Share"
msgstr "Создать общий ресурс"
msgid "Created At"
msgstr "Создано"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "Создание"
msgctxt "Current status of share"
msgid "Creating"
msgstr "Создание"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "Создание"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "Создание"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "Создание реплики общего ресурса \"%s\"."
#, python-format
msgid "Creating rule for \"%s\""
msgstr "Создние правила для \"%s\""
#, python-format
msgid "Creating share \"%s\""
msgstr "Создание общего ресурса \"%s\""
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "Создается снимок общего ресурса \"%s\"."
msgid "Current Size (GiB)"
msgstr "Текущий размер (ГиБ)"
msgid "DNS IP"
msgstr "DNS IP"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "Удаление"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "Удаление"
msgid "Description"
msgstr "Описание"
msgid "Domain"
msgstr "Домен"
msgid "Driver handles share servers"
msgstr "Драйвер обрабатывает сервера общих ресурсов"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "Параметры драйвера ('volume_id' для 'generic' драйвера и т.д.)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "Повторяющийся ключ '%s'"
msgid "Edit"
msgstr "Изменить"
msgid "Edit Security Service"
msgstr "Редактировать службу безопасности"
msgid "Edit Share"
msgstr "Редактировать общий ресурс"
msgid "Edit Share Metadata"
msgstr "Редактировать метаданные общего ресурса"
msgid "Edit Share Network"
msgstr "Редактировать сеть общего ресурса"
msgctxt "Current status of replica"
msgid "Error"
msgstr "Ошибка"
msgctxt "Current status of share"
msgid "Error"
msgstr "Ошибка"
msgctxt "Current status of share network"
msgid "Error"
msgstr "Ошибка"
msgctxt "Current status of share server"
msgid "Error"
msgstr "Ошибка"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "Ошибка"
msgid "Expected only pairs of key=value."
msgstr "Ожидаются только пары ключ = значение"
msgid "Export location"
msgstr "Место экспорта"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr "Место экспорта общего ресурса. Пример для NFS: 1.2.3.4:/path/to/share"
msgid "Extend"
msgstr "Расширить"
msgid "Extend Share"
msgstr "Расширить общий ресурс"
#, python-format
msgid "Extend share \"%s\""
msgstr "Расширить общий ресурс \"%s\""
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "Ошибка расширения общего ресурса"
msgid "Extra specs"
msgstr "Доп. параметры"
msgid "Force Host Assisted Migration"
msgstr "Принудительно использовать хост для миграции"
msgid "From here you can update share network info. "
msgstr "Здесь вы можете обновить информацию о сети общего ресурса."
msgid "Get migration progress"
msgstr "Получить статус миграции"
msgid ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgstr ""
"Получено неверное значение для поля 'driver_options'. Ожидаются только пары "
"ключ = значение"
msgid "Host"
msgstr "Хост"
msgid "Host of share"
msgstr "Хост общего ресурса"
msgid "Host to migrate share"
msgstr "Хост для миграции общего ресурса"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr ""
"Хост на котором расположен общий ресурс, например: some.host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "Версия IP"
msgid "Id"
msgstr "ID"
#, python-format
msgid ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgstr ""
"В требуемый дополнительный параметр 'spec_driver_handles_share_servers' "
"выставлено недопустимое значение. Допустимые значения %s. "
"Регистронезависимое."
msgctxt "Current status of share server"
msgid "In-use"
msgstr "Используется"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "Используется"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "Неактивный"
#, python-format
msgid "Key '%s' has improper length."
msgstr "Ключ '%s' имеет неподходящую длину"
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "Ключ не может содержать пробелы. Смотри строку '%s'"
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "Ключ не может содержать пробелы. Ошибка: '%s'"
msgid "Make visible for all"
msgstr "Сделать видимым для всех"
msgid "Manage"
msgstr "Управление"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "Ошибка регистрации"
msgid "Manage Replicas"
msgstr "Управление репликами общих ресурсов"
msgid "Manage Rules"
msgstr "Управление правилами"
msgid "Manage Share"
msgstr "Зарегистрировать общий ресурс"
msgid "Manage Share Type Access"
msgstr "Управление доступом к типам общих ресурсов"
msgid "Metadata"
msgstr "Метаданные"
msgid "Migrate Share"
msgstr "Миграция общего ресурса"
msgid "Migrate a Share"
msgstr "Мигрировать общий ресурс"
msgctxt "Current status of share"
msgid "Migrating"
msgstr "Миграция"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "Миграция в"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "Миграция общего ресурса %(name)s выполнена на %(progress)s процентов."
msgid "Name"
msgstr "Имя"
msgid "Network Type"
msgstr "Тип сети"
msgid "Networks"
msgstr "Сети"
msgid "Neutron Net"
msgstr "Сеть Neutron"
msgid "Neutron Subnet"
msgstr "Подсеть Neutron "
msgid "New Size (GiB)"
msgstr "Новый размер (ГиБ)"
msgid "New share network to be set in migrated share"
msgstr ""
"Новая сеть общего ресурса, которая будет назначена мигрируемому общему "
"ресурсу"
msgid "New share type to be set in migrating share"
msgstr ""
"Новый тип общего ресурса, который будет назначен мигрируемому общему ресурсу"
msgid "New size must be greater than current size."
msgstr "Новый размер должен быть больше чем текущий размер"
msgid "No projects found."
msgstr "Проекты не найдены."
msgid "No projects selected."
msgstr "Проекты не выбраны."
msgid "No security services found."
msgstr "Службы безопасности не найдены."
msgid "No security services selected."
msgstr "Службы безопасности не выбраны."
msgid "No source, empty share"
msgstr "Нет источника, пустой общий ресурс"
msgid "Nova Net"
msgstr "Сеть Nova"
msgid "Obtain Progress"
msgstr "Получить информацию о прогрессе"
msgid "Obtain migration progress of a Share"
msgstr "Получить информацию о прогрессе миграции общего ресурса"
msgid "Overview"
msgstr "Обзор"
msgid "Password"
msgstr "Пароль"
msgid "Passwords do not match."
msgstr "Пароли не совпадают"
msgid "Preserve Metadata"
msgstr "Сохранить метаданные"
msgid "Project"
msgstr "Проект"
msgid "Projects with access to share type"
msgstr "Проекты с доступом к типу общего ресурса"
msgid "Protocol"
msgstr "Протокол"
msgid "Public"
msgstr "Публичный"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "Информация о реплике: %(replica_display_name)s"
msgid "Replica State"
msgstr "Состояние реплики"
msgid "Replicas"
msgstr "Реплики"
msgid "Reset Replica State"
msgstr "Сбросить состояние реплики"
msgid "Reset Replica Status"
msgstr "Сбросить статус реплики"
msgid "Reset replica state"
msgstr "Сбросить состояние реплики"
msgid "Reset replica status"
msgstr "Сбросить статус реплики"
msgid "Reset state"
msgstr "Сбросить состояние"
msgid "Reset status"
msgstr "Сбросить статус"
#, python-format
msgid "Reseting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
msgstr "Сброс состояния реплики ('%(id)s') с '%(from)s' к '%(to)s'."
#, python-format
msgid "Reseting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "Сброс статуса реплики ('%(id)s') с '%(from)s' до '%(to)s'."
msgid "Resync"
msgstr "Синхронизировать"
msgid "Resync Replica"
msgstr "Повторная синхронизация реплики"
msgid "Resync replica"
msgstr "Повторная синхронизация реплики"
#, python-format
msgid "Resync'ing replica '%s'"
msgstr "Синхронизация реплики '%s'"
msgid "Rules"
msgstr "Правила"
msgid "Save Changes"
msgstr "Сохранить изменения"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "Информация о службе безопасности: %(service_display_name)s"
msgid "Security Services"
msgstr "Службы безопасности"
msgid "Security services within share network"
msgstr "Службы безопасности сети общего ресурса"
msgid "Segmentation Id"
msgstr "ID сегмента"
msgid "Selected projects"
msgstr "Выбранные проекты"
msgid "Selected security services"
msgstr "Выбранные службы безопасности."
msgid "Server"
msgstr "Сервер"
msgid "Set Replica as Active"
msgstr "Назначить реплику активной"
msgid "Set as Active"
msgstr "Назначить активной"
msgid "Set maximum quotas for the project."
msgstr "Выставите максимальные квоты для этого проекта"
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "Назначение реплики \"%s\" активной..."
msgid "Share"
msgstr "Общий ресурс"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "Информация об общем ресурсе: %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "Информация об общем ресурсе: %(share_name)s"
msgid "Share ID"
msgstr "ID общего ресурса"
#, python-format
msgid "Share Instance Details: %s"
msgstr "Информация об инстансе общего ресурса: %s"
msgid "Share Instances"
msgstr "Инстансы общего ресурса"
msgid "Share Name"
msgstr "Имя общего ресурса"
msgid "Share Network"
msgstr "Сеть общего ресурса"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "Информация о сети общего ресурса: %(network_display_name)s"
msgid "Share Network Info"
msgstr "Информация о сети общего ресурса"
msgid "Share Networks"
msgstr "Сети общих ресурсов"
msgid "Share Protocol"
msgstr "Протокол общего ресурса"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr "Реплики общего ресурса: %(share_display_name)s"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "Правила общего ресурса: %(share_display_name)s"
msgid "Share Server"
msgstr "Сервер общего ресурса"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "Информация о Сервере общего ресурса: %(server_name)s"
msgid "Share Server Id"
msgstr "ID сервера общего ресурса"
msgid "Share Servers"
msgstr "Сервера общих ресурсов"
msgid "Share Snapshots"
msgstr "Снимки общего ресурса"
msgid "Share Snapshots Storage"
msgstr "Размер хранилица снимков общих ресурсов"
msgid "Share Source"
msgstr "Источник общего ресурса"
msgid "Share Storage"
msgstr "Размер хранилища общих ресурсов"
msgid "Share Type"
msgstr "Тип общего ресурса"
msgid "Share Types"
msgstr "Типы общих ресурсов"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"Невозможно расширить общий ресурс до %(req)i ГиБ, так как ограничение квоты "
"составляет %(avail)i ГиБ."
msgid "Share name to be assigned"
msgstr "Имя общего ресурса, которое будет назначено."
#, python-format
msgid "Share replica %s has been deleted."
msgstr "Реплика общего ресурса %s была удалена."
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr ""
"Размер общего ресурса должен быть равным или больше размера снимка (%sГиБ)"
msgid "Shares"
msgstr "Общие ресурсы"
msgid "Shares Networks"
msgstr "Сети Общего Ресурса"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "Размер"
msgid "Size (GiB)"
msgstr "Размер (ГиБ)"
msgid "Snapshot"
msgstr "Снимок"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "Информация о снимке: %(snapshot_display_name)s"
msgid "Snapshot Overview"
msgstr "Обзор снимка"
msgid "Source"
msgstr "Источник"
msgid "Start migration"
msgstr "Начать миграцию"
msgid "Status"
msgstr "Статус"
#, python-format
msgid "Successfully created security service: %s"
msgstr "Служба безопасности: %s успешно создана"
#, python-format
msgid "Successfully created share network: %s"
msgstr "Сеть общего ресурса: %s успешно создана"
#, python-format
msgid "Successfully created share type: %s"
msgstr "Успешно создан тип общего ресурса: %s"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr "Запрос на отмену миграции общего ресурса:%s успешно отправлен."
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr "Успешно отправлен запрос на завершение миграции общего ресурса :%s"
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "Запрос на регистрацию общего ресурса %s успешно отправлен"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "Успешно отправлен запрос на миграцию общего ресурса: %s."
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr "Успешно отправлен запрос на разрегистрацию общего ресурса: %s"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "Доп.параметры были успешно обновлены для типа общего ресурса '%s'."
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "Успешно обновлена служба безопасности \"%s\""
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr "Размер общего ресурса не может быть меньше размера снимка (%s ГиБ)"
msgid "Type"
msgstr "Тип"
msgid "Unable to add rule."
msgstr "Невозможно добавить правило"
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr "Невозможно отменить миграцию общего ресурса %s в данный момент."
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "Невозможно завершить миграцию общего ресурса %s."
msgid "Unable to create security service."
msgstr "Невозможно создать службу безопасности."
msgid "Unable to create share network."
msgstr "Невозможно создать сеть общего ресурса."
msgid "Unable to create share replica."
msgstr "Невозможно создать реплику общего ресурса"
msgid "Unable to create share snapshot."
msgstr "Не удалось создать снимок общего ресурса."
msgid "Unable to create share type."
msgstr "Не удалось создать тип общего ресурса."
msgid "Unable to create share."
msgstr "Не удалось создать общий ресурс."
#, python-format
msgid "Unable to delete replica \"%s\"."
msgstr "Невозможно удалить реплику \"%s\"."
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "Не удалось удалить правило \"%s\"."
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "Невозможно удалить общий ресурс \"%s\"."
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr ""
"Невозможно удалить снимок \"%s\". Один или несколько общих ресурсов зависят "
"от него."
msgid "Unable to extend share."
msgstr "Не удалось расширить общий ресурс."
msgid "Unable to get information about share type access."
msgstr "Невозможно получить информацию о доступе к типу общего ресурса"
msgid "Unable to get list of projects."
msgstr "Невозможно получить список проектов."
msgid "Unable to get the security services hosts"
msgstr "Не удается получить хосты служб безопасности"
msgid "Unable to load the specified snapshot."
msgstr "Не удается загрузить определенный снимок."
msgid "Unable to manage share"
msgstr "Невозможно зарегистрировать общий ресурс"
#, python-format
msgid "Unable to migrate share %s."
msgstr "Невозможно мигрировать общий ресурс %s."
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr ""
"Сейчас невозможно получить прогресс выполнения миграции общего ресурса: %s "
#, python-format
msgid "Unable to reset state of replica '%s'."
msgstr "Невозможно сбросить состояние реплики '%s'."
#, python-format
msgid "Unable to reset status of replica '%s'."
msgstr "Невозможно сбросить статус реплики '%s'."
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "Невозможно синхронизировать реплику '%s'."
msgid "Unable to retrieve list of projects."
msgstr "Невозможно получить список проектов."
msgid "Unable to retrieve quotas."
msgstr "Не удается получить квоты."
#, python-format
msgid "Unable to retrieve replica '%s'."
msgstr "Невозможно получить реплику '%s'."
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "Не удалось получить информацию о службе безопасности '%s'."
msgid "Unable to retrieve security services"
msgstr "Невозможно получить службы безопасности"
msgid "Unable to retrieve security_service."
msgstr "Невозможно получить службу безопасности."
msgid "Unable to retrieve share details."
msgstr "Невозможно получить информацию об общем ресурсе."
msgid "Unable to retrieve share instance details."
msgstr "Не удалось получить информацию об инстансе общего ресурса."
msgid "Unable to retrieve share instances."
msgstr "Невозможно получить инстансы общего ресурса."
msgid "Unable to retrieve share limit information."
msgstr "Не удается получить информацию по ограничениям для общего ресурса. "
msgid "Unable to retrieve share list."
msgstr "Невозможно получить список общих ресурсов."
msgid "Unable to retrieve share network details."
msgstr "Невозможно получить информацию о сети общего ресурса"
msgid "Unable to retrieve share network."
msgstr "Невозможно получить сеть общего ресурса."
msgid "Unable to retrieve share networks"
msgstr "Невозможно получить сети общех ресурсов"
msgid "Unable to retrieve share replicas."
msgstr "Невозможно получить реплики общего ресурса."
msgid "Unable to retrieve share rules."
msgstr "Невозможно получить правила общего ресурса."
msgid "Unable to retrieve share server details."
msgstr "Невозможно получить информацию о сервере общего ресурса"
msgid "Unable to retrieve share servers"
msgstr "Невозможно получить сервера общих ресурсов"
msgid "Unable to retrieve share snapshots list."
msgstr "Невозможно получить список снимков."
msgid "Unable to retrieve share snapshots."
msgstr "Невозможно получить снимки общего ресурса."
msgid "Unable to retrieve share."
msgstr "Невозможно получить общий ресурс."
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "Невозможно получить общий ресурс. %s"
msgid "Unable to retrieve share_type."
msgstr "Не удалось получить тип общего ресурса"
msgid "Unable to retrieve snapshot details."
msgstr "Не удалось получить детали снимка."
msgid "Unable to retrieve snapshot."
msgstr "Не удалось получить снимок."
msgid "Unable to retrieve volume details."
msgstr "Не удалось получить информацию о диске."
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "Невозможно назначить реплику '%s' активной."
msgid "Unable to unmanage share."
msgstr "Невозможно разрегистрировать общий ресурс."
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "Невозможно обновить доступ к типу общего ресурса \"%s\"."
msgid "Unable to update default quotas."
msgstr "Не удалось обновить квоты по умолчанию."
msgid "Unable to update extra_specs for share type."
msgstr "Не удается обновить доп параметры для типа общего ресурса."
msgid "Unable to update security service."
msgstr "Невозможно обновить службу безопасности."
msgid "Unable to update share metadata."
msgstr "Невозможно обновить метаданные общего ресурса."
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "Невозможно обновить сеть общего ресурса \"%s\"."
msgid "Unable to update share network."
msgstr "Невозможно обновить сеть общего ресурса."
msgid "Unable to update share type."
msgstr "Невозможно обновить тип общего ресурса."
msgid "Unable to update share."
msgstr "Не удалось обновить общий ресурс."
msgid "Unknown"
msgstr "Неизвестно"
msgid "Unmanage"
msgstr "Разрегистрировать"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "Ошибка регистрации общего ресурса"
msgid "Unmanage Share"
msgstr "Разрегистрировать общий ресурс"
msgid "Update"
msgstr "Обновить"
msgid "Update Share Network"
msgstr "Обновить сеть общего ресурса"
msgid "Update Share Type"
msgstr "Обновить тип общего ресурса"
msgid "Updated At"
msgstr "Обновлено"
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "Доступ для типа общего ресурса \"%s\" обновлен."
#, python-format
msgid "Updated share network \"%s\"."
msgstr "Сеть общего ресурса \"%s\" обновлена"
#, python-format
msgid "Updating share \"%s\""
msgstr "Обновление общего ресурса \"%s\""
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "Обновление метаданных общего ресурса \"%s\""
#, python-format
msgid "Updating share network \"%s\""
msgstr "Обновление сети общего ресурса \"%s\""
msgid "Use snapshot as a source"
msgstr "Использовать снимок как источник"
msgid "User"
msgstr "Пользователь"
msgid "Visibility"
msgstr "Видимость"
msgid "Writable"
msgstr "Записываемый"
msgid "key=value pairs per line can be set"
msgstr "Пара значений key=value может быть задана для каждой строки"
manila-ui-3.0.0/manila_ui/locale/fr/ 0000775 0001750 0001750 00000000000 13647271736 017234 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/fr/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021021 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/fr/LC_MESSAGES/django.po 0000664 0001750 0001750 00000060665 13647271543 022634 0 ustar zuul zuul 0000000 0000000 # Gérald LONLAS , 2016. #zanata
# Benjamin ACH , 2017. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-09-16 12:05+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-25 11:57+0000\n"
"Last-Translator: Benjamin ACH \n"
"Language-Team: French\n"
"Language: fr\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
#, python-format
msgid "%sGiB"
msgstr "%sGio"
msgid "(Quota exceeded)"
msgstr "(Quota dépassé)"
msgid "Access Key"
msgstr "Clef d’accès"
msgid "Access Level"
msgstr "Niveau d'accès"
msgid "Access To"
msgstr "Accès à"
msgid "Access Type"
msgstr "Type d'accès"
msgid "Access to"
msgstr "Accès à"
msgctxt "Current status of share network"
msgid "Active"
msgstr "Actif"
msgctxt "Current status of share server"
msgid "Active"
msgstr "Actif"
msgid "Add"
msgstr "Ajouter"
msgid "Add Rule"
msgstr "Ajouter une règle"
msgid "Add Security Service"
msgstr "Ajout d'un service de sécurité "
msgid "Add rule"
msgstr "Ajouter une règle"
msgid "Add security services to share network."
msgstr "Ajout du service de sécurité au partage réseau."
msgid "All keys and values must be in range from 1 to 255."
msgstr "Toutes les clés doit avoir une valeur comprise dans la plage 1 à 255."
msgid "Allow project access to share type."
msgstr "Autoriser un projet à accéder au type de partage."
msgid "At least one security service must be specified."
msgstr "Au moins un service de sécurité doit être indiqué."
msgid "Availability Zone"
msgstr "Zone de disponibilité"
msgid "Availability zone"
msgstr "Zone de disponibilité"
msgctxt "Current status of replica"
msgid "Available"
msgstr "Disponible"
msgctxt "Current status of share"
msgid "Available"
msgstr "Disponible"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "Disponible"
msgid "Available projects"
msgstr "Projets disponibles"
msgid "Available security services"
msgstr "Service de sécurité disponible."
msgid "Cancel Migration"
msgstr "Annuler la migration"
msgid "Cancel migration"
msgstr "Annuler la migration"
msgid "Cancel migration of a Share"
msgstr "Annuler la migration d'un partage"
msgid "Choose a snapshot"
msgstr "Choisir un instantané"
msgid "Complete Migration"
msgstr "Migration terminée"
msgid "Complete migration"
msgstr "Migration terminée"
msgid "Complete migration of a Share"
msgstr "Migration du partage avec succès"
msgid "Confirm Migration Cancelling of Share"
msgstr "Confirmer l'annulation de la migration du partage"
msgid "Confirm Migration Completion of Share"
msgstr "Confirmer l'avancement de la migration du partage"
msgid "Confirm Password"
msgstr "Confirmer le mot de passe"
msgid "Confirm Unmanage Share"
msgstr "Confirmer le partage non-géré"
msgid "Create"
msgstr "Créer"
msgid "Create Replica"
msgstr "Créer un replica"
msgid "Create Security Service"
msgstr "Créer un service de sécurité "
msgid "Create Share"
msgstr "Créer un partage"
msgid "Create Share Network"
msgstr "Créer un partage réseau"
msgid "Create Share Snapshot"
msgstr "Créer l'instantané du partage"
msgid "Create Share Type"
msgstr "Créer un type de partage"
msgid "Create a Share"
msgstr "Créer un partage"
msgid "Created At"
msgstr "Créé le"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "Création en cours"
msgctxt "Current status of share"
msgid "Creating"
msgstr "Création en cours"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "Création en cours"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "Création en cours"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "Création du réplica pour le partage \"%s\"."
#, python-format
msgid "Creating rule for \"%s\""
msgstr "Création de la règle pour \"%s\""
#, python-format
msgid "Creating share \"%s\""
msgstr "Création du partage \"%s\""
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "Création de l'instantané partagé \"%s\"."
msgid "Current Size (GiB)"
msgstr "Taille actuelle (Gio)"
msgid "DNS IP"
msgstr "IP DNS"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "Suppression en cours"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "Suppression en cours"
msgid "Description"
msgstr "Description"
msgid "Destination host and pool where share will be migrated to."
msgstr "Hôte de destination et pool où le partage sera migré."
msgid "Domain"
msgstr "Domaine"
msgid "Driver handles share servers"
msgstr "Pilote qui supporte les partages serveur"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "Option du pilote ('volume_id' pour les Generic driver, etc...)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "Clés dupliquées '%s'."
msgid "Edit"
msgstr "Éditer"
msgid "Edit Security Service"
msgstr "Éditer le service de sécurité "
msgid "Edit Share"
msgstr "Éditer le partage"
msgid "Edit Share Metadata"
msgstr "Éditer les métadonnées du partage"
msgid "Edit Share Network"
msgstr "Éditer le partage réseau"
msgctxt "Current status of replica"
msgid "Error"
msgstr "Erreur"
msgctxt "Current status of share"
msgid "Error"
msgstr "Erreur"
msgctxt "Current status of share network"
msgid "Error"
msgstr "Erreur"
msgctxt "Current status of share server"
msgid "Error"
msgstr "Erreur"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "Erreur"
msgid "Expected only pairs of key=value."
msgstr "Seule les paires de clé-valeur key=value sont attendus."
msgid "Export location"
msgstr "Emplacement de l'export"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr ""
"Emplacement de l'export du partage. Par exemple pour NFS : 1.2.3.4:/path/to/"
"share"
msgid "Extend"
msgstr "Étendre"
msgid "Extend Share"
msgstr "Étendre le partage"
#, python-format
msgid "Extend share \"%s\""
msgstr "Étendre le partage \"%s\""
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "Erreur étendue"
msgid "Extra specs"
msgstr "Spécifications supplémentaires"
msgid "Force Host Assisted Migration"
msgstr "Forcer la migration assisté de l'hôte"
msgid "From here you can update share network info. "
msgstr "D'ici, vous pouvez mettre à jour les informations du partage réseau."
msgid "Get migration progress"
msgstr "Voir l'avancement de la migration"
msgid "Host"
msgstr "Hôte"
msgid "Host of share"
msgstr "Hôte du partage"
msgid "Host to migrate share"
msgstr "Hôte pour la migration du partage"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr "Hôte où se trouve le partage, exemple : some.host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "Version d'IP"
msgid "Id"
msgstr "ID"
msgctxt "Current status of share server"
msgid "In-use"
msgstr "En cours d'utilisation"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "En cours d'utilisation"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "Inactif"
#, python-format
msgid "Key '%s' has improper length."
msgstr "La clé '%s' a une longueur inappropriée."
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "La clé ne peut pas contenir d'espace. Voir la chaine '%s'."
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "La clé ne peut pas contenir d'espace. Erreur dans '%s'."
msgid "Make visible for all"
msgstr "Rendre visible pour tous"
msgid "Manage"
msgstr "Gérer"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "Erreur gérée"
msgid "Manage Replicas"
msgstr "Gérer les réplicas"
msgid "Manage Rules"
msgstr "Gérer les règles"
msgid "Manage Share"
msgstr "Gérer le partage"
msgid "Manage Share Type Access"
msgstr "Gérer les accès du type de partage"
msgid "Metadata"
msgstr "Métadonnées"
msgid "Migrate Share"
msgstr "Migrer le partage"
msgid "Migrate a Share"
msgstr "Migrer le partage"
msgctxt "Current status of share"
msgid "Migrating"
msgstr "Migration en cours"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "Migration vers"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "Migration du partage %(name)s est à %(progress)s pourcent(s)."
msgid "Name"
msgstr "Nom"
msgid "Network Type"
msgstr "Type de réseau"
msgid "Networks"
msgstr "Réseaux"
msgid "Neutron Net"
msgstr "Neutron Net"
msgid "Neutron Subnet"
msgstr "Sous-réseau Neutron"
msgid "New Size (GiB)"
msgstr "Nouvelle taille (Gio)"
msgid "New share network to be set in migrated share"
msgstr "Le nouveau partage réseau doit être mis dans le partage migré"
msgid "New share type to be set in migrating share"
msgstr ""
"Nouveau type de partage qui doit être appliqué dans la migration de partage"
msgid "New size must be greater than current size."
msgstr "La nouvelle taille doit être supérieure à la taille en cours."
msgid "No projects found."
msgstr "Aucun projet trouvé."
msgid "No projects selected."
msgstr "Aucun projet sélectionné."
msgid "No security services found."
msgstr "Aucun service de sécurité trouvé."
msgid "No security services selected."
msgstr "Aucun service de sécurité sélectionné."
msgid "No source, empty share"
msgstr "Aucune source, partage vide"
msgid "Nondisruptive"
msgstr "Non perturbateur "
msgid "Nova Net"
msgstr "Nova Net"
msgid "Obtain Progress"
msgstr ""
"\t\n"
"Voir l'avancement"
msgid "Obtain migration progress of a Share"
msgstr "Voir l'avancement de la migration d'un partage"
msgid "Overview"
msgstr "Vue d'ensemble"
msgid "Password"
msgstr "Mot de passe"
msgid "Passwords do not match."
msgstr "Les mots de passe ne correspondent pas."
msgid "Preserve Metadata"
msgstr "Préserver les métadonnées"
msgid "Preserve Snapshots"
msgstr "Conserver les instantanés"
msgid "Project"
msgstr "Projet"
msgid "Projects with access to share type"
msgstr "Projets avec un accès au type de partage"
msgid "Protocol"
msgstr "Protocole"
msgid "Public"
msgstr "Public"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "Détail du replica : %(replica_display_name)s"
msgid "Replica State"
msgstr "État du replica"
msgid "Replicas"
msgstr "Réplicas"
msgid "Reset Replica State"
msgstr "Réinitialiser l'état du replica"
msgid "Reset Replica Status"
msgstr "Réinitialiser le statut du replica"
msgid "Reset replica state"
msgstr "Réinitialiser l'état du replica"
msgid "Reset replica status"
msgstr "Réinitialiser le statut du replica"
msgid "Reset state"
msgstr "Réinitialiser l'état"
msgid "Reset status"
msgstr "Réinitialiser le statut"
#, python-format
msgid "Reseting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
msgstr ""
"Réinitialisation de l'état du replica ('%(id)s') de '%(from)s' à '%(to)s'."
#, python-format
msgid "Reseting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Réinitialisation du statut du replica ('%(id)s') de '%(from)s' à '%(to)s'."
msgid "Resync"
msgstr "Resynchroniser"
msgid "Resync Replica"
msgstr "Resynchroniser le replica"
msgid "Resync replica"
msgstr "Resynchroniser le replica"
#, python-format
msgid "Resync'ing replica '%s'"
msgstr "Resynchronisation du replica \"%s\""
msgid "Rules"
msgstr "Règles"
msgid "Save Changes"
msgstr "Sauvegarder les modifications"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "Détail du service de sécurité : %(service_display_name)s"
msgid "Security Services"
msgstr "Services de sécurité"
msgid "Security services within share network"
msgstr "Service de sécurité dans le partage réseau"
msgid "Segmentation Id"
msgstr "ID segmentation"
msgid "Selected projects"
msgstr "Projets sélectionnés"
msgid "Selected security services"
msgstr "Service de sécurité sélectionné"
msgid "Server"
msgstr "Serveur"
msgid "Set Replica as Active"
msgstr "Mettre le replica \"%s\" à actif"
msgid "Set as Active"
msgstr "Mettre à actif"
msgid "Set maximum quotas for the project."
msgstr "Définir les quotas maximum pour le projet."
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "Mettre le replica \"%s\" à actif"
msgid "Share"
msgstr "Partage"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "Détails du partage : %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "Détails du partage : %(share_name)s"
msgid "Share ID"
msgstr "ID du partage"
#, python-format
msgid "Share Instance Details: %s"
msgstr "Détails du partage d'instance : %s"
msgid "Share Instances"
msgstr "Partage d'instance"
msgid "Share Name"
msgstr "Nom du partage"
msgid "Share Network"
msgstr "Partage réseau"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "Détail du partage réseau : %(network_display_name)s"
msgid "Share Network Info"
msgstr "Informations du partage réseau"
msgid "Share Networks"
msgstr "Partages réseau"
msgid "Share Protocol"
msgstr "Protocole de partage"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr "Replicas du partage : %(share_display_name)s"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "Règles du partage : %(share_display_name)s"
msgid "Share Server"
msgstr "Partage serveur"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "Détails du partage serveur : %(server_name)s"
msgid "Share Server Id"
msgstr "ID du partage serveur"
msgid "Share Servers"
msgstr "Partages serveur"
msgid "Share Snapshots"
msgstr "Instantanés de partage"
msgid "Share Snapshots Storage"
msgstr "Instantané du partage de stockage"
msgid "Share Source"
msgstr "Source du partage"
msgid "Share Storage"
msgstr "Partage de stockage"
msgid "Share Type"
msgstr "Type de partage"
msgid "Share Types"
msgstr "Types de partage"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"Le partage ne peut pas être étendu à %(req)iGio car vous avez disposez "
"uniquement d'un quota de %(avail)iGio."
msgid "Share name to be assigned"
msgstr "Nom du partage à donner"
#, python-format
msgid "Share replica %s has been deleted."
msgstr "Le partage de replica %s a été supprimé."
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr ""
"La taille du partage doit être supérieure ou égale à la taille de "
"l'instantané (%sGio)"
msgid "Shares"
msgstr "Partages"
msgid "Shares Networks"
msgstr "Partage réseau"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "Taille"
msgid "Size (GiB)"
msgstr "Taille (Gio)"
msgid "Snapshot"
msgstr "Instantané"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "Détails de l'instantané : %(snapshot_display_name)s"
msgid "Snapshot Overview"
msgstr "Aperçu de l'instantané"
msgid "Source"
msgstr "Source"
msgid "Start migration"
msgstr "Démarrer la migration"
msgid "Status"
msgstr "Statut"
#, python-format
msgid "Successfully created security service: %s"
msgstr "Service de sécurité créé avec succès : %s"
#, python-format
msgid "Successfully created share network: %s"
msgstr "Partage réseau créé avec succès : %s"
#, python-format
msgid "Successfully created share type: %s"
msgstr "Le type de partage a été créé : %s"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr ""
"La demande pour annuler la migration du partage a été envoyée avec succès : "
"%s"
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr ""
"La demande pour finir la migration du partage a été envoyée avec succès : %s"
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "La demande de gestion du partage a été envoyée avec succès : %s"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "La demande de migration du partage a été envoyée avec succès : %s"
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr "La demande de non-gestion du partage a été envoyée avec succès : %s"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "Spécification supplémentaire \"%s\" mise à jour avec succès."
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "Service de sécurité \"%s\" mis à jour avec succès"
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr ""
"La taille du partage ne peut pas être inférieure à la taille de l'instantané "
"(%sGio)"
msgid "Type"
msgstr "Type"
msgid "Unable to add rule."
msgstr "Impossible d'ajouter la règle."
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr "Il est impossible pour le moment d'annuler la migration du partage %s."
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "Impossible de finir la migration du partage %s."
msgid "Unable to create security service."
msgstr "Impossible de créer le service de sécurité."
msgid "Unable to create share network."
msgstr "Impossible de créer le partage réseau."
msgid "Unable to create share replica."
msgstr "Impossible de créer le partage de replica."
msgid "Unable to create share snapshot."
msgstr "Impossible de créer un instantané partagé."
msgid "Unable to create share type."
msgstr "Impossible de créer le type de partage."
msgid "Unable to create share."
msgstr "Impossible de créer le partage."
#, python-format
msgid "Unable to delete replica \"%s\"."
msgstr "Impossible de supprimer le replica \"%s\"."
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "Impossible de supprimer la règle \"%s\"."
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "Impossible de supprimer le partage \"%s\""
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr ""
"Impossible de supprimer l'instantané \"%s\". Un ou plusieurs partages "
"dépendent de lui."
msgid "Unable to extend share."
msgstr "Impossible d'étendre le partage."
msgid "Unable to get information about share type access."
msgstr ""
"Impossible de récupérer les information au sujet des accès sur le type de "
"partage."
msgid "Unable to get list of projects."
msgstr "Impossible d'obtenir la liste des projets"
msgid "Unable to get the security services hosts"
msgstr "Impossible de récupérer les hôtes des services de sécurité"
msgid "Unable to load the specified snapshot."
msgstr "Impossible de charger l'instantané spécifié."
msgid "Unable to manage share"
msgstr "Impossible de gérer le partage."
#, python-format
msgid "Unable to migrate share %s."
msgstr "Impossible de migrer le partage %s."
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr ""
"Il est impossible pour le moment d'obtenir la progression de la migration du "
"partage %s."
#, python-format
msgid "Unable to reset state of replica '%s'."
msgstr "Impossible de réinitialiser l'état du replica \"%s\"."
#, python-format
msgid "Unable to reset status of replica '%s'."
msgstr "Impossible de réinitialiser le statut du replica \"%s\"."
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "Impossible de synchroniser le replica \"%s\"."
msgid "Unable to retrieve list of projects."
msgstr "Impossible de récupérer la liste des projets."
msgid "Unable to retrieve quotas."
msgstr "Impossible de récupérer les quotas."
#, python-format
msgid "Unable to retrieve replica '%s'."
msgstr "Impossible de récupérer le replica \"%s\"."
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "Impossible de récupérer les détails du service de sécurité \"%s\"."
msgid "Unable to retrieve security services"
msgstr "Impossible de récupérer les services de sécurité."
msgid "Unable to retrieve security_service."
msgstr "Impossible de récupérer security_service."
msgid "Unable to retrieve share details."
msgstr "Impossible de récupérer les détails du partage."
msgid "Unable to retrieve share instance details."
msgstr "Impossible de récupérer les détails du partage d'instance."
msgid "Unable to retrieve share instances."
msgstr "Impossible de récupérer les partages d'instance"
msgid "Unable to retrieve share limit information."
msgstr "Impossible de récupérer les informations de limite du partage."
msgid "Unable to retrieve share list."
msgstr "Impossible de récupérer la liste des partages."
msgid "Unable to retrieve share network details."
msgstr "Impossible de récupérer les détails du partage réseau."
msgid "Unable to retrieve share network."
msgstr "Impossible de récupérer le partage réseau."
msgid "Unable to retrieve share networks"
msgstr "Impossible de récupérer les partages réseau"
msgid "Unable to retrieve share replicas."
msgstr "Impossible de récupérer les partages de replica."
msgid "Unable to retrieve share rules."
msgstr "Impossible de récupérer la liste des partages."
msgid "Unable to retrieve share server details."
msgstr "Impossible de récupérer les détails du partage serveur."
msgid "Unable to retrieve share servers"
msgstr "Impossible de récupérer les partages de serveur"
msgid "Unable to retrieve share snapshots list."
msgstr "Impossible de récupérer la liste des instantanés partagés."
msgid "Unable to retrieve share snapshots."
msgstr "Impossible de récupérer les instantanés du partage."
msgid "Unable to retrieve share."
msgstr "Impossible de récupérer le partage."
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "Impossible de récupérer les partages \"%s\"."
msgid "Unable to retrieve share_type."
msgstr "Impossible de récupérer le share_type."
msgid "Unable to retrieve snapshot details."
msgstr "Impossible de récupérer les détails de l'instantané."
msgid "Unable to retrieve snapshot."
msgstr "Impossible de récupérer l'instantané."
msgid "Unable to retrieve volume details."
msgstr "Impossible de récupérer les détails du volume."
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "Impossible de mettre le replica \"%s\" à actif."
msgid "Unable to unmanage share."
msgstr "Impossible de ne pas gérer le partage."
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "Impossible de mettre à jour le type de partage \"%s\"."
msgid "Unable to update default quotas."
msgstr "Impossible de mettre à jour les quotas par défaut."
msgid "Unable to update extra_specs for share type."
msgstr "Impossible de mettre à jour extra_specs pour le type de partage."
msgid "Unable to update security service."
msgstr "Impossible de mettre à jour le service de sécurité."
msgid "Unable to update share metadata."
msgstr "Impossible de mettre à jour les métadonnées du partage."
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "Impossible de mettre à jour le partage réseau \"%s\"."
msgid "Unable to update share network."
msgstr "Impossible de mettre à jour le partage réseau."
msgid "Unable to update share type."
msgstr "Impossible de mettre à jour le type de partage."
msgid "Unable to update share."
msgstr "Impossible de mettre à jour le partage."
msgid "Unknown"
msgstr "Inconnu"
msgid "Unmanage"
msgstr "Non-géré"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "Erreur non-gérée"
msgid "Unmanage Share"
msgstr "Partage non-géré"
msgid "Update"
msgstr "Mettre à jour"
msgid "Update Share Network"
msgstr "Mettre à jour le partage réseau"
msgid "Update Share Type"
msgstr "Mise à jour du type de partage"
msgid "Updated At"
msgstr "Mis à jour à"
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "Mise à jour des accès pour le type de partage : \"%s\"."
#, python-format
msgid "Updated share network \"%s\"."
msgstr "Partage réseau mis à jour \"%s\"."
#, python-format
msgid "Updating share \"%s\""
msgstr "Mise à jour du partage \"%s\""
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "Mise à jour des métadonnées du partage \"%s\""
#, python-format
msgid "Updating share network \"%s\""
msgstr "Mise à jour en cours du partage réseau \"%s\""
msgid "Use snapshot as a source"
msgstr "Utiliser un instantané comme source"
msgid "User"
msgstr "Utilisateur"
msgid "Visibility"
msgstr "Visibilité"
msgid "Writable"
msgstr "Accessible en écriture"
msgid "key=value pairs per line can be set"
msgstr "paires de clé-valeur key=value par ligne peut être mise"
manila-ui-3.0.0/manila_ui/locale/en_GB/ 0000775 0001750 0001750 00000000000 13647271736 017577 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/en_GB/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021364 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/en_GB/LC_MESSAGES/django.po 0000664 0001750 0001750 00000140367 13647271543 023175 0 ustar zuul zuul 0000000 0000000 # Andi Chandler , 2017. #zanata
# Andi Chandler , 2018. #zanata
# Andi Chandler , 2019. #zanata
# Andi Chandler , 2020. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2020-04-15 19:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2020-04-16 12:28+0000\n"
"Last-Translator: Andi Chandler \n"
"Language-Team: English (United Kingdom)\n"
"Language: en_GB\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
msgid " Share Type Visibility:"
msgstr " Share Type Visibility:"
msgid ""
"\"Manage\" an existing share from a Manila host. This will make the share "
"visible within OpenStack.
This is equivalent to the 'manila "
"manage' command."
msgstr ""
"\"Manage\" an existing share from a Manila host. This will make the share "
"visible within OpenStack.
This is equivalent to the 'manila "
"manage' command."
#, python-format
msgid "%(used)s of %(quota)s GiB Used"
msgstr "%(used)s of %(quota)s GiB Used"
#, python-format
msgid "%(used)s of %(quota)s Used"
msgstr "%(used)s of %(quota)s Used"
#, python-format
msgid "%sGiB"
msgstr "%sGiB"
msgid "(Quota exceeded)"
msgstr "(Quota exceeded)"
msgid "Access Key"
msgstr "Access Key"
msgid "Access Key:"
msgstr "Access Key:"
msgid "Access Level"
msgstr "Access Level"
msgid "Access Level:"
msgstr "Access Level:"
msgid "Access Rules"
msgstr "Access Rules"
msgid "Access To"
msgstr "Access To"
msgid "Access Type"
msgstr "Access Type"
msgid "Access to"
msgstr "Access to"
msgid "Access to:"
msgstr "Access to:"
msgctxt "Current status of share network"
msgid "Active"
msgstr "Active"
msgctxt "Current status of share server"
msgid "Active"
msgstr "Active"
msgid "Add"
msgstr "Add"
msgid "Add Rule"
msgstr "Add Rule"
msgid "Add Security Service"
msgstr "Add Security Service"
msgid "Add Share Snapshot Rule"
msgstr "Add Share Snapshot Rule"
msgid ""
"Add policy rule to share, 'ip' rule represents IPv4 or IPv6 address, 'user' "
"rule represents username or usergroup, 'cephx' rule represents ceph auth ID."
msgstr ""
"Add policy rule to share, 'ip' rule represents IPv4 or IPv6 address, 'user' "
"rule represents username or usergroup, 'cephx' rule represents Ceph auth ID."
msgid ""
"Add policy rule to snapshot, 'ip' rule represents ip address, 'user' rule "
"represents username or usergroup, 'cephx' rule represents ceph auth ID, and "
"'cert' rule represents certificate."
msgstr ""
"Add policy rule to snapshot, 'ip' rule represents ip address, 'user' rule "
"represents username or usergroup, 'cephx' rule represents Ceph auth ID, and "
"'cert' rule represents certificate."
msgid "Add rule"
msgstr "Add rule"
msgid "Add security services to share network."
msgstr "Add security services to share network."
msgid "All keys and values must be in range from 1 to 255."
msgstr "All keys and values must be in range from 1 to 255."
msgid "All pairs that are in field for left are set for this metadata."
msgstr "All pairs that are in field for left are set for this metadata."
msgid "All pairs that are in field for left are set for this share group type."
msgstr ""
"All pairs that are in field for left are set for this share group type."
msgid "All pairs that are in field for left are set for this share type."
msgstr "All pairs that are in field for left are set for this share type."
msgid "Allow project access to share group type."
msgstr "Allow project access to share group type."
msgid "Allow project access to share type."
msgstr "Allow project access to share type."
msgid "At least one security service must be specified."
msgstr "At least one security service must be specified."
msgid "At least one share type must be specified."
msgstr "At least one share type must be specified."
msgid "Availability Zone"
msgstr "Availability Zone"
msgid "Availability zone"
msgstr "Availability zone"
msgctxt "Current status of replica"
msgid "Available"
msgstr "Available"
msgctxt "Current status of share"
msgid "Available"
msgstr "Available"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "Available"
msgid "Available networks"
msgstr "Available networks"
msgid "Available projects"
msgstr "Available projects"
msgid "Available security services"
msgstr "Available security services"
msgid "Cancel"
msgstr "Cancel"
msgid "Cancel Migration"
msgstr "Cancel Migration"
msgid "Cancel migration"
msgstr "Cancel migration"
msgid "Cancel migration of a Share"
msgstr "Cancel migration of a Share"
msgid ""
"Cancel migration of a migrating share.
This is equivalent to the "
"'manila migration-cancel' command."
msgstr ""
"Cancel migration of a migrating share.
This is equivalent to the "
"'manila migration-cancel' command."
msgid "Capabilities"
msgstr "Capabilities"
msgid "Choose a snapshot"
msgstr "Choose a snapshot"
msgid "Complete Migration"
msgstr "Complete Migration"
msgid "Complete migration"
msgstr "Complete migration"
msgid "Complete migration of a Share"
msgstr "Complete migration of a Share"
msgid ""
"Complete migration of a migrating share to another Manila host. This "
"operation is expected to be disruptive.
This is equivalent to the "
"'manila migration-complete' command."
msgstr ""
"Complete migration of a migrating share to another Manila host. This "
"operation is expected to be disruptive.
This is equivalent to the "
"'manila migration-complete' command."
msgid "Confirm Migration Cancelling of Share"
msgstr "Confirm Migration Cancelling of Share"
msgid "Confirm Migration Completion of Share"
msgstr "Confirm Migration Completion of Share"
msgid "Confirm Obtaining migration progress of Share"
msgstr "Confirm Obtaining migration progress of Share"
msgid "Confirm Password"
msgstr "Confirm Password"
msgid "Confirm Unmanage Share"
msgstr "Confirm Unmanage Share"
msgid "Create"
msgstr "Create"
msgid "Create Group Share Type"
msgstr "Create Group Share Type"
msgid "Create Replica"
msgstr "Create Replica"
msgid "Create Security Service"
msgstr "Create Security Service"
msgid "Create Share"
msgstr "Create Share"
msgid "Create Share Group"
msgstr "Create Share Group"
msgid "Create Share Group Snapshot"
msgstr "Create Share Group Snapshot"
msgid "Create Share Group Type"
msgstr "Create Share Group Type"
msgid "Create Share Network"
msgstr "Create Share Network"
msgid "Create Share Replica"
msgstr "Create Share Replica"
msgid "Create Share Snapshot"
msgstr "Create Share Snapshot"
msgid "Create Share Type"
msgstr "Create Share Type"
msgid "Create a Share"
msgstr "Create a Share"
msgid "Create share replica in specific availability zone."
msgstr "Create share replica in specific availability zone."
msgid "Created"
msgstr "Created"
msgid "Created At"
msgstr "Created At"
msgid "Created At:"
msgstr "Created At:"
msgid "Created at"
msgstr "Created at"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "Creating"
msgctxt "Current status of share"
msgid "Creating"
msgstr "Creating"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "Creating"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "Creating"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "Creating replica for share \"%s\"."
#, python-format
msgid "Creating rule for \"%s\""
msgstr "Creating rule for \"%s\""
#, python-format
msgid "Creating share \"%s\""
msgstr "Creating share \"%s\""
#, python-format
msgid "Creating share group \"%s\""
msgstr "Creating share group \"%s\""
#, python-format
msgid "Creating share group snapshot \"%s\"."
msgstr "Creating share group snapshot \"%s\"."
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "Creating share snapshot \"%s\"."
#, python-format
msgid "Creating snapshot rule for \"%s\""
msgstr "Creating snapshot rule for \"%s\""
msgid "Current Size (GiB)"
msgstr "Current Size (GiB)"
msgid "DNS IP"
msgstr "DNS IP"
msgid "Delete Replica"
msgid_plural "Delete Replicas"
msgstr[0] "Delete Replica"
msgstr[1] "Delete Replicas"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Delete Rule"
msgstr[1] "Delete Rules"
msgid "Delete Security Service"
msgid_plural "Delete Security Services"
msgstr[0] "Delete Security Service"
msgstr[1] "Delete Security Services"
msgid "Delete Share"
msgid_plural "Delete Shares"
msgstr[0] "Delete Share"
msgstr[1] "Delete Shares"
msgid "Delete Share Group"
msgid_plural "Delete Share Groups"
msgstr[0] "Delete Share Group"
msgstr[1] "Delete Share Groups"
msgid "Delete Share Group Snapshot"
msgid_plural "Delete Share Group Snapshots"
msgstr[0] "Delete Share Group Snapshot"
msgstr[1] "Delete Share Group Snapshots"
msgid "Delete Share Group Type"
msgid_plural "Delete Share Group Types"
msgstr[0] "Delete Share Group Type"
msgstr[1] "Delete Share Group Types"
msgid "Delete Share Network"
msgid_plural "Delete Share Networks"
msgstr[0] "Delete Share Network"
msgstr[1] "Delete Share Networks"
msgid "Delete Share Server"
msgid_plural "Delete Share Server"
msgstr[0] "Delete Share Server"
msgstr[1] "Delete Share Server"
msgid "Delete Share Snapshot"
msgid_plural "Delete Share Snapshots"
msgstr[0] "Delete Share Snapshot"
msgstr[1] "Delete Share Snapshots"
msgid "Delete Share Snapshot Rule"
msgid_plural "Delete Share Snapshot Rules"
msgstr[0] "Delete Share Snapshot Rule"
msgstr[1] "Delete Share Snapshot Rules"
msgid "Delete Share Type"
msgid_plural "Delete Share Types"
msgstr[0] "Delete Share Type"
msgstr[1] "Delete Share Types"
msgid "Delete Snapshot"
msgid_plural "Delete Snapshots"
msgstr[0] "Delete Snapshot"
msgstr[1] "Delete Snapshots"
msgid "Deleted Replica"
msgid_plural "Deleted Replicas"
msgstr[0] "Deleted Replica"
msgstr[1] "Deleted Replicas"
msgid "Deleted Rule"
msgid_plural "Deleted Rules"
msgstr[0] "Deleted Rule"
msgstr[1] "Deleted Rules"
msgid "Deleted Security Service"
msgid_plural "Deleted Security Services"
msgstr[0] "Deleted Security Service"
msgstr[1] "Deleted Security Services"
msgid "Deleted Share"
msgid_plural "Deleted Shares"
msgstr[0] "Deleted Share"
msgstr[1] "Deleted Shares"
msgid "Deleted Share Group"
msgid_plural "Deleted Share Groups"
msgstr[0] "Deleted Share Group"
msgstr[1] "Deleted Share Groups"
msgid "Deleted Share Group Snapshot"
msgid_plural "Deleted Share Group Snapshots"
msgstr[0] "Deleted Share Group Snapshot"
msgstr[1] "Deleted Share Group Snapshots"
msgid "Deleted Share Group Type"
msgid_plural "Deleted Share Group Types"
msgstr[0] "Deleted Share Group Type"
msgstr[1] "Deleted Share Group Types"
msgid "Deleted Share Network"
msgid_plural "Deleted Share Networks"
msgstr[0] "Deleted Share Network"
msgstr[1] "Deleted Share Networks"
msgid "Deleted Share Server"
msgid_plural "Deleted Share Server"
msgstr[0] "Deleted Share Server"
msgstr[1] "Deleted Share Server"
msgid "Deleted Share Snapshot"
msgid_plural "Deleted Share Snapshots"
msgstr[0] "Deleted Share Snapshot"
msgstr[1] "Deleted Share Snapshots"
msgid "Deleted Share Snapshot Rule"
msgid_plural "Deleted Share Snapshot Rules"
msgstr[0] "Deleted Share Snapshot Rule"
msgstr[1] "Deleted Share Snapshot Rules"
msgid "Deleted Share Type"
msgid_plural "Deleted Share Types"
msgstr[0] "Deleted Share Type"
msgstr[1] "Deleted Share Types"
msgid "Deleted Snapshot"
msgid_plural "Deleted Snapshots"
msgstr[0] "Deleted Snapshot"
msgstr[1] "Deleted Snapshots"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "Deleting"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "Deleting"
msgid "Description"
msgstr "Description"
msgid "Description:"
msgstr "Description:"
msgid "Destination host and pool where share will be migrated to."
msgstr "Destination host and pool where share will be migrated to."
msgid "Domain"
msgstr "Domain"
msgid "Driver handles share servers"
msgstr "Driver handles share servers"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "Driver options ('volume_id' for Generic driver, etc...)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "Duplicated keys '%s'."
msgid "Edit"
msgstr "Edit"
msgid "Edit Security Service"
msgstr "Edit Security Service"
msgid "Edit Share"
msgstr "Edit Share"
msgid "Edit Share Metadata"
msgstr "Edit Share Metadata"
msgid "Edit Share Network"
msgstr "Edit Share Network"
msgid "Edit Share Snapshot"
msgstr "Edit Share Snapshot"
msgid "Edit Share network"
msgstr "Edit Share network"
msgid ""
"Enforces migration of the share snapshots to the destination. If set to "
"True, host-assisted migration will not be attempted."
msgstr ""
"Enforces migration of the share snapshots to the destination. If set to "
"True, host-assisted migration will not be attempted."
msgid ""
"Enforces migration to be nondisruptive. If set to True, host-assisted "
"migration will not be attempted."
msgstr ""
"Enforces migration to be non-disruptive. If set to True, host-assisted "
"migration will not be attempted."
msgid ""
"Enforces migration to keep the share writable while contents are being "
"moved. If set to True, host-assisted migration will not be attempted."
msgstr ""
"Enforces migration to keep the share writable while contents are being "
"moved. If set to True, host-assisted migration will not be attempted."
msgid ""
"Enforces migration to preserve all file metadata when moving its contents. "
"If set to True, host-assisted migration will not be attempted."
msgstr ""
"Enforces migration to preserve all file metadata when moving its contents. "
"If set to True, host-assisted migration will not be attempted."
msgid ""
"Enforces the use of the host-assisted migration approach, which bypasses "
"driver optimizations."
msgstr ""
"Enforces the use of the host-assisted migration approach, which bypasses "
"driver optimisations."
msgctxt "Current status of replica"
msgid "Error"
msgstr "Error"
msgctxt "Current status of share"
msgid "Error"
msgstr "Error"
msgctxt "Current status of share network"
msgid "Error"
msgstr "Error"
msgctxt "Current status of share server"
msgid "Error"
msgstr "Error"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "Error"
msgid "Expected only pairs of key=value."
msgstr "Expected only pairs of key=value."
msgid "Export location"
msgstr "Export location"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgid "Export locations"
msgstr "Export locations"
msgid "Extend"
msgstr "Extend"
msgid "Extend Share"
msgstr "Extend Share"
#, python-format
msgid "Extend share \"%s\""
msgstr "Extend share \"%s\""
msgid "Extend the size of a share. "
msgstr "Extend the size of a share. "
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "Extending Error"
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgid "Extra specs"
msgstr "Extra specs"
msgid "Force Host Assisted Migration"
msgstr "Force Host Assisted Migration"
msgid "From here you can modify name and description of a security service."
msgstr "From here you can modify name and description of a security service."
msgid ""
"From here you can modify name and description of a share group snapshot."
msgstr ""
"From here you can modify name and description of a share group snapshot."
msgid "From here you can modify name and description of a share network."
msgstr "From here you can modify name and description of a share network."
msgid "From here you can modify name and description of a snapshot."
msgstr "From here you can modify name and description of a snapshot."
msgid ""
"From here you can modify name, description and visibility of a share group."
msgstr ""
"From here you can modify name, description and visibility of a share group."
msgid "From here you can modify name, description and visibility of a share."
msgstr "From here you can modify name, description and visibility of a share."
msgid "From here you can revert the share to its latest snapshot."
msgstr "From here you can revert the share to its latest snapshot."
msgid "From here you can update share network info. "
msgstr "From here you can update share network info. "
msgid "From here you can update the default share quotas (max limits)."
msgstr "From here you can update the default share quotas (max limits)."
msgid "Get Migration Progress"
msgstr "Get Migration Progress"
msgid "Get migration progress"
msgstr "Get migration progress"
msgid "GiB"
msgstr "GiB"
msgid ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgstr ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgid "Group specs"
msgstr "Group specs"
msgid "Here can be modified extra-specs for share type."
msgstr "Here can be modified extra-specs for share type."
msgid "Here can be modified group-specs for share group type."
msgstr "Here can be modified group-specs for share group type."
msgid "Host"
msgstr "Host"
msgid "Host of share"
msgstr "Host of share"
msgid "Host to migrate share"
msgstr "Host to migrate share"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr "Host where share is located, example: some.host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "ID:"
msgstr "ID:"
msgid "IP Version"
msgstr "IP Version"
msgid "Id"
msgstr "Id"
#, python-format
msgid ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgstr ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgctxt "Current status of share server"
msgid "In-use"
msgstr "In-use"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "In-use"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "Inactive"
msgid "Is admin only:"
msgstr "Is admin only:"
#, python-format
msgid "Key '%s' has improper length."
msgstr "Key '%s' has improper length."
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "Key can not contain spaces. See string '%s'."
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "Keys should not contain spaces. Error in '%s'."
msgid "Limit"
msgstr "Limit"
msgid "Make visible for all"
msgstr "Make visible for all"
msgid "Manage"
msgstr "Manage"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "Managed Error"
msgid "Manage Replicas"
msgstr "Manage Replicas"
msgid "Manage Rules"
msgstr "Manage Rules"
msgid "Manage Share"
msgstr "Manage Share"
msgid "Manage Share Group Type Access"
msgstr "Manage Share Group Type Access"
msgid "Manage Share Snapshot Rules"
msgstr "Manage Share Snapshot Rules"
msgid "Manage Share Type Access"
msgstr "Manage Share Type Access"
msgid "Metadata"
msgstr "Metadata"
msgid "Migrate Share"
msgstr "Migrate Share"
msgid "Migrate a Share"
msgstr "Migrate a Share"
msgid ""
"Migrate an existing share to another Manila host. This will move all your "
"share data from one host to another.
This is equivalent to the "
"'manila migration-start' command."
msgstr ""
"Migrate an existing share to another Manila host. This will move all your "
"share data from one host to another.
This is equivalent to the "
"'manila migration-start' command."
msgctxt "Current status of share"
msgid "Migrating"
msgstr "Migrating"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "Migrating to"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "Migration of share %(name)s is at %(progress)s percent."
msgid "Mount snapshot support"
msgstr "Mount snapshot support"
msgid "Name"
msgstr "Name"
msgid "Name:"
msgstr "Name:"
msgid "Net Details"
msgstr "Net Details"
msgid "Network"
msgstr "Network"
msgid "Network Details"
msgstr "Network Details"
msgid "Network Type"
msgstr "Network Type"
msgid "Network handling enabled:"
msgstr "Network handling enabled:"
msgid "Networks"
msgstr "Networks"
msgid "Neutron Net"
msgstr "Neutron Net"
msgid "Neutron Subnet"
msgstr "Neutron Subnet"
msgid "New Size (GiB)"
msgstr "New Size (GiB)"
msgid "New share network to be set in migrated share"
msgstr "New share network to be set in migrated share"
msgid "New share type to be set in migrating share"
msgstr "New share type to be set in migrating share"
msgid "New size must be greater than current size."
msgstr "New size must be greater than current size."
msgid "No projects found."
msgstr "No projects found."
msgid "No projects selected."
msgstr "No projects selected."
msgid "No security services found."
msgstr "No security services found."
msgid "No security services selected."
msgstr "No security services selected."
msgid "No source, empty share"
msgstr "No source, empty share"
msgid "No source, empty share group"
msgstr "No source, empty share group"
msgid "Nondisruptive"
msgstr "Non-disruptive"
msgid "Nova Net"
msgstr "Nova Net"
msgid "Number of Share Snapshots"
msgstr "Number of Share Snapshots"
msgid "Number of Shares"
msgstr "Number of Shares"
msgid "Obtain Progress"
msgstr "Obtain Progress"
msgid "Obtain migration progress of a Share"
msgstr "Obtain migration progress of a Share"
msgid ""
"Obtains migration progress of a migrating share.
This is "
"equivalent to the 'manila migration-get-progress' command."
msgstr ""
"Obtains migration progress of a migrating share.
This is "
"equivalent to the 'manila migration-get-progress' command."
msgid "One line - one action. Empty strings will be ignored."
msgstr "One line - one action. Empty strings will be ignored."
msgid "Overview"
msgstr "Overview"
msgid "Password"
msgstr "Password"
msgid "Passwords do not match."
msgstr "Passwords do not match."
msgid "Path:"
msgstr "Path:"
msgid "Placeholder for description of share group type access managing form."
msgstr "Placeholder for description of share group type access managing form."
msgid "Placeholder for description of share type access managing form."
msgstr "Placeholder for description of share type access managing form."
msgid "Preferred:"
msgstr "Preferred:"
msgid "Preserve Metadata"
msgstr "Preserve Metadata"
msgid "Preserve Snapshots"
msgstr "Preserve Snapshots"
msgid "Project"
msgstr "Project"
msgid "Projects with access to share group type"
msgstr "Projects with access to share group type"
msgid "Projects with access to share type"
msgstr "Projects with access to share type"
msgid "Protocol"
msgstr "Protocol"
msgid "Public"
msgstr "Public"
msgid "Quota Name"
msgstr "Quota Name"
msgid "Replica Details"
msgstr "Replica Details"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "Replica Details: %(replica_display_name)s"
msgid "Replica State"
msgstr "Replica State"
msgid "Replica state"
msgstr "Replica state"
msgid "Replicas"
msgstr "Replicas"
msgid "Reset Replica State"
msgstr "Reset Replica State"
msgid "Reset Replica Status"
msgstr "Reset Replica Status"
msgid "Reset Share Group Snapshot Status"
msgstr "Reset Share Group Snapshot Status"
msgid "Reset Share Group Status"
msgstr "Reset Share Group Status"
msgid "Reset Status"
msgstr "Reset Status"
msgid "Reset replica state"
msgstr "Reset replica state"
msgid "Reset replica status"
msgstr "Reset replica status"
msgid "Reset share replica's state with ID"
msgstr "Reset share replica's state with ID"
msgid "Reset share replica's status with ID"
msgstr "Reset share replica's status with ID"
msgid "Reset state"
msgstr "Reset state"
msgid "Reset status"
msgstr "Reset status"
#, python-format
msgid "Reseting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
msgstr "Resetting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
#, python-format
msgid "Reseting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "Resetting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
#, python-format
msgid "Reseting share group ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "Reseting share group ('%(id)s') status from '%(from)s' to '%(to)s'."
#, python-format
msgid ""
"Reseting share group snapshot ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Reseting share group snapshot ('%(id)s') status from '%(from)s' to '%(to)s'."
msgid "Resync"
msgstr "Resync"
msgid "Resync Replica"
msgstr "Resync Replica"
msgid "Resync replica"
msgstr "Resync replica"
msgid "Resync share replica with ID"
msgstr "Resync share replica with ID"
#, python-format
msgid "Resync'ing replica '%s'"
msgstr "Resync'ing replica '%s'"
msgid "Revert Share"
msgstr "Revert Share"
msgid "Revert Share to a Snapshot"
msgstr "Revert Share to a Snapshot"
msgid "Revert share to a snapshot"
msgstr "Revert share to a snapshot"
msgctxt "Current status of share"
msgid "Reverting Error"
msgstr "Reverting Error"
msgid "Rules"
msgstr "Rules"
msgid "Save Changes"
msgstr "Save Changes"
msgid "Security Service Details"
msgstr "Security Service Details"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "Security Service Details: %(service_display_name)s"
msgid "Security Service Overview"
msgstr "Security Service Overview"
msgid "Security Services"
msgstr "Security Services"
msgid "Security services within share network"
msgstr "Security services within share network"
msgid "Segmentation Id"
msgstr "Segmentation Id"
msgid "Select parameters of share group you want to create. "
msgstr "Select parameters of share group you want to create. "
msgid "Select parameters of share you want to create. "
msgstr "Select parameters of share you want to create. "
msgid "Selected Networks"
msgstr "Selected Networks"
msgid "Selected Projects"
msgstr "Selected Projects"
msgid "Selected projects"
msgstr "Selected projects"
msgid "Selected security services"
msgstr "Selected security services"
msgid "Server"
msgstr "Server"
msgid "Set Replica as Active"
msgstr "Set Replica as Active"
msgid "Set as Active"
msgstr "Set as Active"
msgid "Set maximum quotas for the project."
msgstr "Set maximum quotas for the project."
msgid "Set share replica with ID"
msgstr "Set share replica with ID"
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "Setting replica \"%s\" as active..."
msgid "Share"
msgstr "Share"
#, python-format
msgid "Share \"%(s)s\" has been reverted to \"%(ss)s\" snapshot successfully"
msgstr "Share \"%(s)s\" has been reverted to \"%(ss)s\" snapshot successfully"
msgid "Share Details"
msgstr "Share Details"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "Share Details: %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "Share Details: %(share_name)s"
msgid "Share Group"
msgstr "Share Group"
msgid "Share Group Details"
msgstr "Share Group Details"
#, python-format
msgid "Share Group Details: %s"
msgstr "Share Group Details: %s"
msgid "Share Group Name"
msgstr "Share Group Name"
msgid "Share Group Overview"
msgstr "Share Group Overview"
msgid "Share Group Snapshot"
msgstr "Share Group Snapshot"
msgid "Share Group Snapshot Details"
msgstr "Share Group Snapshot Details"
#, python-format
msgid "Share Group Snapshot Details: %(sgs_display_name)s"
msgstr "Share Group Snapshot Details: %(sgs_display_name)s"
msgid "Share Group Snapshot Overview"
msgstr "Share Group Snapshot Overview"
msgid "Share Group Snapshots"
msgstr "Share Group Snapshots"
msgid "Share Group Type"
msgstr "Share Group Type"
msgid "Share Group Type ID:"
msgstr "Share Group Type ID:"
msgid "Share Group Type Name:"
msgstr "Share Group Type Name:"
msgid "Share Group Type Specs:"
msgstr "Share Group Type Specs:"
msgid "Share Group Types"
msgstr "Share Group Types"
msgid "Share Groups"
msgstr "Share Groups"
msgid "Share ID"
msgstr "Share ID"
msgid "Share Instance Details"
msgstr "Share Instance Details"
#, python-format
msgid "Share Instance Details: %s"
msgstr "Share Instance Details: %s"
msgid "Share Instance Overview"
msgstr "Share Instance Overview"
msgid "Share Instances"
msgstr "Share Instances"
msgid "Share Limits"
msgstr "Share Limits"
msgid "Share Name"
msgstr "Share Name"
msgid "Share Network"
msgstr "Share Network"
msgid "Share Network Details"
msgstr "Share Network Details"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "Share Network Details: %(network_display_name)s"
msgid "Share Network Info"
msgstr "Share Network Info"
msgid "Share Network Overview"
msgstr "Share Network Overview"
msgid "Share Networks"
msgstr "Share Networks"
msgid "Share Overview"
msgstr "Share Overview"
msgid "Share Protocol"
msgstr "Share Protocol"
msgid "Share Quotas"
msgstr "Share Quotas"
msgid "Share Replica ID:"
msgstr "Share Replica ID:"
msgid "Share Replica Overview"
msgstr "Share Replica Overview"
msgid "Share Replicas"
msgstr "Share Replicas"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr "Share Replicas: %(share_display_name)s"
msgid "Share Rules"
msgstr "Share Rules"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "Share Rules: %(share_display_name)s"
msgid "Share Server"
msgstr "Share Server"
msgid "Share Server Details"
msgstr "Share Server Details"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "Share Server Details: %(server_name)s"
msgid "Share Server Id"
msgstr "Share Server Id"
msgid "Share Server Overview"
msgstr "Share Server Overview"
msgid "Share Servers"
msgstr "Share Servers"
msgid "Share Snapshot Details"
msgstr "Share Snapshot Details"
msgid "Share Snapshot Name"
msgstr "Share Snapshot Name"
msgid "Share Snapshot Overview"
msgstr "Share Snapshot Overview"
msgid "Share Snapshot Rules"
msgstr "Share Snapshot Rules"
msgid "Share Snapshots"
msgstr "Share Snapshots"
msgid "Share Snapshots Storage"
msgstr "Share Snapshots Storage"
msgid ""
"Share Snapshots are used for storing share changes and creating shares. "
msgstr ""
"Share Snapshots are used for storing share changes and creating shares. "
msgid "Share Source"
msgstr "Share Source"
msgid "Share Storage"
msgstr "Share Storage"
msgid "Share Type"
msgstr "Share Type"
msgid "Share Type Name:"
msgstr "Share Type Name:"
msgid "Share Type Visibility:"
msgstr "Share Type Visibility:"
msgid "Share Types"
msgstr "Share Types"
msgid "Share Types (multiple available)"
msgstr "Share Types (multiple available)"
msgid "Share Types (one available)"
msgstr "Share Types (one available)"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgid "Share gigabytes"
msgstr "Share gigabytes"
msgid "Share name to be assigned"
msgstr "Share name to be assigned"
msgid "Share network"
msgstr "Share network"
msgid ""
"Share networks contain network data, that will be used for creation of "
"service VM, where will be hosted shares."
msgstr ""
"Share networks contain network data, that will be used for creation of "
"service VM, where will be hosted shares."
#, python-format
msgid "Share replica %s has been deleted."
msgstr "Share replica %s has been deleted."
msgid "Share server"
msgstr "Share server"
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgid "Share snapshot gigabytes"
msgstr "Share snapshot gigabytes"
msgid "Share snapshots"
msgstr "Share snapshots"
msgid "Share type"
msgstr "Share type"
msgid "Share types"
msgstr "Share types"
msgid "Shared Quotas"
msgstr "Shared Quotas"
msgid "Shares"
msgstr "Shares"
msgid "Shares Networks"
msgstr "Shares Networks"
msgid "Shares on this server"
msgstr "Shares on this server"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "Size"
msgid "Size (GiB)"
msgstr "Size (GiB)"
msgid "Snapshot"
msgstr "Snapshot"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "Snapshot Details: %(snapshot_display_name)s"
msgid "Snapshot ID"
msgstr "Snapshot ID"
msgid "Snapshot Overview"
msgstr "Snapshot Overview"
msgid "Snapshot Replica ID:"
msgstr "Snapshot Replica ID:"
#, python-format
msgid "Snapshot Rules: %(snapshot_display_name)s"
msgstr "Snapshot Rules: %(snapshot_display_name)s"
msgid "Source"
msgstr "Source"
msgid "Source SG Snapshot"
msgstr "Source SG Snapshot"
msgid "Source Share Group"
msgstr "Source Share Group"
msgid "Source Share Group Snapshot"
msgstr "Source Share Group Snapshot"
msgid "Source Type"
msgstr "Source Type"
msgid "Source share group snapshot"
msgstr "Source share group snapshot"
msgid ""
"Specify the new share network for the share. Do not specify this parameter "
"if the migrating share has to be retained within its current share network."
msgstr ""
"Specify the new share network for the share. Do not specify this parameter "
"if the migrating share has to be retained within its current share network."
msgid ""
"Specify the new share type for the share. Do not specify this parameter if "
"the migrating share has to be retained with its current share type."
msgstr ""
"Specify the new share type for the share. Do not specify this parameter if "
"the migrating share has to be retained with its current share type."
msgid "Specs"
msgstr "Specs"
msgid "Start migration"
msgstr "Start migration"
msgid "Status"
msgstr "Status"
msgid "Status:"
msgstr "Status:"
msgid "Submit"
msgstr "Submit"
msgid "Subnet"
msgstr "Subnet"
#, python-format
msgid "Successfully created security service: %s"
msgstr "Successfully created security service: %s"
#, python-format
msgid "Successfully created share group type: %s"
msgstr "Successfully created share group type: %s"
#, python-format
msgid "Successfully created share network: %s"
msgstr "Successfully created share network: %s"
#, python-format
msgid "Successfully created share type: %s"
msgstr "Successfully created share type: %s"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr "Successfully sent the request to cancel migration of share: %s."
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr "Successfully sent the request to complete migration of share: %s."
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "Successfully sent the request to manage share: %s"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "Successfully sent the request to migrate share: %s."
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr "Successfully sent the request to unmanage share: %s"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "Successfully updated extra specs for share type '%s'."
#, python-format
msgid "Successfully updated group specs for share group type '%s'."
msgstr "Successfully updated group specs for share group type '%s'."
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "Successfully updated security service \"%s\""
msgid "Task state"
msgstr "Task state"
msgid ""
"The security service can be used by backend drivers to configure clients, "
"for more secure using of share."
msgstr ""
"The security service can be used by backend drivers to configure clients, "
"for more secure using of share."
msgid ""
"The share group type defines the characteristics of a share group backend."
msgstr ""
"The share group type defines the characteristics of a share group backend."
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr "The share size cannot be less than the snapshot size (%sGiB)"
msgid "The share type defines the characteristics of a share backend."
msgstr "The share type defines the characteristics of a share backend."
msgid "To add extra-specs use:"
msgstr "To add extra-specs use:"
msgid "To add group-specs use:"
msgstr "To add group-specs use:"
msgid "To add metadata use:"
msgstr "To add metadata use:"
msgid "To unset extra-specs use:"
msgstr "To unset extra-specs use:"
msgid "To unset group-specs use:"
msgstr "To unset group-specs use:"
msgid "To unset metadata use:"
msgstr "To unset metadata use:"
msgid "Total Gibibytes"
msgstr "Total Gibibytes"
msgid "Type"
msgstr "Type"
msgid "Unable to add rule."
msgstr "Unable to add rule."
msgid "Unable to add snapshot rule."
msgstr "Unable to add snapshot rule."
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr "Unable to cancel migration of share %s at this moment."
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "Unable to complete migration of share %s."
msgid "Unable to create security service."
msgstr "Unable to create security service."
msgid "Unable to create share group snapshot."
msgstr "Unable to create share group snapshot."
msgid "Unable to create share group type."
msgstr "Unable to create share group type."
msgid "Unable to create share group."
msgstr "Unable to create share group."
msgid "Unable to create share network."
msgstr "Unable to create share network."
msgid "Unable to create share replica."
msgstr "Unable to create share replica."
msgid "Unable to create share snapshot."
msgstr "Unable to create share snapshot."
msgid "Unable to create share type."
msgstr "Unable to create share type."
msgid "Unable to create share."
msgstr "Unable to create share."
#, python-format
msgid "Unable to create share. %s"
msgstr "Unable to create share. %s"
#, python-format
msgid "Unable to delete replica \"%s\"."
msgstr "Unable to delete replica \"%s\"."
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "Unable to delete rule \"%s\"."
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "Unable to delete share \"%s\". "
#, python-format
msgid ""
"Unable to delete share group snapshot \"%s\". One or more share groups "
"depend on it."
msgstr ""
"Unable to delete share group snapshot \"%s\". One or more share groups "
"depend on it."
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr "Unable to delete snapshot \"%s\". One or more shares depend on it."
#, python-format
msgid "Unable to delete snapshot rule \"%s\"."
msgstr "Unable to delete snapshot rule \"%s\"."
msgid "Unable to extend share."
msgstr "Unable to extend share."
msgid "Unable to get information about share group type access."
msgstr "Unable to get information about share group type access."
msgid "Unable to get information about share type access."
msgstr "Unable to get information about share type access."
msgid "Unable to get list of projects."
msgstr "Unable to get list of projects."
msgid "Unable to get manila default quota."
msgstr "Unable to get Manila default quota."
msgid "Unable to get the security services hosts"
msgstr "Unable to get the security services hosts"
#, python-format
msgid "Unable to get the specified share group '%s' for snapshot creation."
msgstr "Unable to get the specified share group '%s' for snapshot creation."
msgid "Unable to load the specified share group snapshot."
msgstr "Unable to load the specified share group snapshot."
msgid "Unable to load the specified snapshot."
msgstr "Unable to load the specified snapshot."
msgid "Unable to manage share"
msgstr "Unable to manage share"
#, python-format
msgid "Unable to migrate share %s."
msgstr "Unable to migrate share %s."
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr "Unable to obtain progress of migration of share %s at this moment."
#, python-format
msgid "Unable to reset state of replica '%s'."
msgstr "Unable to reset state of replica '%s'."
#, python-format
msgid "Unable to reset status of replica '%s'."
msgstr "Unable to reset status of replica '%s'."
#, python-format
msgid "Unable to reset status of share group '%s'."
msgstr "Unable to reset status of share group '%s'."
#, python-format
msgid "Unable to reset status of share group snapshot '%s'."
msgstr "Unable to reset status of share group snapshot '%s'."
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "Unable to resync replica '%s'."
msgid "Unable to retrieve default share quotas."
msgstr "Unable to retrieve default share quotas."
#, python-format
msgid "Unable to retrieve details of replica %s"
msgstr "Unable to retrieve details of replica %s"
msgid "Unable to retrieve list of projects."
msgstr "Unable to retrieve list of projects."
msgid "Unable to retrieve quotas."
msgstr "Unable to retrieve quotas."
#, python-format
msgid "Unable to retrieve replica '%s'."
msgstr "Unable to retrieve replica '%s'."
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "Unable to retrieve security service '%s' details."
msgid "Unable to retrieve security services"
msgstr "Unable to retrieve security services"
msgid "Unable to retrieve security_service."
msgstr "Unable to retrieve security_service."
msgid "Unable to retrieve share details."
msgstr "Unable to retrieve share details."
#, python-format
msgid "Unable to retrieve share group '%s'."
msgstr "Unable to retrieve share group '%s'."
msgid "Unable to retrieve share group details."
msgstr "Unable to retrieve share group details."
#, python-format
msgid "Unable to retrieve share group snapshot '%s'."
msgstr "Unable to retrieve share group snapshot '%s'."
msgid "Unable to retrieve share group snapshot details."
msgstr "Unable to retrieve share group snapshot details."
msgid "Unable to retrieve share group snapshot list."
msgstr "Unable to retrieve share group snapshot list."
msgid "Unable to retrieve share group snapshot."
msgstr "Unable to retrieve share group snapshot."
msgid "Unable to retrieve share group snapshots."
msgstr "Unable to retrieve share group snapshots."
msgid "Unable to retrieve share group types."
msgstr "Unable to retrieve share group types."
msgid "Unable to retrieve share group."
msgstr "Unable to retrieve share group."
msgid "Unable to retrieve share groups."
msgstr "Unable to retrieve share groups."
msgid "Unable to retrieve share instance details."
msgstr "Unable to retrieve share instance details."
msgid "Unable to retrieve share instances."
msgstr "Unable to retrieve share instances."
msgid "Unable to retrieve share limit information."
msgstr "Unable to retrieve share limit information."
msgid "Unable to retrieve share list."
msgstr "Unable to retrieve share list."
msgid "Unable to retrieve share network details."
msgstr "Unable to retrieve share network details."
msgid "Unable to retrieve share network."
msgstr "Unable to retrieve share network."
msgid "Unable to retrieve share networks"
msgstr "Unable to retrieve share networks"
msgid "Unable to retrieve share quotas."
msgstr "Unable to retrieve share quotas."
msgid "Unable to retrieve share replicas."
msgstr "Unable to retrieve share replicas."
msgid "Unable to retrieve share rules."
msgstr "Unable to retrieve share rules."
msgid "Unable to retrieve share server details."
msgstr "Unable to retrieve share server details."
msgid "Unable to retrieve share servers"
msgstr "Unable to retrieve share servers"
msgid "Unable to retrieve share snapshot list."
msgstr "Unable to retrieve share snapshot list."
msgid "Unable to retrieve share snapshot rules."
msgstr "Unable to retrieve share snapshot rules."
msgid "Unable to retrieve share snapshot."
msgstr "Unable to retrieve share snapshot."
msgid "Unable to retrieve share snapshots list."
msgstr "Unable to retrieve share snapshots list."
msgid "Unable to retrieve share snapshots."
msgstr "Unable to retrieve share snapshots."
msgid "Unable to retrieve share types."
msgstr "Unable to retrieve share types."
msgid "Unable to retrieve share."
msgstr "Unable to retrieve share."
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "Unable to retrieve share. %s"
msgid "Unable to retrieve share_gruop_type."
msgstr "Unable to retrieve share_group_type."
msgid "Unable to retrieve share_type."
msgstr "Unable to retrieve share_type."
msgid "Unable to retrieve snapshot details."
msgstr "Unable to retrieve snapshot details."
msgid "Unable to retrieve snapshot."
msgstr "Unable to retrieve snapshot."
msgid "Unable to retrieve volume details."
msgstr "Unable to retrieve volume details."
msgid "Unable to revert share to the snapshot."
msgstr "Unable to revert share to the snapshot."
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "Unable to set replica '%s' as active."
msgid "Unable to unmanage share."
msgstr "Unable to unmanage share."
#, python-format
msgid "Unable to update access for share group type \"%s\"."
msgstr "Unable to update access for share group type \"%s\"."
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "Unable to update access for share type \"%s\"."
msgid "Unable to update default quotas."
msgstr "Unable to update default quotas."
msgid "Unable to update extra_specs for share type."
msgstr "Unable to update extra_specs for share type."
msgid "Unable to update group_specs for share group type."
msgstr "Unable to update group_specs for share group type."
msgid "Unable to update security service."
msgstr "Unable to update security service."
msgid "Unable to update share group snapshot."
msgstr "Unable to update share group snapshot."
msgid "Unable to update share group type."
msgstr "Unable to update share group type."
msgid "Unable to update share group."
msgstr "Unable to update share group."
msgid "Unable to update share metadata."
msgstr "Unable to update share metadata."
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "Unable to update share network \"%s\"."
msgid "Unable to update share network."
msgstr "Unable to update share network."
msgid "Unable to update share snapshot."
msgstr "Unable to update share snapshot."
msgid "Unable to update share type."
msgstr "Unable to update share type."
msgid "Unable to update share."
msgstr "Unable to update share."
msgid "Unknown"
msgstr "Unknown"
msgid "Unmanage"
msgstr "Unmanage"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "Unmanaged Error"
msgid "Unmanage Share"
msgstr "Unmanage Share"
msgid "Update"
msgstr "Update"
msgid "Update Share Group"
msgstr "Update Share Group"
msgid "Update Share Group Snapshot"
msgstr "Update Share Group Snapshot"
msgid "Update Share Group Type"
msgstr "Update Share Group Type"
msgid "Update Share Network"
msgstr "Update Share Network"
msgid "Update Share Snapshot"
msgstr "Update Share Snapshot"
msgid "Update Share Type"
msgstr "Update Share Type"
msgid "Update Share group Type"
msgstr "Update Share group Type"
msgid "Update share network"
msgstr "Update share network"
msgid "Updated"
msgstr "Updated"
msgid "Updated At"
msgstr "Updated At"
msgid "Updated At:"
msgstr "Updated At:"
#, python-format
msgid "Updated access for share group type \"%s\"."
msgstr "Updated access for share group type \"%s\"."
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "Updated access for share type \"%s\"."
#, python-format
msgid "Updated share network \"%s\"."
msgstr "Updated share network \"%s\"."
#, python-format
msgid "Updating share \"%s\""
msgstr "Updating share \"%s\""
#, python-format
msgid "Updating share group \"%s\""
msgstr "Updating share group \"%s\""
#, python-format
msgid "Updating share group snapshot \"%s\""
msgstr "Updating share group snapshot \"%s\""
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "Updating share metadata \"%s\""
#, python-format
msgid "Updating share network \"%s\""
msgstr "Updating share network \"%s\""
#, python-format
msgid "Updating share snapshot \"%s\""
msgstr "Updating share snapshot \"%s\""
msgid "Use share group snapshot as a source"
msgstr "Use share group snapshot as a source"
msgid "Use snapshot as a source"
msgstr "Use snapshot as a source"
msgid "User"
msgstr "User"
msgid "Visibility"
msgstr "Visibility"
msgid ""
"When a share is \"unmanaged\", the share will no longer be visible within "
"OpenStack. Note that the share will not be deleted.
This is "
"equivalent to the 'manila unmanage' command."
msgstr ""
"When a share is \"unmanaged\", the share will no longer be visible within "
"OpenStack. Note that the share will not be deleted.
This is "
"equivalent to the 'manila unmanage' command."
msgid "Writable"
msgstr "Writable"
msgid "as Active?"
msgstr "as Active?"
msgid "key=value pairs per line can be set"
msgstr "key=value pairs per line can be set"
manila-ui-3.0.0/manila_ui/locale/pt_BR/ 0000775 0001750 0001750 00000000000 13647271736 017633 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/pt_BR/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021420 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/pt_BR/LC_MESSAGES/django.po 0000664 0001750 0001750 00000145304 13647271543 023225 0 ustar zuul zuul 0000000 0000000 # José Mello , 2016. #zanata
# Fernando Pimenta , 2018. #zanata
# Rodrigo Loures , 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-09-16 12:05+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-04-24 07:33+0000\n"
"Last-Translator: Fernando Pimenta \n"
"Language-Team: Portuguese (Brazil)\n"
"Language: pt_BR\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#, python-format
msgid "%(used)s of %(quota)s GiB Used"
msgstr "%(used)s de %(quota)s GiB Utilizado"
#, python-format
msgid "%(used)s of %(quota)s Used"
msgstr "%(used)s de %(quota)s Utilizado"
#, python-format
msgid "%sGiB"
msgstr "%sGiB"
msgid "(Quota exceeded)"
msgstr "(Cota excedida)"
msgid "Access Key"
msgstr "Chave de Acesso"
msgid "Access Level"
msgstr "Nível de Acesso"
msgid "Access Rules"
msgstr "Regras de Acesso"
msgid "Access To"
msgstr "Accesso Para"
msgid "Access Type"
msgstr "Tipo de Acesso"
msgid "Access to"
msgstr "Accesso para"
msgctxt "Current status of share network"
msgid "Active"
msgstr "Ativo"
msgctxt "Current status of share server"
msgid "Active"
msgstr "Ativo"
msgid "Add"
msgstr "Adicionar"
msgid "Add Rule"
msgstr "Adicionar Regra"
msgid "Add Security Service"
msgstr "Adicionar Serviço de segurança"
msgid "Add Share Snapshot Rule"
msgstr "Adicionar Regra de Snapshot de Compartilhamento"
msgid "Add rule"
msgstr "Adicionar regra"
msgid "Add security services to share network."
msgstr "Adicionar serviços de segurança à rede de compartilhamento."
msgid "All keys and values must be in range from 1 to 255."
msgstr "Todas as chaves e valores devem estar no intervalo de 1 a 255"
msgid "All pairs that are in field for left are set for this metadata."
msgstr ""
"Todos os pares que estão no campo à esquerda estão definidos para este tipo "
"de metadado."
msgid "All pairs that are in field for left are set for this share group type."
msgstr ""
"Todos os pares que estão no campo à esquerda estão definidos para este tipo "
"de grupo de compartilhamento."
msgid "All pairs that are in field for left are set for this share type."
msgstr ""
"Todos os pares que estão no campo à esquerda estão definidos para este tipo "
"de compartilhamento."
msgid "Allow project access to share group type."
msgstr "Permite ao projeto acessar tipo de grupo de compartilhamento."
msgid "Allow project access to share type."
msgstr "Permitir ao projeto acesso ao tipo de compartilhamento."
msgid "At least one security service must be specified."
msgstr "Pelo menos um serviço de segurança deve ser especificado."
msgid "At least one share type must be specified."
msgstr "Pelo menos um tipo de compartilhamento deve ser especificado."
msgid "Availability Zone"
msgstr "Zona de Disponibilidade"
msgid "Availability zone"
msgstr "Zona de disponibilidade"
msgctxt "Current status of replica"
msgid "Available"
msgstr "Disponível"
msgctxt "Current status of share"
msgid "Available"
msgstr "Disponível"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "Disponível"
msgid "Available networks"
msgstr "Redes disponíveis"
msgid "Available projects"
msgstr "Projetos disponíveis"
msgid "Available security services"
msgstr "Serviços de segurança disponíveis"
msgid "Cancel"
msgstr "Cancelar"
msgid "Cancel Migration"
msgstr "Cancelar Migração"
msgid "Cancel migration"
msgstr "Cancelar Migração"
msgid "Cancel migration of a Share"
msgstr "Cancelar migração de um Compartilhamento"
msgid "Choose a snapshot"
msgstr "Escolher um snapshot"
msgid "Complete Migration"
msgstr "Completar Migração"
msgid "Complete migration"
msgstr "Completar Migração"
msgid "Complete migration of a Share"
msgstr "Completar migração de um Compartilhamento"
msgid "Confirm Migration Cancelling of Share"
msgstr "Confirmar o Cancelamento da Migração do Compartilhamento"
msgid "Confirm Migration Completion of Share"
msgstr "Confirmar o Término da Migração do Compartilhamento"
msgid "Confirm Obtaining migration progress of Share"
msgstr "Confirmar a Obtenção do progresso da migração do compartilhamento"
msgid "Confirm Password"
msgstr "Confirmar Senha"
msgid "Confirm Unmanage Share"
msgstr "Confirmar Remoção de Gerenciamento de Compartilhamento"
msgid "Create"
msgstr "Criar"
msgid "Create Group Share Type"
msgstr "Criar Tipo de Grupo de Compartilhamento."
msgid "Create Replica"
msgstr "Criar Réplica"
msgid "Create Security Service"
msgstr "Criar Serviço de segurança"
msgid "Create Share"
msgstr "Criar Compartilhamento"
msgid "Create Share Group"
msgstr "Criar Grupo de Compartilhamento"
msgid "Create Share Group Snapshot"
msgstr "Criar Snapshot do Grupo de Compartilhamento"
msgid "Create Share Group Type"
msgstr "Criar Tipo de Grupo de Compartilhamento"
msgid "Create Share Network"
msgstr "Criar Rede de Compartilhamento"
msgid "Create Share Replica"
msgstr "Criar Réplica de Compartilhamento"
msgid "Create Share Snapshot"
msgstr "Criar Snapshot do Compartilhamento"
msgid "Create Share Type"
msgstr "Criar Tipo de Compartilhamento"
msgid "Create a Share"
msgstr "Criar um Compartilhamento"
msgid "Create share replica in specific availability zone."
msgstr ""
"Criar réplica de compartilhamento na zona de disponibilidade especificada."
msgid "Created"
msgstr "Criado"
msgid "Created At"
msgstr "Criado Em"
msgid "Created at"
msgstr "Criado em"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "Criando"
msgctxt "Current status of share"
msgid "Creating"
msgstr "Criando"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "Criando"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "Criando"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "Criando réplica para compartilhamento \"%s\"."
#, python-format
msgid "Creating rule for \"%s\""
msgstr "Criando regra para \"%s\""
#, python-format
msgid "Creating share \"%s\""
msgstr "Criando compartilhamento \"%s\""
#, python-format
msgid "Creating share group \"%s\""
msgstr "Criando grupo de compartilhamento \"%s\""
#, python-format
msgid "Creating share group snapshot \"%s\"."
msgstr "Criando snapshot de grupo de compartilhamento \"%s\"."
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "Criando snapshot do compartilhamento \"%s\"."
#, python-format
msgid "Creating snapshot rule for \"%s\""
msgstr "Criando regra de snapshot para \"%s\""
msgid "Current Size (GiB)"
msgstr "Tamanho Atual (GiB)"
msgid "DNS IP"
msgstr "IP DNS"
msgid "Delete Replica"
msgid_plural "Delete Replicas"
msgstr[0] "Excluir Réplica"
msgstr[1] "Excluir Réplicas"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Excluir Regra"
msgstr[1] "Excluir Regras"
msgid "Delete Security Service"
msgid_plural "Delete Security Services"
msgstr[0] "Excluir Serviço de Segurança"
msgstr[1] "Excluir Serviços de Segurança"
msgid "Delete Share"
msgid_plural "Delete Shares"
msgstr[0] "Excluir Compartilhamento"
msgstr[1] "Excluir Compartilhamentos"
msgid "Delete Share Group"
msgid_plural "Delete Share Groups"
msgstr[0] "Excluir Grupo de Compartilhamento"
msgstr[1] "Excluir Grupos de Compartilhamento"
msgid "Delete Share Group Snapshot"
msgid_plural "Delete Share Group Snapshots"
msgstr[0] "Excluir Snapshot de Grupo de Compartilhamento"
msgstr[1] "Excluir Snapshots de Grupo de Compartilhamento"
msgid "Delete Share Group Type"
msgid_plural "Delete Share Group Types"
msgstr[0] "Excluir Tipo de Grupo de Compartilhamento"
msgstr[1] "Excluir Tipos de Grupo de Compartilhamento"
msgid "Delete Share Network"
msgid_plural "Delete Share Networks"
msgstr[0] "Excluir Rede de Compartilhamento"
msgstr[1] "Excluir Redes de Compartilhamento"
msgid "Delete Share Server"
msgid_plural "Delete Share Server"
msgstr[0] "Excluir Servidor de Compartilhamento"
msgstr[1] " Excluir Servidor de Compartilhamento"
msgid "Delete Share Snapshot"
msgid_plural "Delete Share Snapshots"
msgstr[0] "Excluir Snapshot de Compartilhamento"
msgstr[1] "Excluir Snapshots de Compartilhamento"
msgid "Delete Share Snapshot Rule"
msgid_plural "Delete Share Snapshot Rules"
msgstr[0] "Excluir Regra de Snapshot de Compartilhamento"
msgstr[1] "Excluir Regras de Snapshot de Compartilhamento"
msgid "Delete Share Type"
msgid_plural "Delete Share Types"
msgstr[0] "Excluir Tipo de Compartilhamento"
msgstr[1] "Excluir Tipos de Compartilhamento"
msgid "Delete Snapshot"
msgid_plural "Delete Snapshots"
msgstr[0] "Excluir Snapshot"
msgstr[1] "Excluir Snapshots"
msgid "Deleted Replica"
msgid_plural "Deleted Replicas"
msgstr[0] "Réplica Excluída"
msgstr[1] "Réplicas Excluídas"
msgid "Deleted Rule"
msgid_plural "Deleted Rules"
msgstr[0] "Regra Excluída"
msgstr[1] "Regras Excluídas"
msgid "Deleted Security Service"
msgid_plural "Deleted Security Services"
msgstr[0] "Serviço de Segurança Excluído"
msgstr[1] "Serviços de Segurança Excluídos"
msgid "Deleted Share"
msgid_plural "Deleted Shares"
msgstr[0] "Compartilhamento Excluído"
msgstr[1] "Compartilhamentos Excluídos"
msgid "Deleted Share Group"
msgid_plural "Deleted Share Groups"
msgstr[0] "Grupo de Compartilhamento Excluído"
msgstr[1] "Grupos de Compartilhamento Excluídos"
msgid "Deleted Share Group Snapshot"
msgid_plural "Deleted Share Group Snapshots"
msgstr[0] "Snapshot de Grupo de Compartilhamento Excluído"
msgstr[1] "Snapshots de Grupo de Compartilhamento Excluídos"
msgid "Deleted Share Group Type"
msgid_plural "Deleted Share Group Types"
msgstr[0] "Tipo de Grupo de Compartilhamento Excluído"
msgstr[1] "Tipos de Grupo de Compartilhamento Excluídos"
msgid "Deleted Share Network"
msgid_plural "Deleted Share Networks"
msgstr[0] "Rede de Compartilhamento Excluída"
msgstr[1] "Redes de Compartilhamento Excluídas"
msgid "Deleted Share Server"
msgid_plural "Deleted Share Server"
msgstr[0] " Servidor de Compartilhamento Excluído"
msgstr[1] " Servidor de Compartilhamento Excluído"
msgid "Deleted Share Snapshot"
msgid_plural "Deleted Share Snapshots"
msgstr[0] "Snapshot de Compartilhamento Excluído"
msgstr[1] "Snapshots de Compartilhamento Excluídos"
msgid "Deleted Share Snapshot Rule"
msgid_plural "Deleted Share Snapshot Rules"
msgstr[0] "Regra de Snapshot de Compartilhamento Excluída"
msgstr[1] "Regras de Snapshot de Compartilhamento Excluídas"
msgid "Deleted Share Type"
msgid_plural "Deleted Share Types"
msgstr[0] "Tipo de Compartilhamento Excluído"
msgstr[1] "Tipos de Compartilhamento Excluídos"
msgid "Deleted Snapshot"
msgid_plural "Deleted Snapshots"
msgstr[0] "Snapshot Excluído"
msgstr[1] "Snapshots Excluídos"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "Excluindo"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "Excluindo"
msgid "Description"
msgstr "Descrição"
msgid "Description:"
msgstr "Descrição:"
msgid "Destination host and pool where share will be migrated to."
msgstr "Host de destino e pool para onde o compartilhamento será migrado."
msgid "Domain"
msgstr "Domínio"
msgid "Driver handles share servers"
msgstr "Driver gerencia servidores de compartilhamento"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "Opções do driver ('volume_id' para driver genérico, etc...)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "Chaves duplicadas '%s'."
msgid "Edit"
msgstr "Editar"
msgid "Edit Security Service"
msgstr "Editar Serviço de segurança"
msgid "Edit Share"
msgstr "Editar Compartilhamento"
msgid "Edit Share Metadata"
msgstr "Editar Metadados do Compartilhamento"
msgid "Edit Share Network"
msgstr "Editar Rede de Compartilhamento"
msgid "Edit Share Snapshot"
msgstr "Editar Snapshot de Compartilhamento"
msgid "Edit Share network"
msgstr "Editar Rede de Compartilhamento"
msgid ""
"Enforces migration of the share snapshots to the destination. If set to "
"True, host-assisted migration will not be attempted."
msgstr ""
"Força a migração dos snapshots de compartilhamento para o destino. Se "
"definido para True, a migração host-assisted não será tentada."
msgid ""
"Enforces migration to be nondisruptive. If set to True, host-assisted "
"migration will not be attempted."
msgstr ""
"Força a migração a não ser disruptiva. Se definido para True, a migração "
"host-assisted não será tentada."
msgid ""
"Enforces migration to keep the share writable while contents are being "
"moved. If set to True, host-assisted migration will not be attempted."
msgstr ""
"Força a migração a manter o compartilhamento gravável enquanto o conteúdo "
"estiver sendo movido. Se definido para True, a migração host-assisted não "
"será tentada."
msgid ""
"Enforces migration to preserve all file metadata when moving its contents. "
"If set to True, host-assisted migration will not be attempted."
msgstr ""
"Força a migração a preservar todo o metadado de arquivo enquanto move seu "
"conteúdo. Se definido para True a migração host-assisted não sera tentada."
msgid ""
"Enforces the use of the host-assisted migration approach, which bypasses "
"driver optimizations."
msgstr ""
"Força a utilização da abordagem host-assisted, que ignora otimizações do "
"driver."
msgctxt "Current status of replica"
msgid "Error"
msgstr "Erro"
msgctxt "Current status of share"
msgid "Error"
msgstr "Erro"
msgctxt "Current status of share network"
msgid "Error"
msgstr "Erro"
msgctxt "Current status of share server"
msgid "Error"
msgstr "Erro"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "Erro"
msgid "Expected only pairs of key=value."
msgstr "Esperados apenas pares de chave=valor."
msgid "Export location"
msgstr "Localização do Export"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr ""
"Exportar o local do compartilhamento. Exemplo para NFS:1.2.3.4:/caminho/para/"
"compartilhamento"
msgid "Export locations"
msgstr "Exportar localizações"
msgid "Extend"
msgstr "Estender"
msgid "Extend Share"
msgstr "Estender Compartilhamento"
#, python-format
msgid "Extend share \"%s\""
msgstr "Estender o compartilhamento \"%s\""
msgid "Extend the size of a share. "
msgstr "Estender o tamanho de um compartilhamento."
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "Erro estendendo"
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"A especificação extra 'driver_handles_share_servers' é necessária e deve ter "
"um valor booleano."
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"A especificação extra 'driver_handles_share_servers' é necessária e deve ter "
"um valor booleano."
msgid "Extra specs"
msgstr "Especificações extras"
msgid "Force Host Assisted Migration"
msgstr "Forçar Migração Assistida do Host"
msgid "From here you can modify name and description of a security service."
msgstr "Aqui você modificar o nome e a descrição de um serviço de segurança."
msgid ""
"From here you can modify name and description of a share group snapshot."
msgstr ""
"Aqui você pode modificar o nome e a descrição de um snapshot de grupo de "
"compartilhamento."
msgid "From here you can modify name and description of a share network."
msgstr ""
"Aqui você pode modificar o nome e a descrição de uma rede de "
"compartilhamento."
msgid "From here you can modify name and description of a snapshot."
msgstr "Aqui você pode modificar o nome e a descrição de um snapshot."
msgid ""
"From here you can modify name, description and visibility of a share group."
msgstr ""
"Aqui você pode modificar o nome, a descrição e a visibilidade de um grupo de "
"compartilhamento."
msgid "From here you can modify name, description and visibility of a share."
msgstr ""
"Aqui você pode modificar o nome, a descrição e a visibilidade do "
"compartilhamento."
msgid "From here you can revert the share to its latest snapshot."
msgstr "Aqui você pode reverter o compartilhamento para o seu último snapshot."
msgid "From here you can update share network info. "
msgstr "Aqui você pode atualizar as informações da rede de compartilhamento."
msgid "From here you can update the default share quotas (max limits)."
msgstr ""
"Aqui você pode atualizar a quota de compartilhamento padrão (limites "
"máximos)."
msgid "Get Migration Progress"
msgstr "Obter o Progresso da Migração"
msgid "Get migration progress"
msgstr "Obter progresso da migração"
msgid "GiB"
msgstr "GiB"
msgid ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgstr ""
"Encontrado valor impróprio para o campo 'driver_options'. Esperados apenas "
"pares de chave=valor."
msgid "Group specs"
msgstr "Especificações do Grupo"
msgid "Here can be modified extra-specs for share type."
msgstr ""
"Aqui podem ser modificadas as extra-specs para o tipo de compartilhamento."
msgid "Here can be modified group-specs for share group type."
msgstr ""
"Aqui pode ser modificado o group-specs para o tipo de grupo de "
"compartilhamento."
msgid "Host"
msgstr "Host"
msgid "Host of share"
msgstr "Host do compartilhamento"
msgid "Host to migrate share"
msgstr "Host para migrar o compartilhamento"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr ""
"Host onde o compartilhamento está localizado, exemplo: algum."
"host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "Versão do IP"
msgid "Id"
msgstr "Id"
#, python-format
msgid ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgstr ""
"Valor incorreto configurado para as especificações extras exigidas "
"'spec_driver_handles_share_servers'. Valores permitidos são %s. Case "
"insensitive."
msgctxt "Current status of share server"
msgid "In-use"
msgstr "Em uso"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "Em uso"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "Inativo"
#, python-format
msgid "Key '%s' has improper length."
msgstr "Chave '%s' possui tamanho impróprio."
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "Chave não pode conter espaços. Veja string '%s'."
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "Chaves não devem conter espaços. Erro em '%s'."
msgid "Limit"
msgstr "Limite"
msgid "Make visible for all"
msgstr "Tornar visível para todos"
msgid "Manage"
msgstr "Gerenciar"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "Erro no Gerenciamento"
msgid "Manage Replicas"
msgstr "Gerenciar Réplicas"
msgid "Manage Rules"
msgstr "Gerenciar regras"
msgid "Manage Share"
msgstr "Gerenciar Compartilhamento"
msgid "Manage Share Group Type Access"
msgstr "Gerenciar Acesso do Tipo de Grupo de Compartilhamento"
msgid "Manage Share Snapshot Rules"
msgstr "Gerenciar Regras de Snapshot de Compartilhamento"
msgid "Manage Share Type Access"
msgstr "Gerenciar Acesso do Tipo de Compartilhamento"
msgid "Metadata"
msgstr "Metadado"
msgid "Migrate Share"
msgstr "Migrar Compartilhamento"
msgid "Migrate a Share"
msgstr "Migrar um Compartilhamento"
msgctxt "Current status of share"
msgid "Migrating"
msgstr "Migrando"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "Migrando para"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "A migração do compartilhamento %(name)s está em %(progress)s porcento."
msgid "Mount snapshot support"
msgstr "Suporte à montagem de snapshot"
msgid "Name"
msgstr "Nome"
msgid "Net Details"
msgstr "Detalhes da Rede"
msgid "Network"
msgstr "Rede"
msgid "Network Type"
msgstr "Tipo de Rede"
msgid "Networks"
msgstr "Redes"
msgid "Neutron Net"
msgstr "Rede Neutron"
msgid "Neutron Subnet"
msgstr "Sub-rede Neutron."
msgid "New Size (GiB)"
msgstr "Novo Tamanho (GiB)"
msgid "New share network to be set in migrated share"
msgstr ""
"Nova rede de compartilhamento a ser configurada no compartilhamento migrado"
msgid "New share type to be set in migrating share"
msgstr ""
"Novo tipo de compartilhamento a ser configurado no compartilhamento de "
"migração."
msgid "New size must be greater than current size."
msgstr "O novo tamanho deve ser maior do que o tamanho atual."
msgid "No projects found."
msgstr "Nenhum projeto encontrado."
msgid "No projects selected."
msgstr "Nenhum projeto selecionado."
msgid "No security services found."
msgstr "Nenhum serviço de segurança foi encontrado."
msgid "No security services selected."
msgstr "Nenhum serviço de segurança foi selecionado."
msgid "No source, empty share"
msgstr "Sem origem, compartilhamento vazio"
msgid "No source, empty share group"
msgstr "Nenhuma origem, grupo de compartilhamento vazio"
msgid "Nondisruptive"
msgstr "Não disruptivo"
msgid "Nova Net"
msgstr "Rede Nova"
msgid "Number of Share Snapshots"
msgstr "Número de Snapshots de Compartilhamento"
msgid "Number of Shares"
msgstr "Número de Compartilhamentos"
msgid "Obtain Progress"
msgstr "Obter Progresso"
msgid "Obtain migration progress of a Share"
msgstr "Obter progresso da migração de um Compartilhamento"
msgid "One line - one action. Empty strings will be ignored."
msgstr "Uma linha - uma ação. Sequências vazias serão ignoradas."
msgid "Overview"
msgstr "Visão Geral"
msgid "Password"
msgstr "Senha"
msgid "Passwords do not match."
msgstr "As senhas não correspondem."
msgid "Preserve Metadata"
msgstr "Preservar Metadados"
msgid "Preserve Snapshots"
msgstr "Preservar Snapshots"
msgid "Project"
msgstr "Projeto"
msgid "Projects with access to share group type"
msgstr "Projetos com acesso a tipo de grupo de compartilhamento"
msgid "Projects with access to share type"
msgstr "Projetos com acesso a tipo de compartilhamento"
msgid "Protocol"
msgstr "Protocolo"
msgid "Public"
msgstr "Público"
msgid "Quota Name"
msgstr "Nome da Quota"
msgid "Replica Details"
msgstr "Detalhes da Réplica"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "Detalhes da Réplica: %(replica_display_name)s"
msgid "Replica State"
msgstr "Estado da Réplica"
msgid "Replica state"
msgstr "Estado da Réplica"
msgid "Replicas"
msgstr "Réplicas"
msgid "Reset Replica State"
msgstr "Resetar o Estado da Réplica"
msgid "Reset Replica Status"
msgstr "Resetar o Status da Réplica"
msgid "Reset Share Group Snapshot Status"
msgstr "Redefinir o Status do Snapshot do Grupo de Compartilhamento"
msgid "Reset Share Group Status"
msgstr "Redefinir o Status do Grupo de Compartilhamento"
msgid "Reset Status"
msgstr "Redefinir Status"
msgid "Reset replica state"
msgstr "Resincronizar estado da réplica"
msgid "Reset replica status"
msgstr "Resetar o status da réplica"
msgid "Reset share replica's state with ID"
msgstr "Resetar o estado da réplica de compartilhamento com ID"
msgid "Reset share replica's status with ID"
msgstr "Resetar o status da réplica de compartilhamento com ID"
msgid "Reset state"
msgstr "Redefinir estado"
msgid "Reset status"
msgstr "Redefinir status"
#, python-format
msgid "Reseting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
msgstr "Resetando o estado da réplica ('%(id)s') de '%(from)s' para '%(to)s'. "
#, python-format
msgid "Reseting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "Resetando o status da réplica ('%(id)s') de '%(from)s' para '%(to)s'. "
#, python-format
msgid "Reseting share group ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Redefinindo o status do grupo de compartilhamento ('%(id)s') de '%(from)s' "
"para '%(to)s'."
#, python-format
msgid ""
"Reseting share group snapshot ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Redefinindo o status do snapshot do grupo de compartilhamento ('%(id)s') de "
"'%(from)s' para '%(to)s'."
msgid "Resync"
msgstr "Resincronizar"
msgid "Resync Replica"
msgstr "Ressincronizar Réplica"
msgid "Resync replica"
msgstr "Resincronizar réplica"
msgid "Resync share replica with ID"
msgstr "Ressincronizar réplica de compartilhamento com ID"
#, python-format
msgid "Resync'ing replica '%s'"
msgstr "Ressincronizando réplica '%s'"
msgid "Revert Share"
msgstr "Reverter Compartilhamento"
msgid "Revert Share to a Snapshot"
msgstr "Reverter Compartilhamento para um Snapshot"
msgid "Revert share to a snapshot"
msgstr "Reverter compartilhamento para um snapshot"
msgctxt "Current status of share"
msgid "Reverting Error"
msgstr "Reversão de Erro"
msgid "Rules"
msgstr "Regras"
msgid "Save Changes"
msgstr "Salvar Alterações"
msgid "Security Service Details"
msgstr "Detalhes do Serviço de Segurança"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "Detalhes do Serviço de Segurança: %(service_display_name)s"
msgid "Security Service Overview"
msgstr "Visão Geral do Serviço de Segurança"
msgid "Security Services"
msgstr "Serviços de segurança"
msgid "Security services within share network"
msgstr "Serviços de segurança dentro da rede de compartilhamento"
msgid "Segmentation Id"
msgstr "ID de Segmentação"
msgid "Select parameters of share group you want to create. "
msgstr ""
"Selecionar parâmetros do grupo de compartilhamento que você deseja criar."
msgid "Select parameters of share you want to create. "
msgstr "Selecionar parâmetros de compartilhamento que você deseja criar."
msgid "Selected Networks"
msgstr "Redes Selecionadas"
msgid "Selected Projects"
msgstr "Projetos Selecionados."
msgid "Selected projects"
msgstr "Projetos selecionados"
msgid "Selected security services"
msgstr "Serviços de segurança selecionados"
msgid "Server"
msgstr "Servidor"
msgid "Set Replica as Active"
msgstr "Definir Réplica como Ativa"
msgid "Set as Active"
msgstr "Definir como Ativo"
msgid "Set maximum quotas for the project."
msgstr "Defina o valor máximo para as cotas do projeto."
msgid "Set share replica with ID"
msgstr "Definir réplica de compartilhamento com ID"
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "Definindo réplica \"%s\" como ativa..."
msgid "Share"
msgstr "Compartilhamento"
#, python-format
msgid "Share \"%(s)s\" has been reverted to \"%(ss)s\" snapshot successfully"
msgstr ""
"O compartilhamento \"%(s)s\" foi revertido com sucesso para snapshot \"%(ss)s"
"\""
msgid "Share Details"
msgstr "Detalhes do Compartilhamento"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "Detalhes do Compartilhamento: %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "Detalhes do Compartilhamento: %(share_name)s"
msgid "Share Group"
msgstr "Grupo de Compartilhamento"
msgid "Share Group Details"
msgstr "Detalhes do Grupo de Compartilhamento"
#, python-format
msgid "Share Group Details: %s"
msgstr "Detalhes do Grupo de Compartilhamento:%s"
msgid "Share Group Name"
msgstr "Nome do Grupo de Compartilhamento"
msgid "Share Group Overview"
msgstr "Visão Geral de Grupo de Compartilhamento"
msgid "Share Group Snapshot"
msgstr "Snapshot de Grupo de Compartilhamento"
msgid "Share Group Snapshot Details"
msgstr "Detalhes do Snapshot do Grupo de Compartilhamento"
#, python-format
msgid "Share Group Snapshot Details: %(sgs_display_name)s"
msgstr ""
"Detalhes do Snapshot do Grupo de Compartilhamento: %(sgs_display_name)s"
msgid "Share Group Snapshot Overview"
msgstr "Visão Geral de Snapshot de Grupo de Compartilhamento"
msgid "Share Group Snapshots"
msgstr "Snapshots de Grupo de Compartilhamento"
msgid "Share Group Type"
msgstr "Tipo do Grupo de Compartilhamento"
msgid "Share Group Types"
msgstr "Tipos de Grupo de Compartilhamento"
msgid "Share Groups"
msgstr "Grupos de Compartilhamento"
msgid "Share ID"
msgstr "ID do Compartilhamento"
msgid "Share Instance Details"
msgstr "Detalhes da Instância de Compartilhamento"
#, python-format
msgid "Share Instance Details: %s"
msgstr "Detalhes da Instância de Compartilhamento: %s"
msgid "Share Instance Overview"
msgstr "Visão Geral de Instância de Compartilhamento"
msgid "Share Instances"
msgstr "Instâncias de Compartilhamento"
msgid "Share Limits"
msgstr "Limites de Compartilhamento"
msgid "Share Name"
msgstr "Nome do Compartilhamento"
msgid "Share Network"
msgstr "Rede de Compartilhamento"
msgid "Share Network Details"
msgstr "Detalhes da Rede de Compartilhamento"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "Detalhes da Rede de Compartilhamento: %(network_display_name)s"
msgid "Share Network Info"
msgstr "Informação da Rede de Compartilhamento"
msgid "Share Network Overview"
msgstr "Visão Geral da Rede de Compartilhamento"
msgid "Share Networks"
msgstr "Redes de Compartilhamento"
msgid "Share Overview"
msgstr "Visão Geral do Compartilhamento"
msgid "Share Protocol"
msgstr "Protocolo de Compartilhamento"
msgid "Share Quotas"
msgstr "Quotas de Compartilhamento"
msgid "Share Replica Overview"
msgstr "Visão Geral de Réplica de Compartilhamento"
msgid "Share Replicas"
msgstr "Réplicas de Compartilhamento"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr "Réplicas de Compartilhamento: %(share_display_name)s"
msgid "Share Rules"
msgstr "Regras de Compartilhamento"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "Regras do Compartilhamento: %(share_display_name)s"
msgid "Share Server"
msgstr "Servidor de Compartilhamento"
msgid "Share Server Details"
msgstr "Detalhes do Servidor de Compartilhamento"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "Detalhes do Servidor de Compartilhamento: %(server_name)s"
msgid "Share Server Id"
msgstr "ID do Servidor de Compartilhamento"
msgid "Share Server Overview"
msgstr "Visão Geral de Servidor de Compartilhamento"
msgid "Share Servers"
msgstr "Servidores de Compartilhamento"
msgid "Share Snapshot Details"
msgstr "Detalhes do Snapshot de Compartilhamento"
msgid "Share Snapshot Name"
msgstr "Nome do Snapshot de Compartilhamento"
msgid "Share Snapshot Overview"
msgstr "Visão Geral de Snapshot de Compartilhamento"
msgid "Share Snapshot Rules"
msgstr "Regras de Snapshot de Compartilhamento"
msgid "Share Snapshots"
msgstr "Snapshots do Compartilhamento"
msgid "Share Snapshots Storage"
msgstr "Armazenamento de Snapshots do Compartilhamento"
msgid ""
"Share Snapshots are used for storing share changes and creating shares. "
msgstr ""
"Snapshots de Compartilhamento são usados para armazenamento de mudanças de "
"compartilhamento e criação de compartilhamentos."
msgid "Share Source"
msgstr "Origem do Compartilhamento"
msgid "Share Storage"
msgstr "Armazenamento do Compartilhamento"
msgid "Share Type"
msgstr "Tipo de Compartilhamento"
msgid "Share Types"
msgstr "Tipos de Compartilhamento"
msgid "Share Types (multiple available)"
msgstr "Tipos de Compartilhamento (vários disponíveis)"
msgid "Share Types (one available)"
msgstr "Tipos de Compartilhamento (um disponível)"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"O compartilhamento não pode ser estendido a %(req)iGiB porque você tem "
"apenas %(avail)iGiB da sua cota disponível."
msgid "Share gigabytes"
msgstr "Gigabytes de Compartilhamento"
msgid "Share name to be assigned"
msgstr "Nome do compartilhamento a ser atribuído"
msgid "Share network"
msgstr "Rede de compartilhamento"
#, python-format
msgid "Share replica %s has been deleted."
msgstr "Réplica compartilhada %s foi excluída."
msgid "Share server"
msgstr "Servidor de compartilhamento"
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr ""
"O tamanho do compartilhamento deve ser igual ou maior do que o tamanho do "
"snapshot (%sGiB)"
msgid "Share snapshot gigabytes"
msgstr "Gigabytes de snapshot de compartilhamento"
msgid "Share snapshots"
msgstr "Snapshots de compartilhamento"
msgid "Share type"
msgstr "Tipo de Compartilhamento"
msgid "Share types"
msgstr "Tipos de Compartilhamento"
msgid "Shared Quotas"
msgstr "Quotas Compartilhadas"
msgid "Shares"
msgstr "Compartilhamentos"
msgid "Shares Networks"
msgstr "Redes de Compartilhamentos"
msgid "Shares on this server"
msgstr "Compartilhamentos neste servidor"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "Tamanho"
msgid "Size (GiB)"
msgstr "Tamanho (GiB)"
msgid "Snapshot"
msgstr "Snapshot"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "Detalhes do Snapshot: %(snapshot_display_name)s"
msgid "Snapshot ID"
msgstr "ID do SnapShot"
msgid "Snapshot Overview"
msgstr "Visão Geral de Snapshot"
#, python-format
msgid "Snapshot Rules: %(snapshot_display_name)s"
msgstr "Regras de Snapshot: %(snapshot_display_name)s"
msgid "Source"
msgstr "Origem"
msgid "Source SG Snapshot"
msgstr "Snapshot de Origem do Grupo de Compartilhamento"
msgid "Source Share Group"
msgstr "Grupo de Compartilhamento Fonte"
msgid "Source Share Group Snapshot"
msgstr "Snapshot de Origem do Grupo de Compartilhamento"
msgid "Source Type"
msgstr "Tipo de Origem"
msgid "Source share group snapshot"
msgstr "Snapshot fonte do grupo de compartilhamento"
msgid ""
"Specify the new share network for the share. Do not specify this parameter "
"if the migrating share has to be retained within its current share network."
msgstr ""
"Especifique a nova rede de compartilhamento para o compartilhamento. Não "
"especifique esse parâmetro se o compartilhamento de migração tiver que ser "
"retido na sua rede de compartilhamento atual."
msgid ""
"Specify the new share type for the share. Do not specify this parameter if "
"the migrating share has to be retained with its current share type."
msgstr ""
"Especifique o novo de tipo de compartilhamento para o compartilhamento. Não "
"especifique esse parâmetro se o compartilhamento de migração tiver que ser "
"retido com seu tipo de compartilhamento atual."
msgid "Specs"
msgstr "Especificações"
msgid "Start migration"
msgstr "Iniciar migração"
msgid "Status"
msgstr "Status"
msgid "Submit"
msgstr "Enviar"
msgid "Subnet"
msgstr "Sub-rede"
#, python-format
msgid "Successfully created security service: %s"
msgstr "Serviço de segurança criado com sucesso: %s"
#, python-format
msgid "Successfully created share group type: %s"
msgstr "Tipo de grupo de compartilhamento criado com sucesso: %s"
#, python-format
msgid "Successfully created share network: %s"
msgstr "Rede de compartilhamento criada com sucesso: %s"
#, python-format
msgid "Successfully created share type: %s"
msgstr "Tipo de compartilhamento criado com sucesso: %s"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr ""
"Enviada com sucesso a requisição de cancelamento da migração do "
"compartilhamento: %s."
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr ""
"Enviada com sucesso a requisição para completar a migração do "
"compartilhamento: %s."
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "Enviada com sucesso a requisição para gerenciar o compartilhamento: %s"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "Enviada com sucesso a requisição para migrar o compartilhamento: %s."
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr ""
"Solicitação enviada com sucesso para tornar o compartilhamento não "
"gerenciado: %s"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr ""
"Atualizadas com sucesso as especificações extras para o tipo de "
"compartilhamento '%s'."
#, python-format
msgid "Successfully updated group specs for share group type '%s'."
msgstr ""
"Especificações de grupo atualizadas com sucesso para o tipo de grupo de "
"compartilhamento '%s'."
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "Serviço de segurança \"%s\" atualizado com sucesso "
msgid "Task state"
msgstr "Estado da tarefa"
msgid ""
"The share group type defines the characteristics of a share group backend."
msgstr ""
"O tipo de grupo de compartilhamento define as características do backend de "
"um grupo de compartilhamento."
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr ""
"O tamanho do compartilhamento não pode ser menor que o tamanho do snapshot "
"(%sGiB)"
msgid "The share type defines the characteristics of a share backend."
msgstr ""
"O tipo de compartilhamento define as características de um backend de "
"compartilhamento."
msgid "To add extra-specs use:"
msgstr "Para adicionar extra-specs utilize:"
msgid "To add group-specs use:"
msgstr "Para adicionar group-specs utilize:"
msgid "To add metadata use:"
msgstr "Para adicionar metadados utilize:"
msgid "To unset extra-specs use:"
msgstr "Para desconfigurar as extra-specs utilize:"
msgid "To unset group-specs use:"
msgstr "Para desconfigurar group-specs use:"
msgid "To unset metadata use:"
msgstr "Para desconfigurar os metadados utilize:"
msgid "Total Gibibytes"
msgstr "Total de Gibibytes"
msgid "Type"
msgstr "Tipo"
msgid "Unable to add rule."
msgstr "Não foi possível adicionar a regra."
msgid "Unable to add snapshot rule."
msgstr "Não é possível adicionar regra de snapshot."
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr ""
"Não foi possível cancelar migração do compartilhamento %s neste momento."
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "Não é possível completar a migração do compartilhamento %s."
msgid "Unable to create security service."
msgstr "Não foi possível criar o serviço de segurança: %s"
msgid "Unable to create share group snapshot."
msgstr "Não é possível criar snapshot de grupo de compartilhamento."
msgid "Unable to create share group type."
msgstr "Não é possível criar o tipo de grupo de compartilhamento."
msgid "Unable to create share group."
msgstr "Não é possível criar o grupo de compartilhamento."
msgid "Unable to create share network."
msgstr "Não é possível criar a rede de compartilhamento."
msgid "Unable to create share replica."
msgstr "Não é possível criar réplica de compartilhamento."
msgid "Unable to create share snapshot."
msgstr "Não foi possível criar um snapshot do compartilhamento."
msgid "Unable to create share type."
msgstr "Não é possível criar tipo de compartilhamento."
msgid "Unable to create share."
msgstr "Não foi possível criar o compartilhamento."
#, python-format
msgid "Unable to create share. %s"
msgstr "Não é possível criar compartilhamento. %s"
#, python-format
msgid "Unable to delete replica \"%s\"."
msgstr "Não é possível excluir a réplica \"%s\"."
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "Não foi possível excluir regra \"%s\"."
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "Não é possível excluir o compartilhamento \"%s\"."
#, python-format
msgid ""
"Unable to delete share group snapshot \"%s\". One or more share groups "
"depend on it."
msgstr ""
"Não é possível excluir o snapshot do grupo de compartilhamento \"%s\". Um ou "
"mais grupos de compartilhamento dependem dele."
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr ""
"Não é possível excluir o snapshot \"%s\". um ou mais compartilhamentos "
"dependem dele."
#, python-format
msgid "Unable to delete snapshot rule \"%s\"."
msgstr "Não é possível excluir regra de snapshot \"%s\"."
msgid "Unable to extend share."
msgstr "Não foi possível estender o compartilhamento."
msgid "Unable to get information about share group type access."
msgstr ""
"Não é possível obter informações sobre o acesso dos tipos de grupo de "
"compartilhamento."
msgid "Unable to get information about share type access."
msgstr ""
"Não é possível obter informações sobre o acesso do tipo de compartilhamento."
msgid "Unable to get list of projects."
msgstr "Não é possível recuperar lista de projetos."
msgid "Unable to get manila default quota."
msgstr "Não é possível obter a quota padrão do manila."
msgid "Unable to get the security services hosts"
msgstr "Não é possível obter os hosts de serviços de segurança"
#, python-format
msgid "Unable to get the specified share group '%s' for snapshot creation."
msgstr ""
"Não é possível obter o grupo de compartilhamento especificado '%s' para a "
"criação do snapshot."
msgid "Unable to load the specified share group snapshot."
msgstr ""
"Não é possível carregar o snapshot de grupo de compartilhamento especificado."
msgid "Unable to load the specified snapshot."
msgstr "Não é possível carregar o snapshot especificado."
msgid "Unable to manage share"
msgstr "Não foi possível gerenciar o compartilhamento"
#, python-format
msgid "Unable to migrate share %s."
msgstr "Não foi possível migrar compartilhamento %s."
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr ""
"Não é possível obter o progresso da migração do compartilhamento %s nesse "
"momento."
#, python-format
msgid "Unable to reset state of replica '%s'."
msgstr "Não é possível resetar o estado da réplica '%s'."
#, python-format
msgid "Unable to reset status of replica '%s'."
msgstr "Não é possível resetar o status da réplica '%s'."
#, python-format
msgid "Unable to reset status of share group '%s'."
msgstr "Não e possível redefinir o status do grupo de compartilhamento '%s'."
#, python-format
msgid "Unable to reset status of share group snapshot '%s'."
msgstr ""
"Não é possível redefinir o status do snapshot do grupo de compartilhamento "
"'%s'."
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "Não é possível ressincronizar réplica '%s'."
msgid "Unable to retrieve default share quotas."
msgstr "Não é possível obter a quota de compartilhamento padrão."
msgid "Unable to retrieve list of projects."
msgstr "Não é possível recuperar lista de projetos."
msgid "Unable to retrieve quotas."
msgstr "Não foi possível recuperar cotas."
#, python-format
msgid "Unable to retrieve replica '%s'."
msgstr "Não foi possível recuperar a réplica '%s'."
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "Não é possível obter os detalhes do serviço de segurança '%s'."
msgid "Unable to retrieve security services"
msgstr "Não é possível recuperar serviços de segurança"
msgid "Unable to retrieve security_service."
msgstr "Não é possível recuperar o security_service."
msgid "Unable to retrieve share details."
msgstr "Não é possível obter os detalhes do compartilhamento."
#, python-format
msgid "Unable to retrieve share group '%s'."
msgstr "Não é possível obter o grupo de compartilhamento '%s'"
msgid "Unable to retrieve share group details."
msgstr "Não é possível obter os detalhes do grupo de compartilhamento."
#, python-format
msgid "Unable to retrieve share group snapshot '%s'."
msgstr "Não é possível recuperar o snapshot do grupo de compartilhamento '%s'."
msgid "Unable to retrieve share group snapshot details."
msgstr ""
"Não é possível obter os detalhes do snapshot do grupo de compartilhamento."
msgid "Unable to retrieve share group snapshot list."
msgstr "Não é possível obter a lista de snapshot de grupo de compartilhamento."
msgid "Unable to retrieve share group snapshot."
msgstr "Não é possível obter o snapshot do grupo de compartilhamento."
msgid "Unable to retrieve share group snapshots."
msgstr "Não é possível obter os snapshots de grupo de compartilhamento."
msgid "Unable to retrieve share group types."
msgstr "Não é possível obter os tipos de grupos de compartilhamento."
msgid "Unable to retrieve share group."
msgstr "Não é possível obter o grupo de compartilhamento."
msgid "Unable to retrieve share groups."
msgstr "Não é possível obter grupos de compartilhamento."
msgid "Unable to retrieve share instance details."
msgstr "Não foi possível obter os detalhes da instância de compartilhamento."
msgid "Unable to retrieve share instances."
msgstr "Não foi possível recuperar instâncias de compartilhamento."
msgid "Unable to retrieve share limit information."
msgstr "Não foi possível recuperar informações de limite de compartilhamento."
msgid "Unable to retrieve share list."
msgstr "Não é possível recuperar a lista de compartilhamento."
msgid "Unable to retrieve share network details."
msgstr "Não foi possível obter os detalhes da rede de compartilhamento."
msgid "Unable to retrieve share network."
msgstr "Não foi possível recuperar rede de compartilhamento."
msgid "Unable to retrieve share networks"
msgstr "Não foi possível recuperar redes de compartilhamento"
msgid "Unable to retrieve share replicas."
msgstr "Não foi possível recuperar réplicas de compartilhamento."
msgid "Unable to retrieve share rules."
msgstr "Não foi possível recuperar regras do compartilhamento."
msgid "Unable to retrieve share server details."
msgstr "Não foi possível obter os detalhes do servidor de compartilhamento."
msgid "Unable to retrieve share servers"
msgstr "Não foi possível recuperar servidores de compartilhamento"
msgid "Unable to retrieve share snapshot list."
msgstr "Não é possível obter a lista de snapshot de compartilhamento."
msgid "Unable to retrieve share snapshot rules."
msgstr "Não é possível obter as regras de snapshot de compartilhamento."
msgid "Unable to retrieve share snapshot."
msgstr "Não é possível obter o snapshot de compartilhamento."
msgid "Unable to retrieve share snapshots list."
msgstr "Não foi possível recuperar a lista de snapshots."
msgid "Unable to retrieve share snapshots."
msgstr "Não é possível obter snapshots de compartilhamento."
msgid "Unable to retrieve share types."
msgstr "Não é possível obter tipos de compartilhamento."
msgid "Unable to retrieve share."
msgstr "Não foi possível recuperar compartilhamento."
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "Não foi possível recuperar compartilhamento. %s"
msgid "Unable to retrieve share_gruop_type."
msgstr "Não é possível obter share_group_type."
msgid "Unable to retrieve share_type."
msgstr "Não foi possível recuperar o share_type."
msgid "Unable to retrieve snapshot details."
msgstr "Não é possível recuperar detalhes do snapshot."
msgid "Unable to retrieve snapshot."
msgstr "Não foi possível recuperar o snapshot."
msgid "Unable to retrieve volume details."
msgstr "Não foi possível recuperar detalhes do volume."
msgid "Unable to revert share to the snapshot."
msgstr "Não é possível reverter o compartilhamento para o snapshot."
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "Não foi possível definir a réplica '%s' como ativa."
msgid "Unable to unmanage share."
msgstr "Não foi possível tornar o compartilhamento não gerenciado."
#, python-format
msgid "Unable to update access for share group type \"%s\"."
msgstr ""
"Não é possível atualizar acessos para o tipo de grupo de compartilhamento "
"\"%s\"."
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr ""
"Não é possível atualizar o acesso para o tipo de compartilhamento \"%s\"."
msgid "Unable to update default quotas."
msgstr "Não é possível atualizar cotas padrão."
msgid "Unable to update extra_specs for share type."
msgstr ""
"Não é possível atualizar as extra_specs para o tipo de compartilhamento."
msgid "Unable to update group_specs for share group type."
msgstr ""
"Não é possível atualizar group_specs para o tipo de grupo de "
"compartilhamento."
msgid "Unable to update security service."
msgstr "Não foi possível atualizar o serviço de segurança."
msgid "Unable to update share group snapshot."
msgstr "Não é possível atualizar o snapshot do grupo de compartilhamento."
msgid "Unable to update share group type."
msgstr "Não é possível atualizar o tipo de grupo de compartilhamento."
msgid "Unable to update share group."
msgstr "Não é possível atualizar o grupo de compartilhamento."
msgid "Unable to update share metadata."
msgstr "Não foi possível atualizar metadados de compartilhamento."
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "Não é possível atualizar a rede de compartilhamento \"%s\"."
msgid "Unable to update share network."
msgstr "Não foi possível atualizar rede de compartilhamento."
msgid "Unable to update share snapshot."
msgstr "Não é possível atualizar snapshot de compartilhamento."
msgid "Unable to update share type."
msgstr "Não é possível atualizar o tipo de acesso."
msgid "Unable to update share."
msgstr "Não foi possível atualizar o compartilhamento."
msgid "Unknown"
msgstr "Desconhecido"
msgid "Unmanage"
msgstr "Remoção de Gerenciamento"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "Erro na Remoção de Gerenciamento"
msgid "Unmanage Share"
msgstr "Remover Gerenciamento de Compartilhamento"
msgid "Update"
msgstr "Atualizar"
msgid "Update Share Group"
msgstr "Atualizar Grupo de Compartilhamento"
msgid "Update Share Group Snapshot"
msgstr "Atualizar Snapshot do Grupo de Compartilhamento"
msgid "Update Share Group Type"
msgstr "Atualizar Tipo de Grupo de Compartilhamento"
msgid "Update Share Network"
msgstr "Atualizar Rede de Compartilhamento"
msgid "Update Share Snapshot"
msgstr "Atualizar Snapshot de Compartilhamento"
msgid "Update Share Type"
msgstr "Atualizar Tipo de Compartilhamento"
msgid "Update Share group Type"
msgstr "Atualizar o Tipo do Grupo de Compartilhamento"
msgid "Update share network"
msgstr "Atualizar rede de compartilhamento."
msgid "Updated"
msgstr "Atualizado"
msgid "Updated At"
msgstr "Atualizado em"
#, python-format
msgid "Updated access for share group type \"%s\"."
msgstr "Acesso atualizado para o tipo de grupo de compartilhamento \"%s\"."
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "Acesso atualizado para o tipo de compartilhamento \"%s\"."
#, python-format
msgid "Updated share network \"%s\"."
msgstr "Rede de compartilhamento atualizada \"%s\"."
#, python-format
msgid "Updating share \"%s\""
msgstr "Atualizando o compartilhamento \"%s\""
#, python-format
msgid "Updating share group \"%s\""
msgstr "Atualizando grupo de compartilhamento \"%s\""
#, python-format
msgid "Updating share group snapshot \"%s\""
msgstr "Atualizando o snapshot de grupo de compartilhamento \"%s\""
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "Atualizando os metadados do compartilhamento \"%s\""
#, python-format
msgid "Updating share network \"%s\""
msgstr "Atualizando rede de compartilhamento \"%s\""
#, python-format
msgid "Updating share snapshot \"%s\""
msgstr "Atualizando snapshot de compartilhamento \"%s\""
msgid "Use share group snapshot as a source"
msgstr "Usar snapshot de grupo de compartilhamento como origem"
msgid "Use snapshot as a source"
msgstr "Utilizar snapshot como origem."
msgid "User"
msgstr "Usuário"
msgid "Visibility"
msgstr "Visibilidade"
msgid "Writable"
msgstr "Gravável"
msgid "as Active?"
msgstr "como Ativo?"
msgid "key=value pairs per line can be set"
msgstr "Pares de chave=valor por linha pode ser configurado"
manila-ui-3.0.0/manila_ui/locale/de/ 0000775 0001750 0001750 00000000000 13647271736 017215 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/de/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021002 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/de/LC_MESSAGES/django.po 0000664 0001750 0001750 00000147411 13647271543 022610 0 ustar zuul zuul 0000000 0000000 # Frank Kloeker , 2016. #zanata
# Robert Simai , 2016. #zanata
# Frank Kloeker , 2017. #zanata
# Robert Simai , 2017. #zanata
# Frank Kloeker , 2018. #zanata
# Reik Keutterling , 2018. #zanata
# Robert Simai , 2018. #zanata
# Andreas Jaeger , 2019. #zanata
# Andreas Jaeger , 2020. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2020-04-15 19:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2020-01-16 04:04+0000\n"
"Last-Translator: Andreas Jaeger \n"
"Language-Team: German\n"
"Language: de\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
msgid ""
"\"Manage\" an existing share from a Manila host. This will make the share "
"visible within OpenStack.
This is equivalent to the 'manila "
"manage' command."
msgstr ""
"\"Verwalten\" einer vorhandenen Freigabe von einem Manila-Host Dadurch wird "
"die Freigabe in OpenStack sichtbar.
Dies entspricht dem Befehl "
" 'manila manage' ."
#, python-format
msgid "%(used)s of %(quota)s GiB Used"
msgstr "%(used)s von %(quota)s GiB verwendet"
#, python-format
msgid "%(used)s of %(quota)s Used"
msgstr "%(used)s von %(quota)s verwendet"
#, python-format
msgid "%sGiB"
msgstr "%sGiB"
msgid "(Quota exceeded)"
msgstr "(Kontingent überschritten)"
msgid "Access Key"
msgstr "Zugriffsschlüssel"
msgid "Access Level"
msgstr "Zugriffsstufe"
msgid "Access Rules"
msgstr "Zugriffsregeln"
msgid "Access To"
msgstr "Zugriff auf"
msgid "Access Type"
msgstr "Zugriffstyp"
msgid "Access to"
msgstr "Zugriff auf"
msgctxt "Current status of share network"
msgid "Active"
msgstr "Aktiv"
msgctxt "Current status of share server"
msgid "Active"
msgstr "Aktiv"
msgid "Add"
msgstr "Hinzufügen"
msgid "Add Rule"
msgstr "Regel hinzufügen"
msgid "Add Security Service"
msgstr "Sicherheitsdienst hinzufügen"
msgid "Add Share Snapshot Rule"
msgstr "Freigabe Schattenkopie Regel hinzufügen"
msgid ""
"Add policy rule to snapshot, 'ip' rule represents ip address, 'user' rule "
"represents username or usergroup, 'cephx' rule represents ceph auth ID, and "
"'cert' rule represents certificate."
msgstr ""
"Hinzufügen der Richtlinienregel zum Snapshot, \"ip\"-Regel stellt IP-Adresse "
"dar, \"user\"-Regel stellt Benutzername oder Benutzergruppe dar, \"cephx\"-"
"Regel stellt Ceph-Authentifizierungs-ID dar und \"cert\"-Regel stellt "
"Zertifikat dar."
msgid "Add rule"
msgstr "Regel hinzufügen"
msgid "Add security services to share network."
msgstr "Füge Sicherheitsdienst zu Freigabenetzwerk hinzu."
msgid "All keys and values must be in range from 1 to 255."
msgstr "Alle Schlüssel und Werte müssen im Bereich zwischen 1 und 255 liegen."
msgid "All pairs that are in field for left are set for this metadata."
msgstr ""
"Alle Paare, die sich im Feld für Links befinden, werden für diese Metadaten "
"festgelegt."
msgid "All pairs that are in field for left are set for this share group type."
msgstr ""
"Alle Paare, die sich im Feld für links befinden, werden für diesen "
"Freigabegruppentyp festgelegt."
msgid "All pairs that are in field for left are set for this share type."
msgstr ""
"Alle Paare, die sich im Feld für links befinden, werden für diesen "
"Freigabegruppentyp festgelegt."
msgid "Allow project access to share group type."
msgstr "Erlaube Projektzugriff zum Gruppenfreigabentyp"
msgid "Allow project access to share type."
msgstr "Erlaube Projekt Zugriff auf Freigabetyp."
msgid "At least one security service must be specified."
msgstr "Wenigstens ein Sicherheitsdienst muss angegeben werden."
msgid "At least one share type must be specified."
msgstr "Es muss mindestens ein Freigabetyp angegeben werden."
msgid "Availability Zone"
msgstr "Verfügbarkeitszone"
msgid "Availability zone"
msgstr "Verfügbarkeitszone"
msgctxt "Current status of replica"
msgid "Available"
msgstr "Verfügbar"
msgctxt "Current status of share"
msgid "Available"
msgstr "Verfügbar"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "Verfügbar"
msgid "Available networks"
msgstr "Verfügbare Netzwerke"
msgid "Available projects"
msgstr "Verfügbare Projekte"
msgid "Available security services"
msgstr "Verfügbare Sicherheitsdienste"
msgid "Cancel"
msgstr "Abbrechen"
msgid "Cancel Migration"
msgstr "Migration abbrechen"
msgid "Cancel migration"
msgstr "Migration abbrechen"
msgid "Cancel migration of a Share"
msgstr "Migration einer Freigabe abbrechen"
msgid ""
"Cancel migration of a migrating share.
This is equivalent to the "
"'manila migration-cancel' command."
msgstr ""
"Brechen Sie die Migration einer migrierenden Freigabe ab.
Dies "
"entspricht dem Befehl 'manila migration-cancel' ."
msgid "Choose a snapshot"
msgstr "Wählen Sie eine Schattenkopie"
msgid "Complete Migration"
msgstr "Migration abschliessen"
msgid "Complete migration"
msgstr "Migration abschließen"
msgid "Complete migration of a Share"
msgstr "Migration einer Freigabe abschliessen"
msgid ""
"Complete migration of a migrating share to another Manila host. This "
"operation is expected to be disruptive.
This is equivalent to the "
"'manila migration-complete' command."
msgstr ""
"Vollständige Migration einer migrierenden Freigabe auf einen anderen Manila-"
"Host Diese Operation wird voraussichtlich störend sein.
Dies "
"entspricht dem Befehl 'manila migration-complete' ."
msgid "Confirm Migration Cancelling of Share"
msgstr "Bestätige Abbruch der Migration einer Freigabe"
msgid "Confirm Migration Completion of Share"
msgstr "Bestätige Abschluss der Migration der Freigabe"
msgid "Confirm Obtaining migration progress of Share"
msgstr "Bestätige Erhalt des Migrationsfortschritts einer Freigabe"
msgid "Confirm Password"
msgstr "Bestätige Passwort"
msgid "Confirm Unmanage Share"
msgstr "Bestätige aufheben der Verwaltung einer Freigabe"
msgid "Create"
msgstr "Erstellen"
msgid "Create Group Share Type"
msgstr "Gruppenfreigabe-Typ erstellen"
msgid "Create Replica"
msgstr "Erstelle Replika"
msgid "Create Security Service"
msgstr "Erstelle Sicherheitsdienst"
msgid "Create Share"
msgstr "Freigabe erstellen"
msgid "Create Share Group"
msgstr "Freigabegruppe erstellen"
msgid "Create Share Group Snapshot"
msgstr "Freigabegruppe Schattenkopie erstellen"
msgid "Create Share Group Type"
msgstr "Freigabengruppe Typ erstellen"
msgid "Create Share Network"
msgstr "Erstelle Freigabenetzwerk"
msgid "Create Share Replica"
msgstr "Erstellen Share-Replikat"
msgid "Create Share Snapshot"
msgstr "Erstelle Fraigaben-Schattenkopie"
msgid "Create Share Type"
msgstr "Erstelle Freigabetyp"
msgid "Create a Share"
msgstr "Erstelle eine Freigabe"
msgid "Create share replica in specific availability zone."
msgstr ""
"Erstellen Sie ein Share-Replikat in einer bestimmten Verfügbarkeitszone."
msgid "Created"
msgstr "Erstellt"
msgid "Created At"
msgstr "Erstellt um"
msgid "Created at"
msgstr "Erstellt am"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "Erstellen"
msgctxt "Current status of share"
msgid "Creating"
msgstr "Erstellen"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "Erstellen"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "Erstellen"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "Erstelle Replika für Freigabe \"%s\"."
#, python-format
msgid "Creating rule for \"%s\""
msgstr "Erstelle Regel für \"%s\""
#, python-format
msgid "Creating share \"%s\""
msgstr "Erstelle Freigabe \"%s\""
#, python-format
msgid "Creating share group \"%s\""
msgstr "Erstelle Freigabegruppe \"%s\""
#, python-format
msgid "Creating share group snapshot \"%s\"."
msgstr "Gruppenfreigabe Schattenkopie \"%s\" erstellen."
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "Erstelle geteilte Schattenkopie \"%s\"."
#, python-format
msgid "Creating snapshot rule for \"%s\""
msgstr "Erstelle Schattenkopie-Regel für \"%s\""
msgid "Current Size (GiB)"
msgstr "Aktuelle Größe (GiB)"
msgid "DNS IP"
msgstr "DNS IP"
msgid "Delete Replica"
msgid_plural "Delete Replicas"
msgstr[0] "Replik entfernen"
msgstr[1] "Repliken entfernen"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Regel löschen"
msgstr[1] "Regeln löschen"
msgid "Delete Security Service"
msgid_plural "Delete Security Services"
msgstr[0] "Lösche Sicherheitsdienst"
msgstr[1] "Lösche Sicherheitsdienste"
msgid "Delete Share"
msgid_plural "Delete Shares"
msgstr[0] "Lösche Freigabe"
msgstr[1] "Lösche Freigaben"
msgid "Delete Share Group"
msgid_plural "Delete Share Groups"
msgstr[0] "Gruppenfreigabe löschen"
msgstr[1] "Gruppenfreigaben löschen"
msgid "Delete Share Group Snapshot"
msgid_plural "Delete Share Group Snapshots"
msgstr[0] "Freigabengruppe Schattenkopie löschen"
msgstr[1] "Freigabengruppe Schattenkopien löschen"
msgid "Delete Share Group Type"
msgid_plural "Delete Share Group Types"
msgstr[0] "Freigabengruppe Typ löschen"
msgstr[1] "Freigabengruppen Typen löschen"
msgid "Delete Share Network"
msgid_plural "Delete Share Networks"
msgstr[0] "Freigabenetzwerk löschen"
msgstr[1] "Freigabenetzwerke löschen"
msgid "Delete Share Server"
msgid_plural "Delete Share Server"
msgstr[0] "Freigabeserver entfernen"
msgstr[1] "Freigabeserver entfernen"
msgid "Delete Share Snapshot"
msgid_plural "Delete Share Snapshots"
msgstr[0] "Lösche Freigabeschattenkopie"
msgstr[1] "Lösche Freigabeschattenkopien"
msgid "Delete Share Snapshot Rule"
msgid_plural "Delete Share Snapshot Rules"
msgstr[0] "Lösche Regel Freigabeschattenkopie"
msgstr[1] "Lösche Regeln Freigabeschattenkopie"
msgid "Delete Share Type"
msgid_plural "Delete Share Types"
msgstr[0] "Freigabetyp löschen"
msgstr[1] "Freigabetypen löschen"
msgid "Delete Snapshot"
msgid_plural "Delete Snapshots"
msgstr[0] "Schattenkopie löschen"
msgstr[1] "Schattenkopien löschen"
msgid "Deleted Replica"
msgid_plural "Deleted Replicas"
msgstr[0] "Gelöschte Replik"
msgstr[1] "Gelöschte Repliken"
msgid "Deleted Rule"
msgid_plural "Deleted Rules"
msgstr[0] "Gelöschte Regel"
msgstr[1] "Gelöschte Regeln"
msgid "Deleted Security Service"
msgid_plural "Deleted Security Services"
msgstr[0] "Gelöschter Sicherheitsdienst"
msgstr[1] "Gelöschte Sicherheitsdienste"
msgid "Deleted Share"
msgid_plural "Deleted Shares"
msgstr[0] "Gelöschte Freigabe"
msgstr[1] "Gelöschte Freigaben"
msgid "Deleted Share Group"
msgid_plural "Deleted Share Groups"
msgstr[0] "Gelöschte Gruppenfreigabe"
msgstr[1] "Gelöschte Gruppenfreigaben"
msgid "Deleted Share Group Snapshot"
msgid_plural "Deleted Share Group Snapshots"
msgstr[0] "Gelöschte Freigabengruppe Schattenkopie"
msgstr[1] "Gelöschte Freigabengruppe Schattenkopien"
msgid "Deleted Share Group Type"
msgid_plural "Deleted Share Group Types"
msgstr[0] "Gelöschter Freigabengruppe Typ"
msgstr[1] "Gelöschte Freigabengruppen Typen"
msgid "Deleted Share Network"
msgid_plural "Deleted Share Networks"
msgstr[0] "Gelöschtes Freigabenetzwerk"
msgstr[1] "Gelöschte Freigabennetzwerke"
msgid "Deleted Share Server"
msgid_plural "Deleted Share Server"
msgstr[0] "Gelöschter Freigabeserver"
msgstr[1] "Gelöschte Freigabeserver"
msgid "Deleted Share Snapshot"
msgid_plural "Deleted Share Snapshots"
msgstr[0] "Freigabe Schattenkopie löschen"
msgstr[1] "Freigabe Schattenkopien löschen"
msgid "Deleted Share Snapshot Rule"
msgid_plural "Deleted Share Snapshot Rules"
msgstr[0] "Gelöschte Regeln Freigabeschattenkopie"
msgstr[1] "Gelöschte Regeln Freigabeschattenkopie"
msgid "Deleted Share Type"
msgid_plural "Deleted Share Types"
msgstr[0] "Gelöschter Freigabetyp"
msgstr[1] "Gelöschte Freigabetypen"
msgid "Deleted Snapshot"
msgid_plural "Deleted Snapshots"
msgstr[0] "Schattenkopie löschen"
msgstr[1] "Schattenkopien löschen"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "Löschen"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "Löschen"
msgid "Description"
msgstr "Beschreibung"
msgid "Description:"
msgstr "Beschreibung:"
msgid "Destination host and pool where share will be migrated to."
msgstr "Zielhost und Pool, zu dem die Shares migriert werden."
msgid "Domain"
msgstr "Domäne"
msgid "Driver handles share servers"
msgstr "Treiberhändler des Freigabeservers"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "Treiberoptionen ('volume_id' für generischen Treiber, etc...)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "Doppelte Schlüssel '%s'."
msgid "Edit"
msgstr "Bearbeiten"
msgid "Edit Security Service"
msgstr "Bearbeite Sicherheitsdienst"
msgid "Edit Share"
msgstr "Freigabe bearbeiten"
msgid "Edit Share Metadata"
msgstr "Freigabemetadaten bearbeiten"
msgid "Edit Share Network"
msgstr "Bearbeite Freigabenetzwerk"
msgid "Edit Share Snapshot"
msgstr "Freigabe Schattenkopie bearbeiten"
msgid "Edit Share network"
msgstr "Bearbeite Freigabenetzwerk"
msgid ""
"Enforces migration of the share snapshots to the destination. If set to "
"True, host-assisted migration will not be attempted."
msgstr ""
"Erzwingt die Migration der Share-Schattenkopien zum Ziel. Wenn aktiviert, "
"wird die Host-gestützte Migration nicht verwendet."
msgid ""
"Enforces migration to be nondisruptive. If set to True, host-assisted "
"migration will not be attempted."
msgstr ""
"Erzwingt unterbrechungsfreie Migration. Wenn aktiviert, wird die Host-"
"gestützte Migration ausgelassen."
msgid ""
"Enforces migration to keep the share writable while contents are being "
"moved. If set to True, host-assisted migration will not be attempted."
msgstr ""
"Erzwingt, dass bei der Migration die Shares schreibbar bleiben, während "
"deren Inhalt bewegt wird. Wenn aktiviert, wird die Host-gestützte Migration "
"ausgelassen."
msgid ""
"Enforces migration to preserve all file metadata when moving its contents. "
"If set to True, host-assisted migration will not be attempted."
msgstr ""
"Erzwingt, dass bei der Migration alle Datei-Metadaten bewahrt werden, "
"während der Inhalt verschoben wird. Wenn aktiviert, wird die Host-gestützte "
"Migration ausgelassen."
msgid ""
"Enforces the use of the host-assisted migration approach, which bypasses "
"driver optimizations."
msgstr ""
"Erzwingt die Verwendung der Host-gestützten Migration, welche "
"Treiberoptimierungen umgeht."
msgctxt "Current status of replica"
msgid "Error"
msgstr "Fehler"
msgctxt "Current status of share"
msgid "Error"
msgstr "Fehler"
msgctxt "Current status of share network"
msgid "Error"
msgstr "Fehler"
msgctxt "Current status of share server"
msgid "Error"
msgstr "Fehler"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "Fehler"
msgid "Expected only pairs of key=value."
msgstr "Erwartet nur Schlüssel=Wert Paare."
msgid "Export location"
msgstr "Exportiere Lokation"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr ""
"Exportiere Lokation der Freigabe. Beispiel für NFS: 1.2.3.4:/path/to/share"
msgid "Export locations"
msgstr "Lokationen exportieren"
msgid "Extend"
msgstr "Erweitern"
msgid "Extend Share"
msgstr "Freigabe erweitern"
#, python-format
msgid "Extend share \"%s\""
msgstr "Erweitere Freigabe \"%s\""
msgid "Extend the size of a share. "
msgstr "Größe einer Freigabe erweitern"
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "Erweiterungsfehler"
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"Extra Spezifikation 'driver_handles_share_servers' ist erforderlich und "
"sollte einen boolschen Wert haben."
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"Extra Spezifikation 'driver_handles_share_servers' ist erforderlich und "
"sollte einen boolschen Wert haben."
msgid "Extra specs"
msgstr "Extra Spezifikationen"
msgid "Force Host Assisted Migration"
msgstr "Erzwinge durch Host unterstützte Migration"
msgid "From here you can modify name and description of a security service."
msgstr ""
"Von hier aus können Sie den Namen und die Beschreibung eines "
"Sicherheitsdienstes ändern."
msgid ""
"From here you can modify name and description of a share group snapshot."
msgstr ""
"Von hier aus können Sie den Namen und die Beschreibung eines "
"Freigabengruppen-Schattenkopie ändern."
msgid "From here you can modify name and description of a share network."
msgstr ""
"Hier können Sie Name und Beschreibung eines Freigabe-Netzwerkes ändern."
msgid "From here you can modify name and description of a snapshot."
msgstr "Hier können Sie Name und Beschreibung einer Schattenkopie ändern."
msgid ""
"From here you can modify name, description and visibility of a share group."
msgstr ""
"Von hier aus können Sie den Namen, Beschreibung und Sichtbarkeit eier "
"Freigabegruppe ändern."
msgid "From here you can modify name, description and visibility of a share."
msgstr ""
"Hier können Sie Name, Beschreibung und Sichtbarkeit einer Freigabe ändern."
msgid "From here you can revert the share to its latest snapshot."
msgstr ""
"Hier können Sie die Freigabe auf die letzte Schattenkopie zurücksetzen."
msgid "From here you can update share network info. "
msgstr "Hier können Sie Informationen zum Freigabenetzwerk aktualisieren."
msgid "From here you can update the default share quotas (max limits)."
msgstr ""
"Von hier aus können Sie die Standard-Share-Kontingente (Höchstgrenzen) "
"aktualisieren."
msgid "Get Migration Progress"
msgstr "Migrationsfortschritt abrufen"
msgid "Get migration progress"
msgstr "Migrationsfortschritt abrufen"
msgid "GiB"
msgstr "GiB"
msgid ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgstr ""
"Falscher Wert für das Feld 'driver_options' erhalten. Erwartet werden nur "
"Schlüssel=Wert Paare."
msgid "Group specs"
msgstr "Gruppenspezifikationen"
msgid "Here can be modified extra-specs for share type."
msgstr ""
"Hier können Sie die Extra-Spezifikationen für Share-Typen modifizieren."
msgid "Here can be modified group-specs for share group type."
msgstr ""
"Hier können Sie Gruppen-Spezifikationen für den Freigabegruppentyp ändern."
msgid "Host"
msgstr "Host"
msgid "Host of share"
msgstr "Host der Freigabe"
msgid "Host to migrate share"
msgstr "Host zur Migration der Freigabe"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr ""
"Host, auf dem die Freigabe beheimatet ist, Beispiel: some.host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP Version"
msgid "Id"
msgstr "Id"
#, python-format
msgid ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgstr ""
"Falscher Wert zum Setzen der Extra Spezifikation "
"'spec_driver_handles_share_servers'. Erlaubte Werte sind %s. Gross- und "
"Kleinschreibung wird ignoriert."
msgctxt "Current status of share server"
msgid "In-use"
msgstr "In Benutzung"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "In Benutzung"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "Inaktiv"
#, python-format
msgid "Key '%s' has improper length."
msgstr "Schlüssel '%s' hat die falsche Länge."
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "Der Schlüssel darf keine Leerzeichen enthalten. Prüfen Sie '%s'."
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "Schlüssel dürfen keine Leerzeichen enthalten. Fehler in '%s'."
msgid "Limit"
msgstr "Limit"
msgid "Make visible for all"
msgstr "Für alle sichtbar machen"
msgid "Manage"
msgstr "Verwalten"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "Fehler verwalten"
msgid "Manage Replicas"
msgstr "Verwalte Replikas"
msgid "Manage Rules"
msgstr "Regeln verwalten"
msgid "Manage Share"
msgstr "Verwalte Freigabe"
msgid "Manage Share Group Type Access"
msgstr "Freigabengruppe Typzugriff verwalten"
msgid "Manage Share Snapshot Rules"
msgstr "Verwalte Regeln Freigabeschattenkopie"
msgid "Manage Share Type Access"
msgstr "Verwalte Freigabetypzugriff"
msgid "Metadata"
msgstr "Metadaten"
msgid "Migrate Share"
msgstr "Migriere Freigabe"
msgid "Migrate a Share"
msgstr "Freigabe migrieren"
msgid ""
"Migrate an existing share to another Manila host. This will move all your "
"share data from one host to another.
This is equivalent to the "
"'manila migration-start' command."
msgstr ""
"Migrieren Sie eine vorhandene Freigabe auf einen anderen Manila-Host. "
"Dadurch werden alle Ihre Freigabedaten von einem Host auf einen anderen "
"verschoben.
Dies entspricht dem Befehl 'manila migration-"
"start' ."
msgctxt "Current status of share"
msgid "Migrating"
msgstr "Migrieren"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "Migriere nach"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "Migration der Freigabe %(name)s ist bei %(progress)s Prozent."
msgid "Mount snapshot support"
msgstr "Schattenkopie mount-Unterstützung"
msgid "Name"
msgstr "Name"
msgid "Net Details"
msgstr "Netz Details"
msgid "Network"
msgstr "Netzwerk"
msgid "Network Details"
msgstr "Netzwerkdetails"
msgid "Network Type"
msgstr "Netzwerktyp"
msgid "Networks"
msgstr "Netzwerke"
msgid "Neutron Net"
msgstr "Neutron Netz"
msgid "Neutron Subnet"
msgstr "Neutron Subnetz"
msgid "New Size (GiB)"
msgstr "Neue Größe (GiB)"
msgid "New share network to be set in migrated share"
msgstr "Neues Freigabenetzwerk, um es in der migrierten Freigabe zu setzen."
msgid "New share type to be set in migrating share"
msgstr "Neuer Freigabetyp, um ihn in der migrierten Freigabe zu setzen"
msgid "New size must be greater than current size."
msgstr "Neue Größe muss grösser als die derzeitige Größe sein."
msgid "No projects found."
msgstr "Keine Projekte gefunden."
msgid "No projects selected."
msgstr "Keine Projekte ausgewählt."
msgid "No security services found."
msgstr "Keine Sicherheitsdienste gefunden."
msgid "No security services selected."
msgstr "Keine Sicherheitsdienste ausgewählt."
msgid "No source, empty share"
msgstr "Keine Quelle, leere Freigabe"
msgid "No source, empty share group"
msgstr "Keine Quelle, leere Gruppenfreigabe"
msgid "Nondisruptive"
msgstr "Ohne Unterbrechung"
msgid "Nova Net"
msgstr "Nova Netz"
msgid "Number of Share Snapshots"
msgstr "Anzahl der Freigaben-Schattenkopien"
msgid "Number of Shares"
msgstr "Anzahl der Freigaben"
msgid "Obtain Progress"
msgstr "Erhalte Fortschritt"
msgid "Obtain migration progress of a Share"
msgstr "Erhalte Fortschritt der Migration einer Freigabe"
msgid ""
"Obtains migration progress of a migrating share.
This is "
"equivalent to the 'manila migration-get-progress' command."
msgstr ""
"Ruft den Migrationsfortschritt einer migrierenden Freigabe ab.
"
"Dies entspricht dem Befehl 'manila migration-get-progress' ."
msgid "One line - one action. Empty strings will be ignored."
msgstr "Eine Zeile - eine Aktion. Leere Zeichenketten werden ignoriert."
msgid "Overview"
msgstr "Übersicht"
msgid "Password"
msgstr "Passwort"
msgid "Passwords do not match."
msgstr "Passwörter stimmen nicht überein."
msgid "Placeholder for description of share group type access managing form."
msgstr "Platzhalter für Beschreibung der Share-Gruppentypen-Verwaltungsform."
msgid "Placeholder for description of share type access managing form."
msgstr "Platzhalter für Beschreibung der Share-Typen-Verwaltungsform."
msgid "Preserve Metadata"
msgstr "Metadaten behalten"
msgid "Preserve Snapshots"
msgstr "Schattenkopien aufbewahren"
msgid "Project"
msgstr "Projekt"
msgid "Projects with access to share group type"
msgstr "Projekte mit Zugriff auf Gruppenfreigabetypen"
msgid "Projects with access to share type"
msgstr "Projekte mit Zugriff auf Freigabetypen"
msgid "Protocol"
msgstr "Protokoll"
msgid "Public"
msgstr "Öffentlich"
msgid "Quota Name"
msgstr "Kontingentname"
msgid "Replica Details"
msgstr "Replika Details"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "Replika Details: %(replica_display_name)s"
msgid "Replica State"
msgstr "Replika Zustand"
msgid "Replica state"
msgstr "Replika Zustand"
msgid "Replicas"
msgstr "Replikas"
msgid "Reset Replica State"
msgstr "Replika Zustand zurücksetzen"
msgid "Reset Replica Status"
msgstr "Replika Status zurücksetzen"
msgid "Reset Share Group Snapshot Status"
msgstr "Rücksetzung des Status der Schattenkopie der Gruppenfreigabe"
msgid "Reset Share Group Status"
msgstr "Gruppenfreigaben Status zurücksetzen"
msgid "Reset Status"
msgstr "Status zurücksetzen"
msgid "Reset replica state"
msgstr "Replika Zustand zurücksetzen"
msgid "Reset replica status"
msgstr "Replika-Status zurücksetzen"
msgid "Reset share replica's state with ID"
msgstr "Freigabe-Replika Zustand mit ID zurücksetzen"
msgid "Reset share replica's status with ID"
msgstr "Freigabe-Replika Status mit ID zurücksetzen"
msgid "Reset state"
msgstr "Zustand zurücksetzen"
msgid "Reset status"
msgstr "Status zurücksetzen"
#, python-format
msgid "Reseting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
msgstr ""
"Setze Status von Replika ('%(id)s') von '%(from)s' auf '%(to)s' zurück."
#, python-format
msgid "Reseting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Zurücksetzen des Status von Replika ('%(id)s') von '%(from)s' zu '%(to)s'."
#, python-format
msgid "Reseting share group ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Gruppenfreigabe ('%(id)s') Status zurücksetzen von '%(from)s' zu '%(to)s'."
#, python-format
msgid ""
"Reseting share group snapshot ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Rücksetzung der Schattenkopie der Freigabegruppe ('%(id)s') Status von "
"'%(from)s' zu '%(to)s'."
msgid "Resync"
msgstr "Resynchronisieren"
msgid "Resync Replica"
msgstr "Resynchronisiere Replika"
msgid "Resync replica"
msgstr "Resynchronisiere Replika"
msgid "Resync share replica with ID"
msgstr "Resync der Freigabe-Replica mit ID"
#, python-format
msgid "Resync'ing replica '%s'"
msgstr "Resynchronisiere Replika '%s'"
msgid "Revert Share"
msgstr "Freigabe zurückstellen"
msgid "Revert Share to a Snapshot"
msgstr "Share auf Schattenkopie zurücksetzen"
msgid "Revert share to a snapshot"
msgstr "Freigabe auf Schattenkopie zurückstellen"
msgctxt "Current status of share"
msgid "Reverting Error"
msgstr "Fehler beim Zurückstellen"
msgid "Rules"
msgstr "Regeln"
msgid "Save Changes"
msgstr "Änderungen speichern"
msgid "Security Service Details"
msgstr "Sicherheitsdienstdetails"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "Sicherheitsdienst-Details: %(service_display_name)s"
msgid "Security Service Overview"
msgstr "Sicherheitsdienst Überblick"
msgid "Security Services"
msgstr "Sicherheitsdienste"
msgid "Security services within share network"
msgstr "Sicherheitsdienste in Freigabenetzwerk"
msgid "Segmentation Id"
msgstr "Segmentierungs-ID"
msgid "Select parameters of share group you want to create. "
msgstr ""
"Wählen Sie die Parameter der Freigabegruppe, die Sie erstellen möchten."
msgid "Select parameters of share you want to create. "
msgstr "Wählen Sie die Parameter der Freigabe, die Sie erstellen möchten."
msgid "Selected Networks"
msgstr "Ausgewählte Netzwerke"
msgid "Selected Projects"
msgstr "Ausgewählte Projekte"
msgid "Selected projects"
msgstr "Ausgewählte Projekte"
msgid "Selected security services"
msgstr "Gewählte SIcherheitsdienste"
msgid "Server"
msgstr "Server"
msgid "Set Replica as Active"
msgstr "Setze Replika auf aktiv"
msgid "Set as Active"
msgstr "Setze auf aktiv"
msgid "Set maximum quotas for the project."
msgstr "Setze maximale Kontingente für dieses Projekt."
msgid "Set share replica with ID"
msgstr "Setzen des Share-Replikat mit ID"
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "Setze Replika \"%s\" auf aktiv..."
msgid "Share"
msgstr "Freigabe"
#, python-format
msgid "Share \"%(s)s\" has been reverted to \"%(ss)s\" snapshot successfully"
msgstr "Freigabe \"%(s)s\" wurde auf Schattenkkopie \"%(ss)s\" zurückgestellt"
msgid "Share Details"
msgstr "Freigabendetails"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "Details Freigabe: %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "Freigabedetails: %(share_name)s"
msgid "Share Group"
msgstr "Freigabegruppe"
msgid "Share Group Details"
msgstr "Freigabegruppe Details"
#, python-format
msgid "Share Group Details: %s"
msgstr "Gruppenfreigaben Details: %s"
msgid "Share Group Name"
msgstr "Freigabegruppe Name"
msgid "Share Group Overview"
msgstr "Gruppenfreigabe Übersicht"
msgid "Share Group Snapshot"
msgstr "Freigabegruppe Schattenkopie"
msgid "Share Group Snapshot Details"
msgstr "Share Gruppe Schattenkopiedetails"
#, python-format
msgid "Share Group Snapshot Details: %(sgs_display_name)s"
msgstr "Details der Schattenkopie der Gruppenfreigabe: %(sgs_display_name)s"
msgid "Share Group Snapshot Overview"
msgstr "Übersicht der Schattenkopien der Freigabegruppen"
msgid "Share Group Snapshots"
msgstr "Freigabengruppe Schattenkopien"
msgid "Share Group Type"
msgstr "Gruppenfreigabetyp"
msgid "Share Group Types"
msgstr "Freigabengruppe Typen"
msgid "Share Groups"
msgstr "Gruppenfreigaben"
msgid "Share ID"
msgstr "Freigabe-ID"
msgid "Share Instance Details"
msgstr "Freigabeinstanz Details"
#, python-format
msgid "Share Instance Details: %s"
msgstr "Details Freigabeinstanz: %s"
msgid "Share Instance Overview"
msgstr "Freigegebene Instanzen Übersicht"
msgid "Share Instances"
msgstr "Freigabeinstanzen"
msgid "Share Limits"
msgstr "Freigabenlimits"
msgid "Share Name"
msgstr "Freigabename"
msgid "Share Network"
msgstr "Freigabenetzwerk"
msgid "Share Network Details"
msgstr "Freigabenetzwerk Details"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "Details Freigabenetzwerk: %(network_display_name)s"
msgid "Share Network Info"
msgstr "Freigabenetzwerk Informationen"
msgid "Share Network Overview"
msgstr "Freigabenetzwerke Übersicht"
msgid "Share Networks"
msgstr "Freigabenetzwerke"
msgid "Share Overview"
msgstr "Freigaben Übersicht"
msgid "Share Protocol"
msgstr "Freigabenprotokoll"
msgid "Share Quotas"
msgstr "Kontingente teilen"
msgid "Share Replica Overview"
msgstr "Freigabe-Replikaübersicht"
msgid "Share Replicas"
msgstr "Freigaben-Replikas"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr "Freigaben-Replikas: %(share_display_name)s"
msgid "Share Rules"
msgstr "Freigabenregeln"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "Freigaberegeln: %(share_display_name)s"
msgid "Share Server"
msgstr "Freigabeserver"
msgid "Share Server Details"
msgstr "Freigabeserver Details"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "Details Freigabeserver: %(server_name)s"
msgid "Share Server Id"
msgstr "Freigabeserver-ID"
msgid "Share Server Overview"
msgstr "Freigabeserver Übersicht"
msgid "Share Servers"
msgstr "Freigabeserver"
msgid "Share Snapshot Details"
msgstr "Details Freigabe-Schattenkopie"
msgid "Share Snapshot Name"
msgstr "Freigegebene Schattenkopie Name"
msgid "Share Snapshot Overview"
msgstr "Schattenkopieübersicht teilen"
msgid "Share Snapshot Rules"
msgstr "Schattenkopie-Regeln löschen"
msgid "Share Snapshots"
msgstr "Freigabe Schattenkopien"
msgid "Share Snapshots Storage"
msgstr "Freigabe Schattenkopienspeicher"
msgid ""
"Share Snapshots are used for storing share changes and creating shares. "
msgstr ""
"Freigabe Schattenkopien werden benutzt zum Speichern von Freigabeänderungen "
"und Freigabeerstellungen."
msgid "Share Source"
msgstr "Freigabequelle"
msgid "Share Storage"
msgstr "Freigabespeicher"
msgid "Share Type"
msgstr "Freigabetyp"
msgid "Share Types"
msgstr "Freigabetypen"
msgid "Share Types (multiple available)"
msgstr "Freigabetypen (mehrere verfügbar)"
msgid "Share Types (one available)"
msgstr "Freigabetypen (eine verfügbar)"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"Die Freigabe kann nicht auf %(req)iGiB erweitert werden, da nur %(avail)iGiB "
"in Ihrem Kontingent verfügbar sind."
msgid "Share gigabytes"
msgstr "Freigabe Gigabyte"
msgid "Share name to be assigned"
msgstr "Zuzuweisender Freigabename"
msgid "Share network"
msgstr "Freigabenetzwerk"
msgid ""
"Share networks contain network data, that will be used for creation of "
"service VM, where will be hosted shares."
msgstr ""
"Share-Netzwerke enthalten Netzwerkdaten, die für die Erstellung von Service-"
"VMs verwendet werden, auf denen gehostete Shares gespeichert werden."
#, python-format
msgid "Share replica %s has been deleted."
msgstr "Freigabe Replika %s wurde gelöscht."
msgid "Share server"
msgstr "Freigabeserver"
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr ""
"Freigabegrösse muss gleich oder grösser als die Grösse der Schattenkopie "
"sein (%sGiB)"
msgid "Share snapshot gigabytes"
msgstr " Freigabeschattenkopie gigabytes"
msgid "Share snapshots"
msgstr " Freigabeschattenkopien"
msgid "Share type"
msgstr "Freigabetyp"
msgid "Share types"
msgstr "Freigabetypen"
msgid "Shared Quotas"
msgstr "Geteilte Kontingente"
msgid "Shares"
msgstr "Freigaben"
msgid "Shares Networks"
msgstr "Freigabenetzwerke"
msgid "Shares on this server"
msgstr "Freigaben auf diesem Server"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "Grösse"
msgid "Size (GiB)"
msgstr "Grösse (GiB)"
msgid "Snapshot"
msgstr "Schattenkopie"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "Schattenkopiedetails: %(snapshot_display_name)s"
msgid "Snapshot ID"
msgstr "Schattenkopie ID"
msgid "Snapshot Overview"
msgstr "Übersicht Schattenkopie"
#, python-format
msgid "Snapshot Rules: %(snapshot_display_name)s"
msgstr "Schattenkopie-Regeln: %(snapshot_display_name)s"
msgid "Source"
msgstr "Quelle"
msgid "Source SG Snapshot"
msgstr "Quelle SG Schattenkopie"
msgid "Source Share Group"
msgstr "Quellen Share Gruppe"
msgid "Source Share Group Snapshot"
msgstr "Quelle Schattenkopie Gruppenfreigabe"
msgid "Source Type"
msgstr "Quellentyp"
msgid "Source share group snapshot"
msgstr "Quelle Schattenkopie Gruppenfreigabe"
msgid ""
"Specify the new share network for the share. Do not specify this parameter "
"if the migrating share has to be retained within its current share network."
msgstr ""
"Geben Sie das neue Share-Netzwerk für das Share an. Geben Sie diesen "
"Parameter nicht an, wenn das Migrations-Share im aktuellen Share-Netzwerk "
"verbleiben soll."
msgid ""
"Specify the new share type for the share. Do not specify this parameter if "
"the migrating share has to be retained with its current share type."
msgstr ""
"Geben Sie den neuen Share-Typ für das Share an. Geben Sie diesen Parameter "
"nicht an, wenn das Migrations-Share seinen aktuellen Share-Typ behalten soll."
msgid "Specs"
msgstr "Spezifikationen"
msgid "Start migration"
msgstr "Migration starten"
msgid "Status"
msgstr "Status"
msgid "Submit"
msgstr "Absenden"
msgid "Subnet"
msgstr "Subnetz"
#, python-format
msgid "Successfully created security service: %s"
msgstr "Sicherheitsdienst erfolgreich erstellt: %s"
#, python-format
msgid "Successfully created share group type: %s"
msgstr "Gruppenfreigabe Typ erfolgreich erstellt: %s"
#, python-format
msgid "Successfully created share network: %s"
msgstr "Freigabenetzwerk erfolgreich erstellt: %s"
#, python-format
msgid "Successfully created share type: %s"
msgstr "Freigabetyp erfolgreich erstellt: %s"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr ""
"Anfrage zum Abbruch der Migration der Freigabe erfolgreich gesendet: %s"
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr ""
"Anfrage zum Abschließen der Migration der Freigabe erfolgreich gesendet: %s"
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "Anfrage zur Verwaltung der Freigabe erfolgreich gesendet: %s"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "Anfrage zur Migration der Freigabe erfolgreich gesendet: %s"
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr ""
"Anfrage zum Aufheben der Verwaltung der Freigabe erfolgreich gesendet: %s"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "Extra-Spezifikationen des Freigabetypes '%s' erfolgreich aktualisiert."
#, python-format
msgid "Successfully updated group specs for share group type '%s'."
msgstr "Spezifikationen für Gruppenfreigabe Typ '%s' erfolgreich aktualisiert."
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "Erfolgreiche Aktualisierung des Sicherheitsdienstes \"%s\""
msgid "Task state"
msgstr "Auftragsstatus"
msgid ""
"The security service can be used by backend drivers to configure clients, "
"for more secure using of share."
msgstr ""
"Der Sicherheitsdienst kann von Back-End-Treibern zum Konfigurieren von "
"Clients verwendet werden, um die Verwendung von Freigabe sicherer zu machen."
msgid ""
"The share group type defines the characteristics of a share group backend."
msgstr ""
"Der Share-Gruppentyp definiert die Merkmale eines Back-End-Share-Gruppe."
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr ""
"Die Größe der Freigabe kann nicht kleiner als die der Schattenkopie sein "
"(%sGiB)"
msgid "The share type defines the characteristics of a share backend."
msgstr "Der Share-Typ definiert die Merkmale eines Share-Backends."
msgid "To add extra-specs use:"
msgstr "Zum hinzufügen von extra-Spezifikationen verwenden Sie:"
msgid "To add group-specs use:"
msgstr "Zum Hinzufügen von group-specs benutzen Sie:"
msgid "To add metadata use:"
msgstr "Zum hinzufügen von Metadaten verwenden Sie:"
msgid "To unset extra-specs use:"
msgstr "Zum Zurücksetzen von Extraspezifikationen verwenden Sie:"
msgid "To unset group-specs use:"
msgstr "Zum zurücksetzen von Gruppen-Spezifikationen verwenden Sie:"
msgid "To unset metadata use:"
msgstr "Zum Zurücksetzen von Metadaten verwenden Sie:"
msgid "Total Gibibytes"
msgstr "Gesamt Gibibytes"
msgid "Type"
msgstr "Typ"
msgid "Unable to add rule."
msgstr "Konnte Regel nicht hinzufügen."
msgid "Unable to add snapshot rule."
msgstr "Schattenkopie-Regel kann nicht hinzugefügt werden."
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr "Kann Migration der Freigabe %s momentan nicht abbrechen."
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "Konnte Migration der Freigabe %s nicht fertigstellen."
msgid "Unable to create security service."
msgstr "Konnte Sicherheitsdienst nicht erstellen."
msgid "Unable to create share group snapshot."
msgstr "Konnte Schattenkopie von Gruppenfreigabe nicht erstellen."
msgid "Unable to create share group type."
msgstr "Gruppenfreigabe Typ kann nicht erstellt werden."
msgid "Unable to create share group."
msgstr "Konnte Gruppenfreigabe nicht erstellen."
msgid "Unable to create share network."
msgstr "Konnte Freigabenetzwerk nicht erstellen."
msgid "Unable to create share replica."
msgstr "Konnte Freigabe-Replika nicht erstellen."
msgid "Unable to create share snapshot."
msgstr "Konnte Freigaben-Schattenkopie nicht erstellen."
msgid "Unable to create share type."
msgstr "Konnte Freigabetyp nicht erstellen."
msgid "Unable to create share."
msgstr "Konnte Freigabe nicht erstellen."
#, python-format
msgid "Unable to create share. %s"
msgstr "Freigabe kann nicht erstellt werden. %s"
#, python-format
msgid "Unable to delete replica \"%s\"."
msgstr "Konnte Replika \"%s\" nicht löschen."
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "Konnte Regel \"%s\" nicht löschen."
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "Konnte Freigabe \"%s\" nicht löschen."
#, python-format
msgid ""
"Unable to delete share group snapshot \"%s\". One or more share groups "
"depend on it."
msgstr ""
"Konnte die Schattenkopie \"%s\" der Freigabegruppe nicht löschen. Eine oder "
"mehre Freigabegruppen hängen davon ab."
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr ""
"Konnte Schattenkopie \"%s\" nicht löschen. Eine oder mehrere Freigaben sind "
"davon abhängig."
#, python-format
msgid "Unable to delete snapshot rule \"%s\"."
msgstr "Schattenkopie-Regel \"%s\" kann nicht gelöscht werden."
msgid "Unable to extend share."
msgstr "Konnte Freigabe nicht erweitern."
msgid "Unable to get information about share group type access."
msgstr ""
"Informationen über den Zugriff auf Gruppenfreigaben können nicht abgerufen "
"werden."
msgid "Unable to get information about share type access."
msgstr "Konnte Informationen über Freigabetypenzugriff nicht abrufen."
msgid "Unable to get list of projects."
msgstr "Konnte Projektliste nicht abrufen."
msgid "Unable to get manila default quota."
msgstr "Manila-Standardkontingent kann nicht abgerufen werden."
msgid "Unable to get the security services hosts"
msgstr "Konnte die Sicherheitsdienst-Hosts nicht abrufen"
#, python-format
msgid "Unable to get the specified share group '%s' for snapshot creation."
msgstr ""
"Konnte die Spezifikationen zur Gruppenfreigabe '%s' für "
"Schattenkopieerstellung nicht empfangen."
msgid "Unable to load the specified share group snapshot."
msgstr "Konnte spezifizierte Schattenkopie der Gruppenfreigabe nicht laden."
msgid "Unable to load the specified snapshot."
msgstr "Konnte angegebene Schattenkopie nicht laden."
msgid "Unable to manage share"
msgstr "Konnte Freigabe nicht verwalten"
#, python-format
msgid "Unable to migrate share %s."
msgstr "Konnte Freigabe %s nicht migrieren."
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr ""
"Kann den Fortschritt der Migration der Freigaben %s momentan nicht abrufen."
#, python-format
msgid "Unable to reset state of replica '%s'."
msgstr "Konnte Status des Replika %s nicht zurücksetzen."
#, python-format
msgid "Unable to reset status of replica '%s'."
msgstr "Konnte Status des Replika %s nicht zurücksetzen."
#, python-format
msgid "Unable to reset status of share group '%s'."
msgstr "Status der Gruppenfreigabe '%s' kann nicht zurückgesetzt werden."
#, python-format
msgid "Unable to reset status of share group snapshot '%s'."
msgstr "Konnte die Schattenkopie '%s' der Freigabegruppe nicht zurücksetzen."
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "Resynchronisieren von Replika '%s' nicht möglich ."
msgid "Unable to retrieve default share quotas."
msgstr "Standard-Freigaben-Kontingente können nicht abgerufen werden."
#, python-format
msgid "Unable to retrieve details of replica %s"
msgstr "Konnte Details der Replika '%s' nicht abrufen"
msgid "Unable to retrieve list of projects."
msgstr "Konnte Projektliste nicht abrufen"
msgid "Unable to retrieve quotas."
msgstr "Konnte Kontingente nicht abrufen."
#, python-format
msgid "Unable to retrieve replica '%s'."
msgstr "Konnte Replika '%s' nicht abrufen."
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "Konnte Details zu Sicherheitsdienst '%s' nicht abrufen."
msgid "Unable to retrieve security services"
msgstr "Konnte Sicherheitsdienste nicht abrufen"
msgid "Unable to retrieve security_service."
msgstr "Konnte Sicherheitsdienst nicht abrufen."
msgid "Unable to retrieve share details."
msgstr "Konnte Freigabendetails nicht abrufen."
#, python-format
msgid "Unable to retrieve share group '%s'."
msgstr "Gruppenfreigabe '%s' kann nicht abgerufen werden."
msgid "Unable to retrieve share group details."
msgstr "Gruppenfreigaben Details können nicht abgerufen werden."
#, python-format
msgid "Unable to retrieve share group snapshot '%s'."
msgstr "Freigabengruppe Schattenkopie '%s' kann nicht abgerufen werden."
msgid "Unable to retrieve share group snapshot details."
msgstr ""
"Konnte die Details der Schattenkopie der Gruppenfreigabe nicht abrufen."
msgid "Unable to retrieve share group snapshot list."
msgstr "Konnte die Liste der Schattenkopien der Freigabegruppen nicht abrufen."
msgid "Unable to retrieve share group snapshot."
msgstr "Konnte Schattenkopie der Gruppenfreigabe nicht empfangen."
msgid "Unable to retrieve share group snapshots."
msgstr "Konnte Schattenkopien der Gruppenfreigabe nicht empfangen."
msgid "Unable to retrieve share group types."
msgstr "Freigabengruppe Typen können nicht abgerufen werden."
msgid "Unable to retrieve share group."
msgstr "Konnte Gruppenfreigabe nicht abrufen"
msgid "Unable to retrieve share groups."
msgstr "Gruppenfreigaben können nicht abgerufen werden."
msgid "Unable to retrieve share instance details."
msgstr "Konnte Freigabeinstanzdetails nicht abrufen."
msgid "Unable to retrieve share instances."
msgstr "Konnte Freigabeinstanzen nicht abrufen"
msgid "Unable to retrieve share limit information."
msgstr "Konnte Informationen zu Freigabenlimits nicht abrufen."
msgid "Unable to retrieve share list."
msgstr "Konnte Liste der Freigaben nicht abrufen"
msgid "Unable to retrieve share network details."
msgstr "Konnte Details zum Freigabenetzwerk nicht abrufen."
msgid "Unable to retrieve share network."
msgstr "Konnte Freigabenetzwerk nicht abrufen."
msgid "Unable to retrieve share networks"
msgstr "Konnte Freigabenetzwerke nicht abrufen"
msgid "Unable to retrieve share quotas."
msgstr "Freigaben-Kontingente können nicht abgerufen werden."
msgid "Unable to retrieve share replicas."
msgstr "Konnte Freigaben-Replikas nicht abrufen."
msgid "Unable to retrieve share rules."
msgstr "Konnte Freigaberegeln nicht abrufen."
msgid "Unable to retrieve share server details."
msgstr "Konnte Details zum Freigabeserver nicht abrufen."
msgid "Unable to retrieve share servers"
msgstr "Konnte Freigabeserver nicht abrufen"
msgid "Unable to retrieve share snapshot list."
msgstr "Konnte Liste der geteilten Schattenkopien nicht abrufen."
msgid "Unable to retrieve share snapshot rules."
msgstr "Konnte Regeln für Freigabeschattenkopie nicht abrufen."
msgid "Unable to retrieve share snapshot."
msgstr "Konnte Freigabeschattenkopie nicht abrufen."
msgid "Unable to retrieve share snapshots list."
msgstr "Konnte Freigaben-Schattenkopieliste nicht abrufen."
msgid "Unable to retrieve share snapshots."
msgstr "Konnte freigegebene Schattenkopien nicht abrufen."
msgid "Unable to retrieve share types."
msgstr "Freigabetypen können nicht abgerufen werden."
msgid "Unable to retrieve share."
msgstr "Konnte Freigabe nicht abrufen."
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "Konnte Freigabe nicht abrufen. %s"
msgid "Unable to retrieve share_gruop_type."
msgstr "Konnte share_gruop_type nicht abrufen."
msgid "Unable to retrieve share_type."
msgstr "Konnte den Freigabetyp nicht abrufen."
msgid "Unable to retrieve snapshot details."
msgstr "Konnte Schattenkopiedetails nicht abrufen."
msgid "Unable to retrieve snapshot."
msgstr "Konnte Schattenkopie nicht abrufen."
msgid "Unable to retrieve volume details."
msgstr "Konnte Datenträgerdetails nicht abrufen."
msgid "Unable to revert share to the snapshot."
msgstr "Freigabe kann nicht auf Schattenkopie zurückgestellt werden."
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "Konnte Replika \"%s\" nicht auf aktiv setzen."
msgid "Unable to unmanage share."
msgstr "Konnte Verwaltung der Freigabe nicht aufheben"
#, python-format
msgid "Unable to update access for share group type \"%s\"."
msgstr ""
"Zugriff zum Gruppenfreigabetyp \"%s\" konnte nicht aktualisiert werden."
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "Konnte Zugriff für Freigabetyp \"%s\" nicht aktualisieren."
msgid "Unable to update default quotas."
msgstr "Konnte Standardkontingente nicht aktualisieren."
msgid "Unable to update extra_specs for share type."
msgstr "Konnte Extra-Spezifikationen für Freigabetyp nicht aktualisieren."
msgid "Unable to update group_specs for share group type."
msgstr ""
"Spezifikationen für Gruppenfreigabe Typ können nicht aktualisiert werden."
msgid "Unable to update security service."
msgstr "Konnte Sicherheitsdienst nicht aktualisieren."
msgid "Unable to update share group snapshot."
msgstr "Freigabegruppe Schattenkopie kann nicht aktualisiert werden."
msgid "Unable to update share group type."
msgstr "Gruppenfreigabetyp konnte nicht aktualisiert werden."
msgid "Unable to update share group."
msgstr "Konnte Gruppenfreigabe nicht aktualisieren."
msgid "Unable to update share metadata."
msgstr "Konnte Freigabe Metadaten nicht aktualisieren."
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "Konnte Freigabenetzwerk \"%s\" nicht aktualisieren."
msgid "Unable to update share network."
msgstr "Konnte Freigabenetzwerk nicht aktualisieren."
msgid "Unable to update share snapshot."
msgstr "Konnte Schattenkopie Gruppenfreigabe nicht aktualisieren."
msgid "Unable to update share type."
msgstr "Konnte Freigabetyp nicht aktualisieren."
msgid "Unable to update share."
msgstr "Konnte Freigabe nicht aktualisieren."
msgid "Unknown"
msgstr "Unbekannt"
msgid "Unmanage"
msgstr "Verwaltung aufheben"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "Fehlerverwaltung aufheben"
msgid "Unmanage Share"
msgstr "Verwaltung der Freigabe aufheben"
msgid "Update"
msgstr "Aktualisieren"
msgid "Update Share Group"
msgstr "Freigabegruppe aktualisieren"
msgid "Update Share Group Snapshot"
msgstr "Freigabegruppe Schattenkopie aktualisieren"
msgid "Update Share Group Type"
msgstr "Freigabengruppe Typ aktualisieren"
msgid "Update Share Network"
msgstr "Aktualisiere Freigabenetzwerk"
msgid "Update Share Snapshot"
msgstr "Aktualisiere Freigabeschattenkopie"
msgid "Update Share Type"
msgstr "Aktualisiere Freigabetyp"
msgid "Update Share group Type"
msgstr "Freigabengruppe Typ aktualisieren"
msgid "Update share network"
msgstr "Aktualisiere Freigabenetzwerk"
msgid "Updated"
msgstr "Aktualisiert"
msgid "Updated At"
msgstr "Aktualisiert um"
#, python-format
msgid "Updated access for share group type \"%s\"."
msgstr "Zugriff zum Gruppenfreigabetyp aktualisiert \"%s\"."
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "Zugriff für Freigabetyp \"%s\" aktualisiert."
#, python-format
msgid "Updated share network \"%s\"."
msgstr "Aktualisiere Freigabenetzwerk \"%s\"."
#, python-format
msgid "Updating share \"%s\""
msgstr "Aktualisiere Freigabe \"%s\""
#, python-format
msgid "Updating share group \"%s\""
msgstr "Aktualisiere Gruppenfreigabe \"%s\""
#, python-format
msgid "Updating share group snapshot \"%s\""
msgstr "Gruppenfreigabe Schattenkopie \"%s\" wird aktualisiert."
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "Aktualisiere Freigabe Metadaten \"%s\""
#, python-format
msgid "Updating share network \"%s\""
msgstr "Aktualisiere Freigabenetzwerk \"%s\""
#, python-format
msgid "Updating share snapshot \"%s\""
msgstr "Aktualisiere Schattenkopie Gruppenfreigabe \"%s\""
msgid "Use share group snapshot as a source"
msgstr "Benutze Gruppenfreigabe Schattenkopie als Quelle"
msgid "Use snapshot as a source"
msgstr "Benutze Schattenkopie als Quelle"
msgid "User"
msgstr "Benutzer"
msgid "Visibility"
msgstr "Sichtbarkeit"
msgid ""
"When a share is \"unmanaged\", the share will no longer be visible within "
"OpenStack. Note that the share will not be deleted.
This is "
"equivalent to the 'manila unmanage' command."
msgstr ""
"Wenn eine Freigabe \"nicht verwaltet\" ist, ist die Freigabe in OpenStack "
"nicht mehr sichtbar. Beachten Sie, dass die Freigabe nicht gelöscht wird. "
"
Dies entspricht dem Befehl 'manila unmanage' ."
msgid "Writable"
msgstr "Beschreibbar"
msgid "as Active?"
msgstr "als aktiv?"
msgid "key=value pairs per line can be set"
msgstr "Schlüssel=Wert Paare pro Zeile können gesetzt werden"
manila-ui-3.0.0/manila_ui/locale/id/ 0000775 0001750 0001750 00000000000 13647271736 017221 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/id/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021006 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/id/LC_MESSAGES/django.po 0000664 0001750 0001750 00000142541 13647271543 022613 0 ustar zuul zuul 0000000 0000000 # suhartono , 2016. #zanata
# Andreas Jaeger , 2017. #zanata
# suhartono , 2017. #zanata
# suhartono , 2018. #zanata
# suhartono , 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2020-04-15 19:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-03-12 06:13+0000\n"
"Last-Translator: suhartono \n"
"Language-Team: Indonesian\n"
"Language: id\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
msgid ""
"\"Manage\" an existing share from a Manila host. This will make the share "
"visible within OpenStack.
This is equivalent to the 'manila "
"manage' command."
msgstr ""
"\"Manage\" bagian yang ada dari Manila host. Ini akan membuat share terlihat "
"dalam OpenStack.
Ini sama dengan perintah 'manila manage' "
"tt>."
#, python-format
msgid "%(used)s of %(quota)s GiB Used"
msgstr "%(used)s of %(quota)s GiB Used"
#, python-format
msgid "%(used)s of %(quota)s Used"
msgstr "%(used)s of %(quota)s Used"
#, python-format
msgid "%sGiB"
msgstr "%sGiB"
msgid "(Quota exceeded)"
msgstr "(Kuota terlampaui)"
msgid "Access Key"
msgstr "Access Key (kunci akses)"
msgid "Access Level"
msgstr "Access Level (tingkat akses)"
msgid "Access Rules"
msgstr "Access Rules"
msgid "Access To"
msgstr "Access To (akses ke)"
msgid "Access Type"
msgstr "Access Type (tipe akses)"
msgid "Access to"
msgstr "Access to (akses ke)"
msgctxt "Current status of share network"
msgid "Active"
msgstr "Active (aktif)"
msgctxt "Current status of share server"
msgid "Active"
msgstr "Active (aktif)"
msgid "Add"
msgstr "Add (tambah)"
msgid "Add Rule"
msgstr "Add Rule (tambah aturan)"
msgid "Add Security Service"
msgstr "Add Security Service (tambah layanan keamanan)"
msgid "Add Share Snapshot Rule"
msgstr "Menambahkan Share Snapshot Rule"
msgid ""
"Add policy rule to snapshot, 'ip' rule represents ip address, 'user' rule "
"represents username or usergroup, 'cephx' rule represents ceph auth ID, and "
"'cert' rule represents certificate."
msgstr ""
"Tambahkan aturan kebijakan ke snapshot, aturan 'ip' mewakili alamat ip, "
"aturan 'user' mewakili nama pengguna atau grup pengguna, aturan 'cephx' "
"mewakili ID otentikasi ceph, dan aturan 'cert' mewakili sertifikat."
msgid "Add rule"
msgstr "Tambah aturan"
msgid "Add security services to share network."
msgstr "Menambahkan layanan keamanan untuk jaringan berbagi."
msgid "All keys and values must be in range from 1 to 255."
msgstr "Semua key dan nilai-nilai harus dalam kisaran 1 sampai 255."
msgid "All pairs that are in field for left are set for this metadata."
msgstr "Semua pasangan yang ada di field kiri ditetapkan untuk metadata ini."
msgid "All pairs that are in field for left are set for this share group type."
msgstr "Semua pasang yang ada di field kiri ditetapkan untuk tipe share group."
msgid "All pairs that are in field for left are set for this share type."
msgstr "Semua pasang yang ada di field kiri ditetapkan untuk tipe berbagi ini."
msgid "Allow project access to share group type."
msgstr "Izinkan akses proyek ke share group type."
msgid "Allow project access to share type."
msgstr "Membolehkan akses proyek untuk tipe share."
msgid "At least one security service must be specified."
msgstr "Setidaknya satu layanan keamanan harus ditentukan."
msgid "At least one share type must be specified."
msgstr "Setidaknya satu share type harus ditentukan."
msgid "Availability Zone"
msgstr "Availability Zone (zona ketersediaan)"
msgid "Availability zone"
msgstr "Zona ketersediaan"
msgctxt "Current status of replica"
msgid "Available"
msgstr "Available (tersedia)"
msgctxt "Current status of share"
msgid "Available"
msgstr "Available (tersedia)"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "Available (tersedia)"
msgid "Available networks"
msgstr "Jaringan yang tersedia"
msgid "Available projects"
msgstr "Proyek yang tersedia"
msgid "Available security services"
msgstr "Layanan keamanan yang tersedia"
msgid "Cancel"
msgstr "Cancel"
msgid "Cancel Migration"
msgstr "Cancel Migration (pembatalan migrasi)"
msgid "Cancel migration"
msgstr "Membatalkan migrasi"
msgid "Cancel migration of a Share"
msgstr "Pembatalan migrasi share "
msgid ""
"Cancel migration of a migrating share.
This is equivalent to the "
"'manila migration-cancel' command."
msgstr ""
"Batalkan migrasi dari bagian yang bermigrasi.
Ini sama dengan "
"perintah 'manila migration-cancel' ."
msgid "Choose a snapshot"
msgstr "Pilih snapshot"
msgid "Complete Migration"
msgstr "Complete Migration (menyelsaikan migrasi)"
msgid "Complete migration"
msgstr "Migrasi lengkap"
msgid "Complete migration of a Share"
msgstr "Menyelesaikan migrasi share"
msgid ""
"Complete migration of a migrating share to another Manila host. This "
"operation is expected to be disruptive.
This is equivalent to the "
"'manila migration-complete' command."
msgstr ""
"Migrasi lengkap dari bagian yang bermigrasi ke host lain di Manila. Operasi "
"ini diperkirakan akan mengganggu.
Ini sama dengan perintah "
"'manila migrasi-complete' ."
msgid "Confirm Migration Cancelling of Share"
msgstr ""
"Confirm Migration Cancelling of Share (mengkonfirmasi pembatalan migrasi "
"share)"
msgid "Confirm Migration Completion of Share"
msgstr ""
"Confirm Migration Completion of Share (mengkonfirmasi penyelesaian migrasi "
"share)"
msgid "Confirm Obtaining migration progress of Share"
msgstr "Konfirmasi perolehan kemajuan migrasi share"
msgid "Confirm Password"
msgstr "Confirm Password (konfirmasi sandi)"
msgid "Confirm Unmanage Share"
msgstr "Confirm Unmanage Share (Konfirmasi share yang tidak dikelola)"
msgid "Create"
msgstr "Create (buat)"
msgid "Create Group Share Type"
msgstr "Create Group Share Type"
msgid "Create Replica"
msgstr "Create Replica (buat replika)"
msgid "Create Security Service"
msgstr "Create Security Service (buat layanan keamanan)"
msgid "Create Share"
msgstr "Create Share (buat share)"
msgid "Create Share Group"
msgstr "Membuat Share Group"
msgid "Create Share Group Snapshot"
msgstr "Membuat Share Group Snapshot"
msgid "Create Share Group Type"
msgstr "Membuat Share Group Type"
msgid "Create Share Network"
msgstr "Create Share Network (Buat jaringan berbagi)"
msgid "Create Share Replica"
msgstr "Create Share Replica"
msgid "Create Share Snapshot"
msgstr "Create Share Snapshot (buat snapshot berbagi)"
msgid "Create Share Type"
msgstr "Create Share Type (membuat tipe share)"
msgid "Create a Share"
msgstr "Create a Share (Buat share)"
msgid "Create share replica in specific availability zone."
msgstr "Buat replika berbagi di zona ketersediaan tertentu."
msgid "Created"
msgstr "Created"
msgid "Created At"
msgstr "Created At"
msgid "Created at"
msgstr "Dibuat di"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "Creating (Pembuatan)"
msgctxt "Current status of share"
msgid "Creating"
msgstr "Creating (pembuatan)"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "Creating (pembuatan)"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "Creating (pembuatan)"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "Menciptakan replika untuk berbagi \"%s\"."
#, python-format
msgid "Creating rule for \"%s\""
msgstr "Membuat aturan untuk \"%s\""
#, python-format
msgid "Creating share \"%s\""
msgstr "Pembuatan share \"%s\""
#, python-format
msgid "Creating share group \"%s\""
msgstr "Membuat share group \"%s\""
#, python-format
msgid "Creating share group snapshot \"%s\"."
msgstr "Membuat share group snapshot \"%s\"."
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "Pembuatan snapshot berbagi \"%s\"."
#, python-format
msgid "Creating snapshot rule for \"%s\""
msgstr "Membuat aturan snapshot untuk \"%s\""
msgid "Current Size (GiB)"
msgstr "Current Size (ukuran saat ini) (GiB)"
msgid "DNS IP"
msgstr "DNS IP"
msgid "Delete Replica"
msgid_plural "Delete Replicas"
msgstr[0] "Delete Replica"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Delete Rule"
msgid "Delete Security Service"
msgid_plural "Delete Security Services"
msgstr[0] "Delete Security Service"
msgid "Delete Share"
msgid_plural "Delete Shares"
msgstr[0] "Delete Share"
msgid "Delete Share Group"
msgid_plural "Delete Share Groups"
msgstr[0] "Delete Share Group"
msgid "Delete Share Group Snapshot"
msgid_plural "Delete Share Group Snapshots"
msgstr[0] "Delete Share Group Snapshot"
msgid "Delete Share Group Type"
msgid_plural "Delete Share Group Types"
msgstr[0] "Delete Share Group Type"
msgid "Delete Share Network"
msgid_plural "Delete Share Networks"
msgstr[0] "Delete Share Network"
msgid "Delete Share Server"
msgid_plural "Delete Share Server"
msgstr[0] "Delete Share Server"
msgid "Delete Share Snapshot"
msgid_plural "Delete Share Snapshots"
msgstr[0] "Delete Share Snapshot"
msgid "Delete Share Snapshot Rule"
msgid_plural "Delete Share Snapshot Rules"
msgstr[0] "Delete Share Snapshot Rule"
msgid "Delete Share Type"
msgid_plural "Delete Share Types"
msgstr[0] "Delete Share Type"
msgid "Delete Snapshot"
msgid_plural "Delete Snapshots"
msgstr[0] "Delete Snapshot"
msgid "Deleted Replica"
msgid_plural "Deleted Replicas"
msgstr[0] "Deleted Replica"
msgid "Deleted Rule"
msgid_plural "Deleted Rules"
msgstr[0] "Deleted Rule"
msgid "Deleted Security Service"
msgid_plural "Deleted Security Services"
msgstr[0] "Deleted Security Service"
msgid "Deleted Share"
msgid_plural "Deleted Shares"
msgstr[0] "Deleted Share"
msgid "Deleted Share Group"
msgid_plural "Deleted Share Groups"
msgstr[0] "Deleted Share Group"
msgid "Deleted Share Group Snapshot"
msgid_plural "Deleted Share Group Snapshots"
msgstr[0] "Deleted Share Group Snapshot"
msgid "Deleted Share Group Type"
msgid_plural "Deleted Share Group Types"
msgstr[0] "Deleted Share Group Type"
msgid "Deleted Share Network"
msgid_plural "Deleted Share Networks"
msgstr[0] "Deleted Share Network"
msgid "Deleted Share Server"
msgid_plural "Deleted Share Server"
msgstr[0] "Deleted Share Server"
msgid "Deleted Share Snapshot"
msgid_plural "Deleted Share Snapshots"
msgstr[0] "Deleted Share Snapshot"
msgid "Deleted Share Snapshot Rule"
msgid_plural "Deleted Share Snapshot Rules"
msgstr[0] "Deleted Share Snapshot Rule"
msgid "Deleted Share Type"
msgid_plural "Deleted Share Types"
msgstr[0] "Deleted Share Type"
msgid "Deleted Snapshot"
msgid_plural "Deleted Snapshots"
msgstr[0] "Deleted Snapshot"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "Deleting"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "Deleting (penghapusan)"
msgid "Description"
msgstr "Deskripsi"
msgid "Description:"
msgstr "Deskripsi:"
msgid "Destination host and pool where share will be migrated to."
msgstr "Host tujuan dan ke kolam dimana share akan bermigrasi."
msgid "Domain"
msgstr "Domain"
msgid "Driver handles share servers"
msgstr "Driver menangani server share"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "Opsi driver ('volume_id' untuk driver Generic, dll ...)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "Key duplikat '%s'."
msgid "Edit"
msgstr "Edit (perbaharui)"
msgid "Edit Security Service"
msgstr "Edit Security Service (perbaharui layanan keamanan)"
msgid "Edit Share"
msgstr "Edit Share (perbaharui share)"
msgid "Edit Share Metadata"
msgstr "Edit Share Metadata (mengedit metadata berbagi)"
msgid "Edit Share Network"
msgstr "Edit Share Network (mengedit jaringan berbagi)"
msgid "Edit Share Snapshot"
msgstr "Edit Share Snapshot"
msgid "Edit Share network"
msgstr "Edit jaringan berbagi"
msgid ""
"Enforces migration of the share snapshots to the destination. If set to "
"True, host-assisted migration will not be attempted."
msgstr ""
"Memberlakukan migrasi dari snapshot share ke tujuan. Jika diatur ke True, "
"migrasi host-assisted tidak akan diusahakan."
msgid ""
"Enforces migration to be nondisruptive. If set to True, host-assisted "
"migration will not be attempted."
msgstr ""
"Memberlakukan migrasi menjadi nondisruptive. Jika diatur ke True, migrasi "
"host-assisted tidak akan diusahakan."
msgid ""
"Enforces migration to keep the share writable while contents are being "
"moved. If set to True, host-assisted migration will not be attempted."
msgstr ""
"Memberlakukan migrasi untuk menjaga share dapat ditulis sementara isinya "
"dipindahkan. Jika diatur ke True, migrasi host-assisted tidak akan "
"diusahakan."
msgid ""
"Enforces migration to preserve all file metadata when moving its contents. "
"If set to True, host-assisted migration will not be attempted."
msgstr ""
"Memberlakukan migrasi untuk melestarikan semua metadata file yang ketika "
"bergerak isinya. Jika diatur ke True, migrasi host-assisted tidak akan "
"diusahakan."
msgid ""
"Enforces the use of the host-assisted migration approach, which bypasses "
"driver optimizations."
msgstr ""
"Memberlakukan penggunaan pendekatan migrasi host-assisted, yang melewati "
"optimasi driver."
msgctxt "Current status of replica"
msgid "Error"
msgstr "Error (kesalahan)"
msgctxt "Current status of share"
msgid "Error"
msgstr "Error (kesalahan)"
msgctxt "Current status of share network"
msgid "Error"
msgstr "Error (kesalahan)"
msgctxt "Current status of share server"
msgid "Error"
msgstr "Error (kesalahan)"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "Error (kesalahan)"
msgid "Expected only pairs of key=value."
msgstr "Diharapkan hanya pasang key=value."
msgid "Export location"
msgstr "Lokasi ekspor"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr "Lokasi ekspor share. misalnya untuk NFS: 1.2.3.4:/path/to/share"
msgid "Export locations"
msgstr "Lokasi ekspor"
msgid "Extend"
msgstr "Extend (memperluas)"
msgid "Extend Share"
msgstr "Extend Share (memperluas share)"
#, python-format
msgid "Extend share \"%s\""
msgstr "Memperluas share \"%s\""
msgid "Extend the size of a share. "
msgstr "Perluas ukuran satu share."
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "Extending Error (kesalahan meluas)"
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"Extra spec 'driver_handles_share_servers' diperlukan dan harus memiliki "
"nilai boolean."
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"Ekstra spec 'driver_handles_share_servers' diperlukan dan harus memiliki "
"nilai boolean."
msgid "Extra specs"
msgstr "Spesifikasi tambahan"
msgid "Force Host Assisted Migration"
msgstr "Force Host Assisted Migration"
msgid "From here you can modify name and description of a security service."
msgstr "Dari sini Anda bisa memodifikasi nama dan deskripsi layanan keamanan."
msgid ""
"From here you can modify name and description of a share group snapshot."
msgstr ""
"Dari sini Anda dapat memodifikasi nama dan deskripsi dari sebuah snapshot "
"kelompok saham."
msgid "From here you can modify name and description of a share network."
msgstr "Dari sini Anda bisa memodifikasi nama dan deskripsi jaringan berbagi."
msgid "From here you can modify name and description of a snapshot."
msgstr "Dari sini Anda bisa memodifikasi nama dan deskripsi sebuah snapshot."
msgid ""
"From here you can modify name, description and visibility of a share group."
msgstr ""
"Dari sini Anda dapat memodifikasi nama, deskripsi dan visibilitas grup "
"berbagi."
msgid "From here you can modify name, description and visibility of a share."
msgstr ""
"Dari sini Anda dapat mengubah nama, deskripsi dan visibilitas suatu share."
msgid "From here you can revert the share to its latest snapshot."
msgstr "Dari sini Anda dapat mengembalikan share ke snapshot terbarunya."
msgid "From here you can update share network info. "
msgstr "Dari sini Anda dapat memperbarui informasi jaringan berbagi."
msgid "From here you can update the default share quotas (max limits)."
msgstr "Dari sini Anda dapat memperbarui kuota share default (batas maksimal)."
msgid "Get Migration Progress"
msgstr "Get Migration Progress"
msgid "Get migration progress"
msgstr "Dapatkan kemajuan migrasi"
msgid "GiB"
msgstr "GiB"
msgid ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgstr ""
"Punya nilai yang tidak benar untuk kolom 'driver_options'. Diharapkan hanya "
"pasangan kunci = nilai (key=value)"
msgid "Group specs"
msgstr "Group specs"
msgid "Here can be modified extra-specs for share type."
msgstr "Disini bisa dimodifikasi extra-specs untuk tipe berbagi."
msgid "Here can be modified group-specs for share group type."
msgstr "Disini bisa dimodifikasi group-specs untuk share group type."
msgid "Host"
msgstr "Host"
msgid "Host of share"
msgstr "Host share"
msgid "Host to migrate share"
msgstr "Host memigrasikan share"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr "Host dimana share berada, misalnya: some.host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP Version"
msgid "Id"
msgstr "Id"
#, python-format
msgid ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgstr ""
"Pengaturan nilai yang tidak benar untuk spesifikasi tambahan yang "
"diperlukan 'spec_driver_handles_share_servers'. Nilai yang diperbolehkan "
"adalah %s. Case insensitive."
msgctxt "Current status of share server"
msgid "In-use"
msgstr "In-use"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "In-use"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "Inactive (tidak aktif)"
#, python-format
msgid "Key '%s' has improper length."
msgstr "Key '%s' memiliki panjang yang tidak benar."
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "Key tidak bisa berisi spasi. Lihat string '%s'."
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "Key harus tidak mengandung spasi. Kesalahan dalam '%s'."
msgid "Limit"
msgstr "Limit"
msgid "Make visible for all"
msgstr "Membuat terlihat untuk semuanya"
msgid "Manage"
msgstr "Manage (mengelola)"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "Manage Error (mengelola kesalahan)"
msgid "Manage Replicas"
msgstr "Manage Replicas (mengelola replika)"
msgid "Manage Rules"
msgstr "Manage Rules (mengelola aturan)"
msgid "Manage Share"
msgstr "Manage Share (mengelola share)"
msgid "Manage Share Group Type Access"
msgstr "Mengelola Share Group Type Access"
msgid "Manage Share Snapshot Rules"
msgstr "Mengelola Share Snapshot Rules"
msgid "Manage Share Type Access"
msgstr "Manage Share Type Access (mengelola akses tipe share)"
msgid "Metadata"
msgstr "Metadata"
msgid "Migrate Share"
msgstr "Migrate Share (migrasi share)"
msgid "Migrate a Share"
msgstr "Migrate a Share (memigrasi share)"
msgid ""
"Migrate an existing share to another Manila host. This will move all your "
"share data from one host to another.
This is equivalent to the "
"'manila migration-start' command."
msgstr ""
"Bermigrasi bagian yang ada ke host lain di Manila. Ini akan memindahkan "
"semua data berbagi Anda dari satu host ke host lain.
Ini sama "
"dengan perintah 'manila migration-start' ."
msgctxt "Current status of share"
msgid "Migrating"
msgstr "Migrating (migrasi)"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "Bermigrasi ke"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "Migrasi dari share %(name)s berada pada %(progress)s persen."
msgid "Mount snapshot support"
msgstr "Dukungan mount snapshot"
msgid "Name"
msgstr "Name (nama)"
msgid "Net Details"
msgstr "Net Details"
msgid "Network"
msgstr "Network"
msgid "Network Type"
msgstr "Network Type (tipe jaringan)"
msgid "Networks"
msgstr "Networks (jaringan)"
msgid "Neutron Net"
msgstr "Neutron Net"
msgid "Neutron Subnet"
msgstr "Neutron Subnet (subnet Neutron)"
msgid "New Size (GiB)"
msgstr "New Size (ukuran baru) (GiB)"
msgid "New share network to be set in migrated share"
msgstr "Jaringan share baru yang akan ditetapkan di share bermigrasi"
msgid "New share type to be set in migrating share"
msgstr "Jenis share baru yang akan diatur dalam migrasi share"
msgid "New size must be greater than current size."
msgstr ""
"Ukuran baru (new size) harus lebih besar dari ukuran saat ini (current size)."
msgid "No projects found."
msgstr "Tidak ada proyek yang ditemukan."
msgid "No projects selected."
msgstr "Tidak ada proyek yang dipilih."
msgid "No security services found."
msgstr "Tidak ada layanan keamanan ditemukan."
msgid "No security services selected."
msgstr "Tidak ada layanan keamanan yang dipilih."
msgid "No source, empty share"
msgstr "Tidak ada sumber, share kosong"
msgid "No source, empty share group"
msgstr "Tidak ada sumber, kosong share group"
msgid "Nondisruptive"
msgstr "Nondisruptive"
msgid "Nova Net"
msgstr "Nova Net"
msgid "Number of Share Snapshots"
msgstr "Number of Share Snapshots"
msgid "Number of Shares"
msgstr "Number of Shares"
msgid "Obtain Progress"
msgstr "Obtain Progress (mendapatkan kemajuan)"
msgid "Obtain migration progress of a Share"
msgstr "Mendapatkan kemajuan migrasi share"
msgid ""
"Obtains migration progress of a migrating share.
This is "
"equivalent to the 'manila migration-get-progress' command."
msgstr ""
"Dapatkan kemajuan migrasi dari bagian yang bermigrasi.
Ini sama "
"dengan perintah 'manila migration-get-progress' ."
msgid "One line - one action. Empty strings will be ignored."
msgstr "One line - one action. String kosong akan diabaikan."
msgid "Overview"
msgstr "Overview (ikhtisar)"
msgid "Password"
msgstr "Password (sandi)"
msgid "Passwords do not match."
msgstr "Sandi tidak cocok"
msgid "Placeholder for description of share group type access managing form."
msgstr ""
"Placeholder untuk deskripsi bentuk pengelolaan akses tipe grup berbagi."
msgid "Placeholder for description of share type access managing form."
msgstr "Placeholder untuk deskripsi bentuk pengelolaan akses tipe berbagi."
msgid "Preserve Metadata"
msgstr "Preserve Metadata (pertahankan metadata)"
msgid "Preserve Snapshots"
msgstr "Preserve Snapshots"
msgid "Project"
msgstr "Project (proyek)"
msgid "Projects with access to share group type"
msgstr "Proyek dengan akses keshare group type"
msgid "Projects with access to share type"
msgstr "Proyek dengan akses untuk tipe share"
msgid "Protocol"
msgstr "Protocol (protokol)"
msgid "Public"
msgstr "Public (publik)"
msgid "Quota Name"
msgstr "Quota Name"
msgid "Replica Details"
msgstr "Replica Details"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "Rincian replika: %(replica_display_name)s"
msgid "Replica State"
msgstr "Replica State (keadaan replika)"
msgid "Replica state"
msgstr "Replica state"
msgid "Replicas"
msgstr "Replicas (replika)"
msgid "Reset Replica State"
msgstr "Reset Replica State (mengatur ulang keadaan replika)"
msgid "Reset Replica Status"
msgstr "Reset Replica Status (menyetel ulang status replika)"
msgid "Reset Share Group Snapshot Status"
msgstr "Reset Share Group Snapshot Status"
msgid "Reset Share Group Status"
msgstr "Reset Share Group Status"
msgid "Reset Status"
msgstr "Reset Status"
msgid "Reset replica state"
msgstr "Mengatur ulang keadaan replika"
msgid "Reset replica status"
msgstr "Mengatur ulang status replika"
msgid "Reset share replica's state with ID"
msgstr "Setel ulang status replika berbagi dengan ID"
msgid "Reset share replica's status with ID"
msgstr "Setel ulang status replika berbagi dengan ID"
msgid "Reset state"
msgstr "Reset state (mengatur slang status)"
msgid "Reset status"
msgstr "Mengatur ulang status"
#, python-format
msgid "Reseting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
msgstr "Atur ulang replika ('%(id)s') keadaan dari '%(from)s' ke '%(to)s'."
#, python-format
msgid "Reseting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "Atur ulang replika ('%(id)s') status dari '%(from)s' ke'%(to)s'."
#, python-format
msgid "Reseting share group ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Menyetel ulang status share group ('%(id)s') dari '%(from)s' ke '%(to)s'."
#, python-format
msgid ""
"Reseting share group snapshot ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr ""
"Menyetel ulang status share group snapshot ('%(id)s') dari '%(from)s' ke "
"'%(to)s'."
msgid "Resync"
msgstr "Resync"
msgid "Resync Replica"
msgstr "Resync Replica"
msgid "Resync replica"
msgstr "Resync replika"
msgid "Resync share replica with ID"
msgstr "Resync (resinkronkan) replika berbagi dengan ID"
#, python-format
msgid "Resync'ing replica '%s'"
msgstr "Resync'ing replika '%s'"
msgid "Revert Share"
msgstr "Kembalikan Berbagi"
msgid "Revert Share to a Snapshot"
msgstr "Kembalikan Berbagi ke Snapshot"
msgid "Revert share to a snapshot"
msgstr "Kembalikan berbagi ke snapshot"
msgctxt "Current status of share"
msgid "Reverting Error"
msgstr "Mengembalikan Kesalahan"
msgid "Rules"
msgstr "Rules (aturan)"
msgid "Save Changes"
msgstr "Save Changes (simpan perubahan)"
msgid "Security Service Details"
msgstr "Security Service Details "
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "Rincian layanan keamanan: %(service_display_name)s"
msgid "Security Service Overview"
msgstr "Security Service Overview"
msgid "Security Services"
msgstr "Security Services (layanan keamanan)"
msgid "Security services within share network"
msgstr "layanan keamanan dalam jaringan berbagi"
msgid "Segmentation Id"
msgstr "Segmentation Id (segmentasi Id)"
msgid "Select parameters of share group you want to create. "
msgstr "Pilih parameter dari grup berbagi yang ingin Anda buat."
msgid "Select parameters of share you want to create. "
msgstr "Pilih parameter share yang ingin Anda buat."
msgid "Selected Networks"
msgstr "Selected Networks"
msgid "Selected Projects"
msgstr "Selected Projects"
msgid "Selected projects"
msgstr "Proyek yang dipilih"
msgid "Selected security services"
msgstr "layanan keamanan terpilih"
msgid "Server"
msgstr "Server"
msgid "Set Replica as Active"
msgstr "Menetapkan replika menjadi aktif"
msgid "Set as Active"
msgstr "Set as Active (Atur ke aktif)"
msgid "Set maximum quotas for the project."
msgstr "Menetapkan kuota maksimum untuk proyek tersebut."
msgid "Set share replica with ID"
msgstr "Tetapkan replika berbagi dengan ID"
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "Pengaturan replika \"%s\" aktif ..."
msgid "Share"
msgstr "Share"
#, python-format
msgid "Share \"%(s)s\" has been reverted to \"%(ss)s\" snapshot successfully"
msgstr "Berbagi \"%(s)s\" has been reverted to \"%(ss)s\" snapshot berhasil"
msgid "Share Details"
msgstr "Share Details"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "Share Details (rincian share): %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "Rincian share: %(share_name)s"
msgid "Share Group"
msgstr "Share Group"
msgid "Share Group Details"
msgstr "Share Group Details"
#, python-format
msgid "Share Group Details: %s"
msgstr "Share Group Details: %s"
msgid "Share Group Name"
msgstr "Share Group Name"
msgid "Share Group Overview"
msgstr "Share Group Overview"
msgid "Share Group Snapshot"
msgstr "Share Group Snapshot"
msgid "Share Group Snapshot Details"
msgstr "Share Group Snapshot Details"
#, python-format
msgid "Share Group Snapshot Details: %(sgs_display_name)s"
msgstr "Share Group Snapshot Details: %(sgs_display_name)s"
msgid "Share Group Snapshot Overview"
msgstr "Share Group Snapshot Overview"
msgid "Share Group Snapshots"
msgstr "Share Group Snapshots"
msgid "Share Group Type"
msgstr "Share Group Type"
msgid "Share Group Types"
msgstr "Share Group Types"
msgid "Share Groups"
msgstr "Share Groups"
msgid "Share ID"
msgstr "Share ID"
msgid "Share Instance Details"
msgstr "Share Instance Details"
#, python-format
msgid "Share Instance Details: %s"
msgstr "Share Instance Details (rincian instance berbagai): %s"
msgid "Share Instance Overview"
msgstr "Share Instance Overview"
msgid "Share Instances"
msgstr "Share Instances (instance berbagi)"
msgid "Share Limits"
msgstr "Share Limits"
msgid "Share Name"
msgstr "Share Name"
msgid "Share Network"
msgstr "Share Network (jaringan berbagi)"
msgid "Share Network Details"
msgstr "Share Network Details"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr ""
"Share Network Details (rincian jaringan berbagi): %(network_display_name)s"
msgid "Share Network Info"
msgstr "Share Network Info (info jaringan berbagi)"
msgid "Share Network Overview"
msgstr "Share Network Overview"
msgid "Share Networks"
msgstr "Share Networks (jaringan berbagi)"
msgid "Share Overview"
msgstr "Share Overview"
msgid "Share Protocol"
msgstr "Share Protocol (protokol share)"
msgid "Share Quotas"
msgstr "Share Quotas"
msgid "Share Replica Overview"
msgstr "Share Replica Overview"
msgid "Share Replicas"
msgstr "Share Replicas (replika berbagi)"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr " Replika berbagi: %(share_display_name)s"
msgid "Share Rules"
msgstr "Share Rules"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "Share Rules (aturan share): %(share_display_name)s"
msgid "Share Server"
msgstr "Share Server"
msgid "Share Server Details"
msgstr "Share Server Details"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "Share Server Details (rincian server berbagi): %(server_name)s"
msgid "Share Server Id"
msgstr "Share Server Id"
msgid "Share Server Overview"
msgstr "Share Server Overview"
msgid "Share Servers"
msgstr "Share Servers (server berbagi)"
msgid "Share Snapshot Details"
msgstr "Share Snapshot Details"
msgid "Share Snapshot Name"
msgstr "Share Snapshot Name"
msgid "Share Snapshot Overview"
msgstr "Share Snapshot Overview"
msgid "Share Snapshot Rules"
msgstr "Share Snapshot Rules"
msgid "Share Snapshots"
msgstr "Share Snapshots (snapshots bersama)"
msgid "Share Snapshots Storage"
msgstr "Share Snapshots Storage (penyimpanan snapshot bersama)"
msgid ""
"Share Snapshots are used for storing share changes and creating shares. "
msgstr ""
"Share Snapshots digunakan untuk menyimpan perubahan share dan membuat share."
msgid "Share Source"
msgstr "Share Source (berbagi sumber)"
msgid "Share Storage"
msgstr "Share Storage (penyimpanan bersama)"
msgid "Share Type"
msgstr "Share Type (tipe share)"
msgid "Share Types"
msgstr "Share Types (tipe share)"
msgid "Share Types (multiple available)"
msgstr "Share Types (multiple available)"
msgid "Share Types (one available)"
msgstr "Share Types (one available)"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"Share tidak dapat diperpanjang untuk %(req)iGiB karena Anda hanya memiliki "
"%(avail)iGiB dari kuota Anda yang tersedia."
msgid "Share gigabytes"
msgstr "Berbagi gigabyte"
msgid "Share name to be assigned"
msgstr "Nama share yang akan ditetapkan"
msgid "Share network"
msgstr "Bagikan jaringan"
msgid ""
"Share networks contain network data, that will be used for creation of "
"service VM, where will be hosted shares."
msgstr ""
"Jaringan berbagi berisi data jaringan, yang akan digunakan untuk pembuatan "
"VM layanan, tempat berbagi host."
#, python-format
msgid "Share replica %s has been deleted."
msgstr "Berbagi replika %s sudah dihapus."
msgid "Share server"
msgstr "Bagikan server"
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr ""
"Ukuran berbagi (share size) harus sama atau lebih besar dari ukuran snapshot "
"(%sGiB)"
msgid "Share snapshot gigabytes"
msgstr "Berbagi snapshot gigabyte"
msgid "Share snapshots"
msgstr "Berbagi snapshot"
msgid "Share type"
msgstr "Share type"
msgid "Share types"
msgstr "Share types"
msgid "Shared Quotas"
msgstr "Shared Quotas"
msgid "Shares"
msgstr "Shares"
msgid "Shares Networks"
msgstr "Shares Networks (jaringan bersama)"
msgid "Shares on this server"
msgstr "Berbagi di server ini"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "Size (ukuran)"
msgid "Size (GiB)"
msgstr "Size (GiB)"
msgid "Snapshot"
msgstr "Snapshot"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "Snapshot Details (rincian snapshot) : %(snapshot_display_name)s"
msgid "Snapshot ID"
msgstr "Snapshot ID"
msgid "Snapshot Overview"
msgstr "Snapshot Overview (ikhtisar snapshot)"
#, python-format
msgid "Snapshot Rules: %(snapshot_display_name)s"
msgstr "Snapshot Rules (aturan snapshot): %(snapshot_display_name)s"
msgid "Source"
msgstr "Source (sumber)"
msgid "Source SG Snapshot"
msgstr "Source SG Snapshot"
msgid "Source Share Group"
msgstr "Source Share Group"
msgid "Source Share Group Snapshot"
msgstr "Source Share Group Snapshot"
msgid "Source Type"
msgstr "Source Type"
msgid "Source share group snapshot"
msgstr "Snapshot kelompok berbagi sumber"
msgid ""
"Specify the new share network for the share. Do not specify this parameter "
"if the migrating share has to be retained within its current share network."
msgstr ""
"Tentukan jaringan share baru untuk berbagi. Jangan menentukan parameter ini "
"jika share yang bermigrasi harus dipertahankan dalam jaringan share saat ini."
msgid ""
"Specify the new share type for the share. Do not specify this parameter if "
"the migrating share has to be retained with its current share type."
msgstr ""
"Tentukan tipe share baru untuk berbagi. Tidak menentukan parameter ini jika "
"share yang bermigrasi harus dipertahankan dengan tipe share saat ini."
msgid "Specs"
msgstr "Specs"
msgid "Start migration"
msgstr "Start migration (memulai migrasi)"
msgid "Status"
msgstr "Status"
msgid "Submit"
msgstr "Submit"
msgid "Subnet"
msgstr "Subnet"
#, python-format
msgid "Successfully created security service: %s"
msgstr "Berhasil menciptakan layanan keamanan: %s"
#, python-format
msgid "Successfully created share group type: %s"
msgstr "Berhasil membuat share group type: %s"
#, python-format
msgid "Successfully created share network: %s"
msgstr "Berhasil menciptakan jaringan bersama (share) :%s"
#, python-format
msgid "Successfully created share type: %s"
msgstr "Berhasil menciptakan tipe share: %s"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr "Berhasil mengirim permintaan untuk membatalkan migrasi share: %s."
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr "Berhasil dikirim permintaan untuk menyelesaikan migrasi share: %s."
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "Berhasil dikirim permintaan untuk mengelola share: %s"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "Berhasil dikirim permintaan memigrasikan share: %s."
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr ""
"Berhasil mengirimkan permintaan untuk tidak mengelola (unmanaged) share: %s"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "Berhasil diperbarui spesifikasi tambahan untuk tipe share '%s'."
#, python-format
msgid "Successfully updated group specs for share group type '%s'."
msgstr "Spesifikasi grup yang berhasil diperbarui untuk share group type '%s'."
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "layanan keamanan berhasil diperbarui \"%s\""
msgid "Task state"
msgstr "Status tugas"
msgid ""
"The security service can be used by backend drivers to configure clients, "
"for more secure using of share."
msgstr ""
"Layanan keamanan dapat digunakan oleh driver backend untuk mengkonfigurasi "
"klien, untuk penggunaan berbagi yang lebih aman."
msgid ""
"The share group type defines the characteristics of a share group backend."
msgstr "Tipe share groupi mendefinisikan karakteristik share group backend."
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr ""
"Ukuran berbagi (share size) tidak bisa kurang dari ukuran snapshot (%sGiB)"
msgid "The share type defines the characteristics of a share backend."
msgstr "Tipe share mendefinisikan karakteristik share backend."
msgid "To add extra-specs use:"
msgstr "Untuk menambahkan penggunaan extra-specs:"
msgid "To add group-specs use:"
msgstr "Untuk menambahkan penggunaan group-specs:"
msgid "To add metadata use:"
msgstr "Untuk menambahkan penggunaan metadata:"
msgid "To unset extra-specs use:"
msgstr "Untuk tidak mengatur penggunaan extra-specs:"
msgid "To unset group-specs use:"
msgstr "Untuk tak mengatur penggunaan group-specs:"
msgid "To unset metadata use:"
msgstr "Untuk tanpa mengatur penggunaan metadata:"
msgid "Total Gibibytes"
msgstr "Total Gibibytes"
msgid "Type"
msgstr "Type (tipe)"
msgid "Unable to add rule."
msgstr "Tidak dapat menambahkan aturan."
msgid "Unable to add snapshot rule."
msgstr "Tidak dapat menambahkan aturan snapshot."
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr "Tidak dapat membatalkan migrasi share %s saat ini."
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "Tidak dapat menyelesaikan migrasi share %s."
msgid "Unable to create security service."
msgstr "Tidak dapat membuat layanan keamanan."
msgid "Unable to create share group snapshot."
msgstr "Tidak dapat membuat share group snapshot."
msgid "Unable to create share group type."
msgstr "Tidak dapat membuat share group type."
msgid "Unable to create share group."
msgstr "Tidak dapat membuat share group."
msgid "Unable to create share network."
msgstr "Tidak dapat membuat jaringan berbagi (share)."
msgid "Unable to create share replica."
msgstr "Tidak dapat membuat replika share."
msgid "Unable to create share snapshot."
msgstr "Tidak dapat membuat snapshot berbagi."
msgid "Unable to create share type."
msgstr "Tidak dapat membuat tipe share"
msgid "Unable to create share."
msgstr "Tidak dapat membuat share."
#, python-format
msgid "Unable to create share. %s"
msgstr "Tidak dapat membuat share. %s"
#, python-format
msgid "Unable to delete replica \"%s\"."
msgstr "Tidak dapat menghapus replika \"%s\"."
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "Tidak dapat menghapus aturan \"%s\"."
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "Tidak dapat menghapus share \"%s\". "
#, python-format
msgid ""
"Unable to delete share group snapshot \"%s\". One or more share groups "
"depend on it."
msgstr ""
"Tidak dapat menghapus share group snapshot \"%s\". Satu atau lebih share "
"group bergantung padanya."
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr ""
"Tidak dapat menghapus snapshot \"%s\". Satu atau lebih share bergantung "
"padanya."
#, python-format
msgid "Unable to delete snapshot rule \"%s\"."
msgstr "Tidak dapat menghapus aturan snapshot \"%s\"."
msgid "Unable to extend share."
msgstr "Tidak dapat memperluas share."
msgid "Unable to get information about share group type access."
msgstr "Tidak dapat memperoleh informasi tentang share group type access."
msgid "Unable to get information about share type access."
msgstr "Tidak dapat mendapatkan informasi tentang akses tipe share."
msgid "Unable to get list of projects."
msgstr "Tidak dapat mendapatkan daftar proyek."
msgid "Unable to get manila default quota."
msgstr "Tidak dapat memperoleh kuota default manila."
msgid "Unable to get the security services hosts"
msgstr "Tidak dapat mendapatkan host layanan keamanan"
#, python-format
msgid "Unable to get the specified share group '%s' for snapshot creation."
msgstr ""
"Tidak dapat memperoleh share group yang ditentukan '%s' untuk pembuatan "
"snapshot."
msgid "Unable to load the specified share group snapshot."
msgstr "Tidak dapat memuat share group snapshot yang ditentukan."
msgid "Unable to load the specified snapshot."
msgstr "Tidak dapat memuat snapshot spesifik."
msgid "Unable to manage share"
msgstr "Tidak mampu mengelola share"
#, python-format
msgid "Unable to migrate share %s."
msgstr "Tidak dapat bermigrasi share %s."
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr "Tidak dapat memperoleh kemajuan migrasi share %s saat ini."
#, python-format
msgid "Unable to reset state of replica '%s'."
msgstr "Tidak dapat mengatur ulang keadaan replika '%s'."
#, python-format
msgid "Unable to reset status of replica '%s'."
msgstr "Tidak dapat mengatur ulang status replika '%s'."
#, python-format
msgid "Unable to reset status of share group '%s'."
msgstr "Tidak dapat mengatur ulang status share group '%s'."
#, python-format
msgid "Unable to reset status of share group snapshot '%s'."
msgstr "Tidak dapat mengatur ulang status share group snapshot '%s'."
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "Tidak dapat resync replika '%s'."
msgid "Unable to retrieve default share quotas."
msgstr "Tidak dapat mengambil kuota share default."
msgid "Unable to retrieve list of projects."
msgstr "Tidak dapat mengambil daftar proyek."
msgid "Unable to retrieve quotas."
msgstr "Tidak dapat mengambil kuota."
#, python-format
msgid "Unable to retrieve replica '%s'."
msgstr "Tidak dapat mengambil replika '%s'."
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "Tidak dapat mengambil layanan keamanan '%s' rincian."
msgid "Unable to retrieve security services"
msgstr "Tidak dapat mengambil layanan keamanan"
msgid "Unable to retrieve security_service."
msgstr "Tidak dapat mengambil security_service."
msgid "Unable to retrieve share details."
msgstr "Tidak dapat mengambil rincian saham."
#, python-format
msgid "Unable to retrieve share group '%s'."
msgstr "Tidak dapat mengambil share group '%s'."
msgid "Unable to retrieve share group details."
msgstr "Tidak dapat mengambil share group details."
#, python-format
msgid "Unable to retrieve share group snapshot '%s'."
msgstr "Tidak dapat mengambil share group snapshot '%s'."
msgid "Unable to retrieve share group snapshot details."
msgstr "Tidak dapat mengambil share group snapshot details."
msgid "Unable to retrieve share group snapshot list."
msgstr "Tidak dapat mengambil daftar share group snapshot."
msgid "Unable to retrieve share group snapshot."
msgstr "Tidak dapat mengambil share group snapshot."
msgid "Unable to retrieve share group snapshots."
msgstr "Tidak dapat mengambil share group snapshots."
msgid "Unable to retrieve share group types."
msgstr "Tidak dapat mengambil share group types."
msgid "Unable to retrieve share group."
msgstr "Tidak dapat mengambil share group."
msgid "Unable to retrieve share groups."
msgstr "Tidak dapat mengambil share groups."
msgid "Unable to retrieve share instance details."
msgstr "Tidak dapat mengambil rincian instance berbagi."
msgid "Unable to retrieve share instances."
msgstr "Tidak dapat mengambil instance berbagi."
msgid "Unable to retrieve share limit information."
msgstr "Tidak dapat mengambil informasi batas share."
msgid "Unable to retrieve share list."
msgstr "Tidak dapat mengambil daftar share."
msgid "Unable to retrieve share network details."
msgstr "Tidak dapat mengambil rincian jaringan berbagi."
msgid "Unable to retrieve share network."
msgstr "Tidak dapat mengambil jaringan berbagi."
msgid "Unable to retrieve share networks"
msgstr "Tidak dapat mengambil jaringan berbagi"
msgid "Unable to retrieve share replicas."
msgstr "Tidak dapat mengambil replika berbagi."
msgid "Unable to retrieve share rules."
msgstr "Tidak dapat mengambil aturan share."
msgid "Unable to retrieve share server details."
msgstr "Tidak dapat mengambil rincian server share."
msgid "Unable to retrieve share servers"
msgstr "Tidak dapat mengambil server berbagi"
msgid "Unable to retrieve share snapshot list."
msgstr "Tidak dapat mengambil daftar share snapshot."
msgid "Unable to retrieve share snapshot rules."
msgstr "Tidak dapat mengambil share snapshot rule."
msgid "Unable to retrieve share snapshot."
msgstr "Tidak dapat mengambil share snapshot."
msgid "Unable to retrieve share snapshots list."
msgstr "Tidak dapat mengambil daftar snapshot berbagi."
msgid "Unable to retrieve share snapshots."
msgstr "Tidak dapat mengambil snapshot berbagi."
msgid "Unable to retrieve share types."
msgstr "Tidak dapat mengambil share types."
msgid "Unable to retrieve share."
msgstr "Tidak dapat mengambil share."
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "Tidak dapat mengambil share. %s"
msgid "Unable to retrieve share_gruop_type."
msgstr "Tidak dapat mengambil share_gruop_type."
msgid "Unable to retrieve share_type."
msgstr "Tidak dapat mengambil share_type."
msgid "Unable to retrieve snapshot details."
msgstr "Tidak dapat mengambil rincian snapshot."
msgid "Unable to retrieve snapshot."
msgstr "Tidak dapat mengambil snapshot."
msgid "Unable to retrieve volume details."
msgstr ""
"Unable to retrieve volume details. (tidak dapat mengambil rincian volume)"
msgid "Unable to revert share to the snapshot."
msgstr "Tidak dapat kembali berbagi dengan snapshot."
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "Tidak dapat mengatur replika '%s' aktif."
msgid "Unable to unmanage share."
msgstr "Tidak dapat tidak mengelola (unmanage) share."
#, python-format
msgid "Unable to update access for share group type \"%s\"."
msgstr "Tidak dapat memperbarui akses untuk share group type \"%s\"."
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "Tidak dapat memperbarui akses untuk tipe share \"%s\"."
msgid "Unable to update default quotas."
msgstr "Tidak dapat memperbarui kuota default."
msgid "Unable to update extra_specs for share type."
msgstr "Tidak dapat memperbarui extra_specsuntuk tipe share."
msgid "Unable to update group_specs for share group type."
msgstr "Tidak dapat memperbarui group_specs untuk share group type."
msgid "Unable to update security service."
msgstr "Tidak dapat memperbarui layanan keamanan."
msgid "Unable to update share group snapshot."
msgstr "Tidak dapat memperbarui share group snapshot."
msgid "Unable to update share group type."
msgstr "Tidak dapat memperbarui share group type."
msgid "Unable to update share group."
msgstr "Tidak dapat memperbarui share group."
msgid "Unable to update share metadata."
msgstr "Tidak dapat memperbarui metadata berbagi."
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "Tidak dapat memperbarui jaringan berbagi \"%s\"."
msgid "Unable to update share network."
msgstr "Tidak dapat memperbarui jaringan berbagi."
msgid "Unable to update share snapshot."
msgstr "Tidak dapat memperbarui share snapshot."
msgid "Unable to update share type."
msgstr "Tidak dapat memperbarui tipe share."
msgid "Unable to update share."
msgstr "Tidak dapat memperbarui share."
msgid "Unknown"
msgstr "Unknown (tidak diketahui)"
msgid "Unmanage"
msgstr "Unmanage (tidak dikelola)"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "Unmanage Error (kesalahan tidak dikelola)"
msgid "Unmanage Share"
msgstr "Unmanage Share (share tidak terkelola)"
msgid "Update"
msgstr "Update (perbarui)"
msgid "Update Share Group"
msgstr "Memperbarui Share Group"
msgid "Update Share Group Snapshot"
msgstr "Memperbarui Share Group Snapshot"
msgid "Update Share Group Type"
msgstr "Update Share Group Type"
msgid "Update Share Network"
msgstr "Update Share Network (memperharui jaringan berbagi)"
msgid "Update Share Snapshot"
msgstr "Memperbarui Share Snapshot"
msgid "Update Share Type"
msgstr "Update Share Type (Memperbarui tipe share)"
msgid "Update Share group Type"
msgstr "Update Share group Type"
msgid "Update share network"
msgstr "Perbarui jaringan berbagi"
msgid "Updated"
msgstr "Diperbarui"
msgid "Updated At"
msgstr "Updated At"
#, python-format
msgid "Updated access for share group type \"%s\"."
msgstr "Akses yang diperbarui untuk share group type \"%s\"."
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "Diperbaharui akses untuk tipe share \"%s\"."
#, python-format
msgid "Updated share network \"%s\"."
msgstr "Diperbarui jaringan berbagi \"%s\"."
#, python-format
msgid "Updating share \"%s\""
msgstr "Perbaharui share \"%s\""
#, python-format
msgid "Updating share group \"%s\""
msgstr "Memperbarui share group \"%s\""
#, python-format
msgid "Updating share group snapshot \"%s\""
msgstr "Memperbarui share group snapshot \"%s\""
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "Memperbarui metadata berbagi \"%s\""
#, python-format
msgid "Updating share network \"%s\""
msgstr "Memperbarui jaringan berbagi \"%s\""
#, python-format
msgid "Updating share snapshot \"%s\""
msgstr "Memperbarui share snapshot \"%s\""
msgid "Use share group snapshot as a source"
msgstr "Menggunakan share group snapshot sebagai sumber"
msgid "Use snapshot as a source"
msgstr "Gunakan snapshot sebagai sumber"
msgid "User"
msgstr "User (pengguna)"
msgid "Visibility"
msgstr "Visibility (keterlihatan)"
msgid ""
"When a share is \"unmanaged\", the share will no longer be visible within "
"OpenStack. Note that the share will not be deleted.
This is "
"equivalent to the 'manila unmanage' command."
msgstr ""
"Ketika sebuah share \"unmanaged\", share tersebut tidak akan lagi terlihat "
"di dalam OpenStack. Perhatikan bahwa pembagian tidak akan dihapus.
"
"Ini sama dengan perintah 'manila unmanage' ."
msgid "Writable"
msgstr "Writable (dapat ditulis)"
msgid "as Active?"
msgstr "as Active?"
msgid "key=value pairs per line can be set"
msgstr "Pasasngan key=value per baris dapat diatur"
manila-ui-3.0.0/manila_ui/locale/ko_KR/ 0000775 0001750 0001750 00000000000 13647271736 017632 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/ko_KR/LC_MESSAGES/ 0000775 0001750 0001750 00000000000 13647271736 021417 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/manila_ui/locale/ko_KR/LC_MESSAGES/django.po 0000664 0001750 0001750 00000146670 13647271543 023233 0 ustar zuul zuul 0000000 0000000 # Eunseop Shin , 2016. #zanata
# Ian Y. Choi , 2016. #zanata
# Sungjin Kang , 2017. #zanata
# minwook-shin , 2017. #zanata
# ByungYeol Woo , 2018. #zanata
# Ian Y. Choi , 2018. #zanata
# Sungjin Kang , 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: manila-ui VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2020-04-15 19:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-10-21 07:06+0000\n"
"Last-Translator: Sungjin Kang \n"
"Language-Team: Korean (South Korea)\n"
"Language: ko_KR\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
msgid ""
"\"Manage\" an existing share from a Manila host. This will make the share "
"visible within OpenStack.
This is equivalent to the 'manila "
"manage' command."
msgstr ""
"Manila 호스트에서 기존 공유를 \"관리\"합니다. 이렇게하면 OpenStack에서 공유"
"를 확인할 수 있습니다.
'manila manage' 명령과 동일합니다."
#, python-format
msgid "%(used)s of %(quota)s GiB Used"
msgstr "%(quota)s 중 %(used)s GIB 사용됨"
#, python-format
msgid "%(used)s of %(quota)s Used"
msgstr "%(quota)s 중 %(used)s 사용됨"
#, python-format
msgid "%sGiB"
msgstr "%sGiB"
msgid "(Quota exceeded)"
msgstr "(Quota 초과)"
msgid "Access Key"
msgstr "접근 키"
msgid "Access Level"
msgstr "엑세스 레벨"
msgid "Access Rules"
msgstr "접속 규칙"
msgid "Access To"
msgstr "에 엑세스"
msgid "Access Type"
msgstr "엑세스 타입"
msgid "Access to"
msgstr "에 접근"
msgctxt "Current status of share network"
msgid "Active"
msgstr "활성화됨"
msgctxt "Current status of share server"
msgid "Active"
msgstr "활성화됨"
msgid "Add"
msgstr "추가"
msgid "Add Rule"
msgstr "규칙 추가"
msgid "Add Security Service"
msgstr "보안 서비스 추가"
msgid "Add Share Snapshot Rule"
msgstr "공유 스냅샷 규칙 추가"
msgid ""
"Add policy rule to snapshot, 'ip' rule represents ip address, 'user' rule "
"represents username or usergroup, 'cephx' rule represents ceph auth ID, and "
"'cert' rule represents certificate."
msgstr ""
"스냅샷에 정책 규칙을 추가합니다. 'ip' 규칙은 IP 주소를, 'user' 규칙은 사용자 "
"이름이나 사용자 그룹을, 'cephx' 규칙은 ceph auth ID를, 'cert' 규칙은 인증서"
"를 타나냅니다."
msgid "Add rule"
msgstr "규칙 추가"
msgid "Add security services to share network."
msgstr "공유 네트워크에 보안 서비스 추가."
msgid "All keys and values must be in range from 1 to 255."
msgstr "모든 키와 값은 1 에서 255까지의 범위에 있어야 합니다."
msgid "All pairs that are in field for left are set for this metadata."
msgstr "왼쪽 필드에 있는 모든 쌍은 이 메타데이터로 설정됩니다."
msgid "All pairs that are in field for left are set for this share group type."
msgstr "왼쪽 필드에 있는 모든 쌍이 공유 그룹 타입으로 설정됩니다."
msgid "All pairs that are in field for left are set for this share type."
msgstr "왼쪽 필드에 있는 모든 쌍은 공유 타입으로 설정됩니다."
msgid "Allow project access to share group type."
msgstr "프로젝트가 공유 그룹 유형에 액세스하도록 허용"
msgid "Allow project access to share type."
msgstr "프로젝트가 공유 유형에 엑세스하도록 허용합니다."
msgid "At least one security service must be specified."
msgstr "최소한 하나의 보안 서비스를 지정해야 합니다."
msgid "At least one share type must be specified."
msgstr "적어도 하나의 공유 유형이 지정되어야 합니다."
msgid "Availability Zone"
msgstr "가용 구역"
msgid "Availability zone"
msgstr "가용성 존"
msgctxt "Current status of replica"
msgid "Available"
msgstr "사용 가능"
msgctxt "Current status of share"
msgid "Available"
msgstr "사용 가능"
msgctxt "Current status of snapshot"
msgid "Available"
msgstr "사용 가능"
msgid "Available networks"
msgstr "사용가능한 네트워크"
msgid "Available projects"
msgstr "사용 가능한 프로젝트"
msgid "Available security services"
msgstr "이용가능한 보안 서비스"
msgid "Cancel"
msgstr "취소"
msgid "Cancel Migration"
msgstr "마이그레이션 취소"
msgid "Cancel migration"
msgstr "마이그레이션 취소"
msgid "Cancel migration of a Share"
msgstr "공유에 대한 마이그레이션 취소"
msgid ""
"Cancel migration of a migrating share.
This is equivalent to the "
"'manila migration-cancel' command."
msgstr ""
"마이그레이션 공유에서 마이그레이션을 취소합니다.
'manila "
"migration-cancel' 명령과 동일합니다."
msgid "Choose a snapshot"
msgstr "스냅샷 선택"
msgid "Complete Migration"
msgstr "마이그레이션 완료"
msgid "Complete migration"
msgstr "마이그레이션 완료"
msgid "Complete migration of a Share"
msgstr "공유에 대한 마이그레이션 완료"
msgid ""
"Complete migration of a migrating share to another Manila host. This "
"operation is expected to be disruptive.
This is equivalent to the "
"'manila migration-complete' command."
msgstr ""
"다른 Manila 호스트로 마그레이션 중인 공유를 마이그레이션 완료로 변경합니다. "
"이 작업은 서비스에 영향이 있을 수 있습니다.
'manila migration-"
"complete' 명령과 동일합니다."
msgid "Confirm Migration Cancelling of Share"
msgstr "공유에 대한 마이그레이션 취소 확인"
msgid "Confirm Migration Completion of Share"
msgstr "공유에 대한 마이그레이션 완료 확인"
msgid "Confirm Obtaining migration progress of Share"
msgstr "공유에 대한 마이그레이션 진행사항을 가져오는 것에 대해 확인합니다"
msgid "Confirm Password"
msgstr "비밀번호 확인"
msgid "Confirm Unmanage Share"
msgstr "공유 관리 해제 확인"
msgid "Create"
msgstr "생성"
msgid "Create Group Share Type"
msgstr "공유 그룹 타입 생성"
msgid "Create Replica"
msgstr "레플리카 생성"
msgid "Create Security Service"
msgstr "보안 서비스 생성"
msgid "Create Share"
msgstr "공유 생성"
msgid "Create Share Group"
msgstr "공유 그룹 생성"
msgid "Create Share Group Snapshot"
msgstr "공유 그룹 스냅샷 생성"
msgid "Create Share Group Type"
msgstr "공유 그룹 타입 생성"
msgid "Create Share Network"
msgstr "공유 네트워크 생성"
msgid "Create Share Replica"
msgstr "공유 레플리카 생성"
msgid "Create Share Snapshot"
msgstr "공유 스냅샷 생성"
msgid "Create Share Type"
msgstr "공유 유형 생성"
msgid "Create a Share"
msgstr "공유 생성"
msgid "Create share replica in specific availability zone."
msgstr "특정 가용 구역 내 공유 레플리카 생성"
msgid "Created"
msgstr "생성됨"
msgid "Created At"
msgstr "생성 시점"
msgid "Created at"
msgstr "생성 시점"
msgctxt "Current status of replica"
msgid "Creating"
msgstr "생성 중"
msgctxt "Current status of share"
msgid "Creating"
msgstr "생성 중"
msgctxt "Current status of share server"
msgid "Creating"
msgstr "생성 중"
msgctxt "Current status of snapshot"
msgid "Creating"
msgstr "생성 중"
#, python-format
msgid "Creating replica for share \"%s\"."
msgstr "공유 \"%s\"를 위한 레플리카를 생성하는 중. "
#, python-format
msgid "Creating rule for \"%s\""
msgstr "\"%s\"를 위한 생성 규칙"
#, python-format
msgid "Creating share \"%s\""
msgstr "공유 \"%s\"를 생성하는중"
#, python-format
msgid "Creating share group \"%s\""
msgstr "공유 그룹 \"%s\" 생성"
#, python-format
msgid "Creating share group snapshot \"%s\"."
msgstr "공유 그룹 스냅샷 \"%s\" 생성."
#, python-format
msgid "Creating share snapshot \"%s\"."
msgstr "공유 스냅샷 \"%s\" 생성"
#, python-format
msgid "Creating snapshot rule for \"%s\""
msgstr "\"%s\"의 스냅샷 규칙 생성 중"
msgid "Current Size (GiB)"
msgstr "현재 크기 (GiB)"
msgid "DNS IP"
msgstr "DNS IP"
msgid "Delete Replica"
msgid_plural "Delete Replicas"
msgstr[0] "레플리카 삭제"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "규칙 삭제"
msgid "Delete Security Service"
msgid_plural "Delete Security Services"
msgstr[0] "보안 서비스 삭제"
msgid "Delete Share"
msgid_plural "Delete Shares"
msgstr[0] "공유 삭제"
msgid "Delete Share Group"
msgid_plural "Delete Share Groups"
msgstr[0] "공유 그룹 삭제"
msgid "Delete Share Group Snapshot"
msgid_plural "Delete Share Group Snapshots"
msgstr[0] "공유 그룹 스냅샷 삭제"
msgid "Delete Share Group Type"
msgid_plural "Delete Share Group Types"
msgstr[0] "공유 그룹 유형 삭제"
msgid "Delete Share Network"
msgid_plural "Delete Share Networks"
msgstr[0] "공유 네트워크 삭제"
msgid "Delete Share Server"
msgid_plural "Delete Share Server"
msgstr[0] "공유 서버 삭제"
msgid "Delete Share Snapshot"
msgid_plural "Delete Share Snapshots"
msgstr[0] "공유 스냅샷 삭제"
msgid "Delete Share Snapshot Rule"
msgid_plural "Delete Share Snapshot Rules"
msgstr[0] "공유 스냅샷 규칙 삭제"
msgid "Delete Share Type"
msgid_plural "Delete Share Types"
msgstr[0] "공유 유형 삭제"
msgid "Delete Snapshot"
msgid_plural "Delete Snapshots"
msgstr[0] "스냅샷 삭제"
msgid "Deleted Replica"
msgid_plural "Deleted Replicas"
msgstr[0] "레플리카 삭제됨"
msgid "Deleted Rule"
msgid_plural "Deleted Rules"
msgstr[0] "규칙 삭제됨"
msgid "Deleted Security Service"
msgid_plural "Deleted Security Services"
msgstr[0] "보안 서비스 삭제됨"
msgid "Deleted Share"
msgid_plural "Deleted Shares"
msgstr[0] "삭제된 공유"
msgid "Deleted Share Group"
msgid_plural "Deleted Share Groups"
msgstr[0] "공유 그룹 삭제됨"
msgid "Deleted Share Group Snapshot"
msgid_plural "Deleted Share Group Snapshots"
msgstr[0] "공유 그룹 스냅샷 삭제됨"
msgid "Deleted Share Group Type"
msgid_plural "Deleted Share Group Types"
msgstr[0] "공유 그룹 유형이 삭제됨"
msgid "Deleted Share Network"
msgid_plural "Deleted Share Networks"
msgstr[0] "삭제된 공유 네트워크"
msgid "Deleted Share Server"
msgid_plural "Deleted Share Server"
msgstr[0] "삭제된 공유 서버"
msgid "Deleted Share Snapshot"
msgid_plural "Deleted Share Snapshots"
msgstr[0] "삭제된 공유 스냅샷"
msgid "Deleted Share Snapshot Rule"
msgid_plural "Deleted Share Snapshot Rules"
msgstr[0] "삭제된 공유 스냅샷 규칙"
msgid "Deleted Share Type"
msgid_plural "Deleted Share Types"
msgstr[0] "삭제된 공유 유형"
msgid "Deleted Snapshot"
msgid_plural "Deleted Snapshots"
msgstr[0] "삭제된 스냅샷"
msgctxt "Current status of replica"
msgid "Deleting"
msgstr "Deleting"
msgctxt "Current status of share"
msgid "Deleting"
msgstr "삭제 중"
msgid "Description"
msgstr "설명"
msgid "Description:"
msgstr "설명:"
msgid "Destination host and pool where share will be migrated to."
msgstr "공유가 마이그레이션 될 대상 호스트와 풀."
msgid "Domain"
msgstr "도메인"
msgid "Driver handles share servers"
msgstr "드라이버는 공유 서버를 다룹니다"
msgid "Driver options ('volume_id' for Generic driver, etc...)"
msgstr "드라이버 옵션 (Generic 드라이브에 대한 'volume_id' 등)"
#, python-format
msgid "Duplicated keys '%s'."
msgstr "중복된 키 '%s'."
msgid "Edit"
msgstr "편집"
msgid "Edit Security Service"
msgstr "보안 서비스 편집"
msgid "Edit Share"
msgstr "공유편집"
msgid "Edit Share Metadata"
msgstr "공유 메타데이터 편집"
msgid "Edit Share Network"
msgstr "공유 네트워크 편집"
msgid "Edit Share Snapshot"
msgstr "공유 스냅샷 편집"
msgid "Edit Share network"
msgstr "공유 네트워크 편집"
msgid ""
"Enforces migration of the share snapshots to the destination. If set to "
"True, host-assisted migration will not be attempted."
msgstr ""
"목적지로 공유 스냅샷의 마이그레이션을 강제합니다. True일 경우 호스트 지원 마"
"이그레이션을 시도하지 않습니다."
msgid ""
"Enforces migration to be nondisruptive. If set to True, host-assisted "
"migration will not be attempted."
msgstr ""
"마이그레이션을 무중단이 되도록 강제. True일 경우 호스트 지원 마이그레이션을 "
"시도하지 않습니다."
msgid ""
"Enforces migration to keep the share writable while contents are being "
"moved. If set to True, host-assisted migration will not be attempted."
msgstr ""
"컨텐츠가 옮겨지는 도중 공유의 쓰기 가능을 유지하도록 마이그레이션을 강제합니"
"다. True일 경우 호스트 지원 마이그레이션을 시도하지 않습니다."
msgid ""
"Enforces migration to preserve all file metadata when moving its contents. "
"If set to True, host-assisted migration will not be attempted."
msgstr ""
"컨텐츠를 옮길 때 모든 파일을 보존하기 위해 마이그레이션을 강제합니다. True일 "
"경우 호스트 지원 마이그레이션을 시도하지 않습니다."
msgid ""
"Enforces the use of the host-assisted migration approach, which bypasses "
"driver optimizations."
msgstr "호스트 지원 마이그레이션 방식의 사용을 강제합니다."
msgctxt "Current status of replica"
msgid "Error"
msgstr "에러"
msgctxt "Current status of share"
msgid "Error"
msgstr "에러"
msgctxt "Current status of share network"
msgid "Error"
msgstr "에러"
msgctxt "Current status of share server"
msgid "Error"
msgstr "오류"
msgctxt "Current status of snapshot"
msgid "Error"
msgstr "오류"
msgid "Expected only pairs of key=value."
msgstr "key=value 쌍만을 기대합니다."
msgid "Export location"
msgstr "위치 내보내기"
msgid "Export location of share. Example for NFS: 1.2.3.4:/path/to/share"
msgstr "공유에 대한 내보내기 위치. NFS 예시: 1.2.3.4:/path/to/share"
msgid "Export locations"
msgstr "위치 내보내기"
msgid "Extend"
msgstr "확장"
msgid "Extend Share"
msgstr "공유 확장"
#, python-format
msgid "Extend share \"%s\""
msgstr "공유 \"%s\" 확장"
msgid "Extend the size of a share. "
msgstr "공유 크기가 늘어났습니다."
msgctxt "Current status of share"
msgid "Extending Error"
msgstr "확장중 에러"
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"부가 스펙 'driver_handles_share_servers'가 필요하고 불리언 값이 있어야 합니"
"다."
msgid ""
"Extra spec 'driver_handles_share_servers' is required and should have "
"boolean value."
msgstr ""
"부가 스펙 'driver_handles_share_servers'가 필요하고 불리언 값이 있어야 합니"
"다."
msgid "Extra specs"
msgstr "부가 스펙"
msgid "Force Host Assisted Migration"
msgstr "호스트 지원 마이그레이션 강제"
msgid "From here you can modify name and description of a security service."
msgstr "여기서 보안 서비스의 이름과 설명을 수정할 수 있습니다."
msgid ""
"From here you can modify name and description of a share group snapshot."
msgstr "여기서 공유 그룹 스냅샷의 이름과 설명을 수정할 수 있습니다."
msgid "From here you can modify name and description of a share network."
msgstr "여기서 공유 네트워크의 이름과 설명을 수정할 수 있습니다."
msgid "From here you can modify name and description of a snapshot."
msgstr "여기서 스냅샷의 이름과 설명을 수정할 수 있습니다."
msgid ""
"From here you can modify name, description and visibility of a share group."
msgstr "여기서 공유 그룹의 이름, 설명, 표시 여부를 수정할 수 있습니다."
msgid "From here you can modify name, description and visibility of a share."
msgstr "여기서 공유의 이름, 설명, 표시 여부를 수정할 수 있습니다."
msgid "From here you can revert the share to its latest snapshot."
msgstr "여기서 가장 최근의 스냅샷으로 공유를 되돌릴 수 있습니다."
msgid "From here you can update share network info. "
msgstr "여기서 공유 네트워크 정보를 업데이트 할 수 있습니다."
msgid "From here you can update the default share quotas (max limits)."
msgstr "여기서 기본 공유 quotas (최대 한도)를 업데이트 할 수 있습니다."
msgid "Get Migration Progress"
msgstr "마이그레이션 진행사항 가져오기"
msgid "Get migration progress"
msgstr "마이그레이션 진행사항 가져오기"
msgid "GiB"
msgstr "GiB"
msgid ""
"Got improper value for field 'driver_options'. Expected only pairs of "
"key=value."
msgstr ""
"'driver_options' 필드에 대해 적절하지 않은 값을 얻었습니다. key=value 쌍만을 "
"기대합니다."
msgid "Group specs"
msgstr "그룹 사양"
msgid "Here can be modified extra-specs for share type."
msgstr "여기서 공유 타입에 대한 부가 스펙을 수정할 수 있습니다."
msgid "Here can be modified group-specs for share group type."
msgstr "여기서 공유 그룹 타입에 대한 그룹 스펙을 수정할 수 있습니다."
msgid "Host"
msgstr "호스트"
msgid "Host of share"
msgstr "공유 호스트"
msgid "Host to migrate share"
msgstr "공유를 마이그레이션할 호스트"
msgid "Host where share is located, example: some.host@driver[#pool]"
msgstr "공유가 위치할 호스트, 예시: some.host@driver[#pool]"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP 버전"
msgid "Id"
msgstr "Id"
#, python-format
msgid ""
"Improper value set to required extra spec "
"'spec_driver_handles_share_servers'. Allowed values are %s. Case insensitive."
msgstr ""
"필요한 부가 스펙 'spec_driver_handles_share_servers' 을 설정하는 데 적절하지 "
"않은 값입니다. 허용 값은 %s 로 대소문자를 구별하지 않습니다."
msgctxt "Current status of share server"
msgid "In-use"
msgstr "사용 중"
msgctxt "Current status of snapshot"
msgid "In-use"
msgstr "사용 중"
msgctxt "Current status of share network"
msgid "Inactive"
msgstr "비활성화 됨"
#, python-format
msgid "Key '%s' has improper length."
msgstr "키 '%s' 길이가 적절하지 않습니다."
#, python-format
msgid "Key can not contain spaces. See string '%s'."
msgstr "키는 공백을 포함할 수 없습니다. 문자열 '%s' 를 살펴 봅니다."
#, python-format
msgid "Keys should not contain spaces. Error in '%s'."
msgstr "키는 공백을 포함하지 않아야 합니다. '%s' 에 오류가 있습니다."
msgid "Limit"
msgstr "제한"
msgid "Make visible for all"
msgstr "모든 것을 보이게 합니다."
msgid "Manage"
msgstr "관리"
msgctxt "Current status of share"
msgid "Manage Error"
msgstr "관리 오류"
msgid "Manage Replicas"
msgstr "레플리카 관리"
msgid "Manage Rules"
msgstr "관리 규칙"
msgid "Manage Share"
msgstr "공유 관리"
msgid "Manage Share Group Type Access"
msgstr "공유 그룹 유형 액세스 관리"
msgid "Manage Share Snapshot Rules"
msgstr "공유 스냅샷 규칙 관리"
msgid "Manage Share Type Access"
msgstr "공유 유형 액세스 관리"
msgid "Metadata"
msgstr "메타데이터"
msgid "Migrate Share"
msgstr "공유 마이그레이션"
msgid "Migrate a Share"
msgstr "공유 마이그레이션"
msgid ""
"Migrate an existing share to another Manila host. This will move all your "
"share data from one host to another.
This is equivalent to the "
"'manila migration-start' command."
msgstr ""
"기존 공유를 다른 Manila 호스트로 마이그레이션 합니다. 이렇게하면 모든 공유 데"
"이터가 명령을 실행한 호스트에서 다른 호스트로 이동합니다.
"
"'manila migration-start' 명령과 동일합니다."
msgctxt "Current status of share"
msgid "Migrating"
msgstr "이전 중"
msgctxt "Current status of share"
msgid "Migrating to"
msgstr "로 이전 중"
#, python-format
msgid "Migration of share %(name)s is at %(progress)s percent."
msgstr "공유 %(name)s 에 대한 마이그레이션이 현재 %(progress)s 퍼센트입니다."
msgid "Mount snapshot support"
msgstr "스냅샷 마운트 지원"
msgid "Name"
msgstr "이름"
msgid "Net Details"
msgstr "네트워크 상세 정보"
msgid "Network"
msgstr "네트워크"
msgid "Network Type"
msgstr "네트워크 유형"
msgid "Networks"
msgstr "네트워크"
msgid "Neutron Net"
msgstr "Neutron Net"
msgid "Neutron Subnet"
msgstr "Neutron 서브넷"
msgid "New Size (GiB)"
msgstr "새 크기 (GiB)"
msgid "New share network to be set in migrated share"
msgstr "마이그레이션된 공유에서 설정될 새로운 공유 네트워크"
msgid "New share type to be set in migrating share"
msgstr "마이그레이션된 공유에서 설정될 새로운 공유 네트워크 타입"
msgid "New size must be greater than current size."
msgstr "새로 정하는 크기는 현재 크기보다 커야합니다."
msgid "No projects found."
msgstr "프로젝트를 찾을 수 없습니다."
msgid "No projects selected."
msgstr "선택한 프로젝트가 없습니다."
msgid "No security services found."
msgstr "보안 서비스를 찾을 수 없습니다."
msgid "No security services selected."
msgstr "보안 서비스가 선택되지 않았습니다."
msgid "No source, empty share"
msgstr "소스가 없음, 빈 공유"
msgid "No source, empty share group"
msgstr "소스가 없음, 빈 공유 그룹"
msgid "Nondisruptive"
msgstr "무중단"
msgid "Nova Net"
msgstr "Nova Net"
msgid "Number of Share Snapshots"
msgstr "공유 스냅샷 갯수"
msgid "Number of Shares"
msgstr "공유 갯수"
msgid "Obtain Progress"
msgstr "진행사항 가져오기"
msgid "Obtain migration progress of a Share"
msgstr "공유에 대한 마이그레이션 진행사항 가져오기"
msgid ""
"Obtains migration progress of a migrating share.
This is "
"equivalent to the 'manila migration-get-progress' command."
msgstr ""
"마이그레이션 중인 공유에 대한 진행률을 얻습니다.
'malila "
"migration-get-progress' 명령과 동일합니다."
msgid "One line - one action. Empty strings will be ignored."
msgstr "One line - 하나의 동작. 빈 문자열은 무시됩니다."
msgid "Overview"
msgstr "개요"
msgid "Password"
msgstr "암호"
msgid "Passwords do not match."
msgstr "비밀번호가 일치하지 않습니다."
msgid "Placeholder for description of share group type access managing form."
msgstr "공유 그룹 타입 접근 관리 양식에 대한 설명을 위한 자리 표시자입니다."
msgid "Placeholder for description of share type access managing form."
msgstr "굥유 타입 접근 관리 양식에 대한 설명을 위한 자리 표시자입니다."
msgid "Preserve Metadata"
msgstr "메타데이터 보존"
msgid "Preserve Snapshots"
msgstr "스냅샷 보존"
msgid "Project"
msgstr "프로젝트"
msgid "Projects with access to share group type"
msgstr "공유 그룹 유형에 대한 액세스를 포함하는 프로젝트"
msgid "Projects with access to share type"
msgstr "공유 유형에 대한 엑세스를 포함하는 프로젝트"
msgid "Protocol"
msgstr "프로토콜"
msgid "Public"
msgstr "공용"
msgid "Quota Name"
msgstr "Quota 이름"
msgid "Replica Details"
msgstr "레플리카 상세 정보"
#, python-format
msgid "Replica Details: %(replica_display_name)s"
msgstr "레플리카 상세정보: %(replica_display_name)s"
msgid "Replica State"
msgstr "레플리카 상태"
msgid "Replica state"
msgstr "레플리카 상태"
msgid "Replicas"
msgstr "레플리카"
msgid "Reset Replica State"
msgstr "레플리카 상태 리셋"
msgid "Reset Replica Status"
msgstr "레플리카 상태 리셋"
msgid "Reset Share Group Snapshot Status"
msgstr "공유 그룹 스냅샷 상태 재설정"
msgid "Reset Share Group Status"
msgstr "공유 그룹 상태 초기화"
msgid "Reset Status"
msgstr "상태 재설정"
msgid "Reset replica state"
msgstr "레플리카 상태 초기화"
msgid "Reset replica status"
msgstr "레플리카 상태 초기화"
msgid "Reset share replica's state with ID"
msgstr "ID와 공유 레플리카 상태를 초기화"
msgid "Reset share replica's status with ID"
msgstr "ID로 공유 레플리카 상태를 초기화"
msgid "Reset state"
msgstr "state 리셋"
msgid "Reset status"
msgstr "리셋 status"
#, python-format
msgid "Reseting replica ('%(id)s') state from '%(from)s' to '%(to)s'."
msgstr "레플리카 ('%(id)s') 상태를 '%(from)s' 에서 '%(to)s' 로 초기화합니다."
#, python-format
msgid "Reseting replica ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "레플리카 ('%(id)s') 상태를 '%(from)s' 에서 '%(to)s' 로 초기화합니다."
#, python-format
msgid "Reseting share group ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "공유 그룹 ('%(id)s') 상태를 '%(from)s' 에서 '%(to)s' 로 초기화."
#, python-format
msgid ""
"Reseting share group snapshot ('%(id)s') status from '%(from)s' to '%(to)s'."
msgstr "공유 그룹 스냅샷 ('%(id)s') 상태를 '%(from)s' 에서 '%(to)s' 로 초기화."
msgid "Resync"
msgstr "재동기화"
msgid "Resync Replica"
msgstr "레플리카 재동기화"
msgid "Resync replica"
msgstr "레플리카 재동기화"
msgid "Resync share replica with ID"
msgstr "ID로 공유 레플리카 재동기화"
#, python-format
msgid "Resync'ing replica '%s'"
msgstr "레플리카 '%s' 재동기화 중"
msgid "Revert Share"
msgstr "공유 되돌리기"
msgid "Revert Share to a Snapshot"
msgstr "공유를 스냅샷으로 되돌리기"
msgid "Revert share to a snapshot"
msgstr "공유를 스냅샷으로 되돌리기"
msgctxt "Current status of share"
msgid "Reverting Error"
msgstr "되돌리기 에러"
msgid "Rules"
msgstr "규칙"
msgid "Save Changes"
msgstr "변경사항 저장"
msgid "Security Service Details"
msgstr "보안 서비스 상세 정보"
#, python-format
msgid "Security Service Details: %(service_display_name)s"
msgstr "보안 서비스 상세정보: %(service_display_name)s"
msgid "Security Service Overview"
msgstr "보안 서비스 개요"
msgid "Security Services"
msgstr "보안 서비스"
msgid "Security services within share network"
msgstr "공유 네트워크 내 보안 서비스 "
msgid "Segmentation Id"
msgstr "구분 Id"
msgid "Select parameters of share group you want to create. "
msgstr "만들고자 하는 공유 그룹의 매개변수를 선택하세요."
msgid "Select parameters of share you want to create. "
msgstr "만들고자 하는 공유의 매개변수를 선택하세요."
msgid "Selected Networks"
msgstr "선택된 네트워크"
msgid "Selected Projects"
msgstr "선택된 프로젝트"
msgid "Selected projects"
msgstr "선택한 프로젝트"
msgid "Selected security services"
msgstr "선택된 보안 서비스"
msgid "Server"
msgstr "서버"
msgid "Set Replica as Active"
msgstr "레플리카를 활성화 상태로 설정"
msgid "Set as Active"
msgstr "활성화 상태로 설정"
msgid "Set maximum quotas for the project."
msgstr "프로젝트에대한 최대 quota를 설정합니다."
msgid "Set share replica with ID"
msgstr "ID와 공유 리플리카 설정"
#, python-format
msgid "Setting replica \"%s\" as active..."
msgstr "레플리카 \"%s\"를 활성화 상태로 설정"
msgid "Share"
msgstr "공유"
#, python-format
msgid "Share \"%(s)s\" has been reverted to \"%(ss)s\" snapshot successfully"
msgstr "성공적으로 공유 \"%(s)s\"는 스냅샷 \"%(ss)s\"으로 되돌려졌습니다."
msgid "Share Details"
msgstr "공유 상세 정보"
#, python-format
msgid "Share Details: %(share_display_name)s"
msgstr "공유 상세정보: %(share_display_name)s"
#, python-format
msgid "Share Details: %(share_name)s"
msgstr "공유 세부 사항: %(share_name)s"
msgid "Share Group"
msgstr "공유 그룹"
msgid "Share Group Details"
msgstr "공유 그룹 새부 정보"
#, python-format
msgid "Share Group Details: %s"
msgstr "공유 그룹 상세 정보: %s"
msgid "Share Group Name"
msgstr "공유 그룹 이름"
msgid "Share Group Overview"
msgstr "공유 그룹 개요"
msgid "Share Group Snapshot"
msgstr "공유 그룹 스냅샷"
msgid "Share Group Snapshot Details"
msgstr "공유 그룹 스냅샷 상세 정보"
#, python-format
msgid "Share Group Snapshot Details: %(sgs_display_name)s"
msgstr "공유 그룹 스냅샷 세부 사항: %(sgs_display_name)s"
msgid "Share Group Snapshot Overview"
msgstr "공유 그룹 스냅샷 개요"
msgid "Share Group Snapshots"
msgstr "공유 그룹 스냅샷"
msgid "Share Group Type"
msgstr "공유 그룹 유형"
msgid "Share Group Types"
msgstr "공유 그룹 타입"
msgid "Share Groups"
msgstr "공유 그룹"
msgid "Share ID"
msgstr "공유 ID"
msgid "Share Instance Details"
msgstr "공유 인스턴스 상세 정보"
#, python-format
msgid "Share Instance Details: %s"
msgstr "공유 인스턴스 세부 사항: %s"
msgid "Share Instance Overview"
msgstr "공유 인스턴스 개요"
msgid "Share Instances"
msgstr "공유 인스턴스"
msgid "Share Limits"
msgstr "공유 제한"
msgid "Share Name"
msgstr "공유 이름"
msgid "Share Network"
msgstr "공유 네트워크"
msgid "Share Network Details"
msgstr "공유 네트워크 상세 정보"
#, python-format
msgid "Share Network Details: %(network_display_name)s"
msgstr "공유 네트워크 상세 정보: %(network_display_name)s"
msgid "Share Network Info"
msgstr "공유 네트워크 정보"
msgid "Share Network Overview"
msgstr "공유 네트워크 개요"
msgid "Share Networks"
msgstr "공유 네트워크"
msgid "Share Overview"
msgstr "공유 개요"
msgid "Share Protocol"
msgstr "공유 프로토콜"
msgid "Share Quotas"
msgstr "공유 Quotas"
msgid "Share Replica Overview"
msgstr "공유 레플리카 개요"
msgid "Share Replicas"
msgstr "공유 레플리카"
#, python-format
msgid "Share Replicas: %(share_display_name)s"
msgstr "공유 레플리카 : %(share_display_name)s"
msgid "Share Rules"
msgstr "공유 규칙"
#, python-format
msgid "Share Rules: %(share_display_name)s"
msgstr "공유 규칙들: %(share_display_name)s"
msgid "Share Server"
msgstr "공유 서버"
msgid "Share Server Details"
msgstr "공유 서버 상세 정보"
#, python-format
msgid "Share Server Details: %(server_name)s"
msgstr "공유 서버 세부 사항: %(server_name)s"
msgid "Share Server Id"
msgstr "공유 서버 Id"
msgid "Share Server Overview"
msgstr "공유 서버 개요"
msgid "Share Servers"
msgstr "공유 서버"
msgid "Share Snapshot Details"
msgstr "공유 스냅샷 상세 정보"
msgid "Share Snapshot Name"
msgstr "공유 스냅샷 이름"
msgid "Share Snapshot Overview"
msgstr "공유 스냅샷 개요"
msgid "Share Snapshot Rules"
msgstr "공유 스냅샷 규칙"
msgid "Share Snapshots"
msgstr "공유 스냅샷"
msgid "Share Snapshots Storage"
msgstr "공유 스냅샷 저장소"
msgid ""
"Share Snapshots are used for storing share changes and creating shares. "
msgstr "스냅샷 공유는 공유 변화내역 저장과 공유 생성에 사용됩니다."
msgid "Share Source"
msgstr "공유 소스"
msgid "Share Storage"
msgstr "공유 저장소"
msgid "Share Type"
msgstr "공유 유형"
msgid "Share Types"
msgstr "공유 유형"
msgid "Share Types (multiple available)"
msgstr "공유 유형 (복수 사용 가능)"
msgid "Share Types (one available)"
msgstr "공유 유형 (단일 사용 가능)"
#, python-format
msgid ""
"Share cannot be extended to %(req)iGiB as you only have %(avail)iGiB of your "
"quota available."
msgstr ""
"사용가능한 quota의 %(avail)iGiB에서 %(req)iGiB로 공유를 확장하지 못했습니다."
msgid "Share gigabytes"
msgstr "기가바이트 공유"
msgid "Share name to be assigned"
msgstr "할당될 공유 이름"
msgid "Share network"
msgstr "공유 네트워크"
msgid ""
"Share networks contain network data, that will be used for creation of "
"service VM, where will be hosted shares."
msgstr ""
"공유 네트워크에는 공유 데이터가 있는 서비스 VM을 만드는데 사용되는 네트워크 "
"데이터가 포함됩니다."
#, python-format
msgid "Share replica %s has been deleted."
msgstr "공유 레플리카 %s 를 삭제하였습니다."
msgid "Share server"
msgstr "공유 서버"
#, python-format
msgid "Share size must be equal to or greater than the snapshot size (%sGiB)"
msgstr "공유 크기는 스냅샷 크기 (%sGiB)보다 크거나 같아야합니다."
msgid "Share snapshot gigabytes"
msgstr "스냅샷 기가바이트 공유"
msgid "Share snapshots"
msgstr "스냅샷 공유"
msgid "Share type"
msgstr "공유 유형"
msgid "Share types"
msgstr "공유 유형"
msgid "Shared Quotas"
msgstr "공유 Quota"
msgid "Shares"
msgstr "공유"
msgid "Shares Networks"
msgstr "네트워크 공유"
msgid "Shares on this server"
msgstr "서버 공유"
msgid "Sid"
msgstr "Sid"
msgid "Size"
msgstr "크기"
msgid "Size (GiB)"
msgstr "크기 (GiB)"
msgid "Snapshot"
msgstr "스냅샷"
#, python-format
msgid "Snapshot Details: %(snapshot_display_name)s"
msgstr "스냅샷 상세정보: %(snapshot_display_name)s"
msgid "Snapshot ID"
msgstr "스냅샷 ID"
msgid "Snapshot Overview"
msgstr "스냅샷 개요"
#, python-format
msgid "Snapshot Rules: %(snapshot_display_name)s"
msgstr "스냅샷 규칙: %(snapshot_display_name)s"
msgid "Source"
msgstr "소스"
msgid "Source SG Snapshot"
msgstr "소스 SG 스냅샷"
msgid "Source Share Group"
msgstr "공유 그룹 원본"
msgid "Source Share Group Snapshot"
msgstr "공유 그룹 스냅샷 소스"
msgid "Source Type"
msgstr "소스 유형"
msgid "Source share group snapshot"
msgstr "소스 공유 그룹 스냅샷"
msgid ""
"Specify the new share network for the share. Do not specify this parameter "
"if the migrating share has to be retained within its current share network."
msgstr ""
"공유에 사용될 새 공유 네트워크를 지정하세요. 만약 마이그레이션 공유가 현재 공"
"유 네트워크 안에서 유지되어야 한다면 이 매개변수를 지정하면 안 됩니다."
msgid ""
"Specify the new share type for the share. Do not specify this parameter if "
"the migrating share has to be retained with its current share type."
msgstr ""
"공유를 위한 새로운 공유 유형을 지정하세요. 만약 마이그레이션 공유가 현재 공"
"유 유형 내에서 유지되어야 한다면 이 매개변수를 지정하면 안 됩니다."
msgid "Specs"
msgstr "사양"
msgid "Start migration"
msgstr "마이그레이션 시작"
msgid "Status"
msgstr "상태"
msgid "Submit"
msgstr "제출"
msgid "Subnet"
msgstr "서브넷"
#, python-format
msgid "Successfully created security service: %s"
msgstr "보안 서비스: %s 를 성공적으로 생성하였습니다"
#, python-format
msgid "Successfully created share group type: %s"
msgstr "성공적으로 생성됨. 공유 그룹 타입: %s"
#, python-format
msgid "Successfully created share network: %s"
msgstr "공유 네트워크: %s 를 성공적으로 생성하였습니다"
#, python-format
msgid "Successfully created share type: %s"
msgstr "공유 유형: %s 를 성공적으로 생성하였습니다"
#, python-format
msgid "Successfully sent the request to cancel migration of share: %s."
msgstr "공유 %s 에 대한 마이그레이션 취소 요청을 성공적으로 전송하였습니다."
#, python-format
msgid "Successfully sent the request to complete migration of share: %s."
msgstr ""
"공유 %s 에 대한 마이그레이션을 완료하기 위해 요청을 성공적으로 전송하였습니"
"다."
#, python-format
msgid "Successfully sent the request to manage share: %s"
msgstr "공유를 관리하기 위해 요청을 성공적으로 전송하였습니다: %s"
#, python-format
msgid "Successfully sent the request to migrate share: %s."
msgstr "요청을 마이그레이션 공유에 성공적으로 보냈습니다: %s."
#, python-format
msgid "Successfully sent the request to unmanage share: %s"
msgstr "공유를 관리 해제하기 위해 요청을 성공적으로 전송하였습니다: %s"
#, python-format
msgid "Successfully updated extra specs for share type '%s'."
msgstr "공유 유형 '%s' 에 대한 부가 스펙 갱신을 성공하였습니다."
#, python-format
msgid "Successfully updated group specs for share group type '%s'."
msgstr "공유 그룹 타입 '%s'의 그룹 스펙을 성공적으로 갱신하였습니다."
#, python-format
msgid "Successfully updated security service \"%s\""
msgstr "시큐리티 서비스 %s를 성공적으로 업데이트 하였습니다."
msgid "Task state"
msgstr "작업 상태"
msgid ""
"The security service can be used by backend drivers to configure clients, "
"for more secure using of share."
msgstr ""
"보안 서비스는 백엔드 드라이버를 통한 공유를 보다 더 안전하게 사용하기위해 클"
"라이언트를 구성하는데 사용할 수 있습니다."
msgid ""
"The share group type defines the characteristics of a share group backend."
msgstr "공유 그룹 타입은 공유 그룹 백엔드 특성을 정의합니다."
#, python-format
msgid "The share size cannot be less than the snapshot size (%sGiB)"
msgstr "공유 크기는 스냅샷 크기 (%sGiB)보다 작을 수 없습니다."
msgid "The share type defines the characteristics of a share backend."
msgstr "공유 타입은 공유 백엔드에대한 특성을 정의합니다."
msgid "To add extra-specs use:"
msgstr "부가 스펙을 추가하기 위해 사용합니다:"
msgid "To add group-specs use:"
msgstr "그룹 스펙을 추가하려면 다음을 사용합니다:"
msgid "To add metadata use:"
msgstr "메타데이터를 추가하려면 사용합니다:"
msgid "To unset extra-specs use:"
msgstr "부가 스펙을 설정 해제하려면 다음을 사용합니다:"
msgid "To unset group-specs use:"
msgstr "그룹 스펙을 설정 해제하려면 다음을 사용합니다:"
msgid "To unset metadata use:"
msgstr "메타데이터를 설정 해제하려면 다음을 사용합니다:"
msgid "Total Gibibytes"
msgstr "총 Gibibytes"
msgid "Type"
msgstr "유형"
msgid "Unable to add rule."
msgstr "규칙을 추가할 수 없습니다."
msgid "Unable to add snapshot rule."
msgstr "스냅샷 규칙을 추가할 수 없음."
#, python-format
msgid "Unable to cancel migration of share %s at this moment."
msgstr "현재 공유 %s 에 대한 마이그레이션 취소를 가져올 수 없습니다."
#, python-format
msgid "Unable to complete migration of share %s."
msgstr "공유 %s 에 대한 마이그레이션을 완료할 수 없습니다."
msgid "Unable to create security service."
msgstr "보안 서비스를 생성할 수 없습니다."
msgid "Unable to create share group snapshot."
msgstr "공유 그룹 스냅샷을 생성할 수 없습니다."
msgid "Unable to create share group type."
msgstr "공유 그룹 유형을 생성할 수 없습니다."
msgid "Unable to create share group."
msgstr "공유 그룹을 생성할 수 없습니다."
msgid "Unable to create share network."
msgstr "공유 네트워크를 생성할 수 없습니다."
msgid "Unable to create share replica."
msgstr "공유 레플리카를 생성할 수 없습니다."
msgid "Unable to create share snapshot."
msgstr "공유스냅샷을 생성할 수 없습니다"
msgid "Unable to create share type."
msgstr "공유 유형을 생성할 수 없습니다."
msgid "Unable to create share."
msgstr "공유를 생성할 수 없습니다."
#, python-format
msgid "Unable to create share. %s"
msgstr "공유 %s를 생성할 수 없습니다."
#, python-format
msgid "Unable to delete replica \"%s\"."
msgstr "레플리카 \"%s\" 를 삭제할 수 없습니다."
#, python-format
msgid "Unable to delete rule \"%s\"."
msgstr "규칙 \"%s\" 를 삭제 할 수 없습니다."
#, python-format
msgid "Unable to delete share \"%s\". "
msgstr "공유 %s를 제거할 수 없습니다. "
#, python-format
msgid ""
"Unable to delete share group snapshot \"%s\". One or more share groups "
"depend on it."
msgstr ""
"공유 그룹 스냅샷 \"%s\"을 삭제할 수 없습니다. 하나 이상의 공유 그룹이 의존하"
"고 있습니다."
#, python-format
msgid "Unable to delete snapshot \"%s\". One or more shares depend on it."
msgstr ""
"\"%s\" 스냅샷을 삭제할 수 없습니다. 하나 이상의 공유에 의존하고 있습니다."
#, python-format
msgid "Unable to delete snapshot rule \"%s\"."
msgstr "스냅샷 규칙 \"%s\"를 삭제할 수 없습니다."
msgid "Unable to extend share."
msgstr "공유를 확장할수 없습니다."
msgid "Unable to get information about share group type access."
msgstr "공유 그룹 유형 액세스에 관련된 정보를 얻을 수 없습니다."
msgid "Unable to get information about share type access."
msgstr "공유 유형 액세스에 관련된 정보를 가져올 수 없습니다."
msgid "Unable to get list of projects."
msgstr "프로젝트 목록을 가져올 수 없습니다."
msgid "Unable to get manila default quota."
msgstr "Manila 기본 quota 값을 찾을 수 없습니다."
msgid "Unable to get the security services hosts"
msgstr "보안 서비스 호스트를 가져올 수 없습니다."
#, python-format
msgid "Unable to get the specified share group '%s' for snapshot creation."
msgstr "스냅샷 생성을 위한 지정된 공유 그룹 '%s' 를 얻을 수 없습니다."
msgid "Unable to load the specified share group snapshot."
msgstr "지정된 공유 그룹 스냅샷을 불러들일 수 없습니다."
msgid "Unable to load the specified snapshot."
msgstr "지정한 스냅샷을 불러올 수 없습니다."
msgid "Unable to manage share"
msgstr "공유를 관리할 수 없습니다"
#, python-format
msgid "Unable to migrate share %s."
msgstr "공유 %s를 마이그레이션할 수 없습니다."
#, python-format
msgid "Unable to obtain progress of migration of share %s at this moment."
msgstr "현재 공유 %s 에 대한 마이그레이션 과정을 가져올 수 없습니다."
#, python-format
msgid "Unable to reset state of replica '%s'."
msgstr "레플리카 '%s' 상태를 초기화할 수 없습니다"
#, python-format
msgid "Unable to reset status of replica '%s'."
msgstr "레플리카 '%s' 상태를 초기화할 수 없습니다."
#, python-format
msgid "Unable to reset status of share group '%s'."
msgstr "공유 그룹 '%s' 상태를 초기화할 수 없습니다."
#, python-format
msgid "Unable to reset status of share group snapshot '%s'."
msgstr "공유 그룹 스냅샷 '%s'의 상태를 초기화할 수 없습니다."
#, python-format
msgid "Unable to resync replica '%s'."
msgstr "레플리카 '%s' 를 재동기화할 수 없습니다."
msgid "Unable to retrieve default share quotas."
msgstr "기본 공유 quotas 를 찾을 수 없습니다."
msgid "Unable to retrieve list of projects."
msgstr "프로젝트 목록을 가져올 수 없습니다."
msgid "Unable to retrieve quotas."
msgstr "쿼터(quota)를 찾을 수 없습니다."
#, python-format
msgid "Unable to retrieve replica '%s'."
msgstr "레플리카 '%s' 를 가져올 수 없습니다."
#, python-format
msgid "Unable to retrieve security service '%s' details."
msgstr "보안 서비스 '%s'의 상세정보를 가져올 수 없습니다."
msgid "Unable to retrieve security services"
msgstr "보안 서비스를 가져올 수 없습니다"
msgid "Unable to retrieve security_service."
msgstr "security_service를 찾지 못했습니다."
msgid "Unable to retrieve share details."
msgstr "공유 세부 사항을 가져올 수 없습니다."
#, python-format
msgid "Unable to retrieve share group '%s'."
msgstr "공유 그룹 '%s'를 가져올 수 없습니다."
msgid "Unable to retrieve share group details."
msgstr "공유 그룹 상세 정보를 가져올 수 없습니다."
#, python-format
msgid "Unable to retrieve share group snapshot '%s'."
msgstr "공유 그룹 스냅샷 '%s'을 가져올 수 없습니다."
msgid "Unable to retrieve share group snapshot details."
msgstr "공유 그룹 스냅샷 세부 사항을 가져올 수 없습니다."
msgid "Unable to retrieve share group snapshot list."
msgstr "공유 그룹 스냅샷 목록을 가져올 수 없습니다."
msgid "Unable to retrieve share group snapshot."
msgstr "공유 그룹 스냅샷을 가져올 수 없습니다."
msgid "Unable to retrieve share group snapshots."
msgstr "공유 그룹 스냅샷을 가져올 수 없습니다."
msgid "Unable to retrieve share group types."
msgstr "공유 그룹 유형을 가져올 수 없습니다."
msgid "Unable to retrieve share group."
msgstr "공유 그룹을 가져올 수 없습니다."
msgid "Unable to retrieve share groups."
msgstr "공유 그룹 상태를 가져올 수 없습니다."
msgid "Unable to retrieve share instance details."
msgstr "공유 인스턴스 세부 사항을 가져올 수 없습니다."
msgid "Unable to retrieve share instances."
msgstr "공유 인스턴스를 가져올 수 없습니다."
msgid "Unable to retrieve share limit information."
msgstr "공유 최대 사용량 정보를 찾지 못 했습니다."
msgid "Unable to retrieve share list."
msgstr "공유 목록을 가져올 수 없습니다."
msgid "Unable to retrieve share network details."
msgstr "공유 네트워크 상세정보를 가져올 수 없습니다."
msgid "Unable to retrieve share network."
msgstr "공유네트워크를 가져올 수 없습니다."
msgid "Unable to retrieve share networks"
msgstr "공유 네트워크를 가져올 수 없습니다"
msgid "Unable to retrieve share replicas."
msgstr "공유 레플리카를 가져올 수 없습니다."
msgid "Unable to retrieve share rules."
msgstr "공유 규칙을 찾을 수 없습니다."
msgid "Unable to retrieve share server details."
msgstr "공유 서버 세부 사항을 가져올 수 없습니다."
msgid "Unable to retrieve share servers"
msgstr "공유 서버를 가져올 수 없습니다"
msgid "Unable to retrieve share snapshot list."
msgstr "공유 스냅샷 목록을 가져올 수 없습니다."
msgid "Unable to retrieve share snapshot rules."
msgstr "공유 스냅샷 규칙을 가져올 수 없습니다."
msgid "Unable to retrieve share snapshot."
msgstr "공유 스냅샷을 가져올 수 없습니다."
msgid "Unable to retrieve share snapshots list."
msgstr "공유 스냅샷 목록을 찾을 수 없습니다."
msgid "Unable to retrieve share snapshots."
msgstr "공유 스냅샷을 찾지 못했습니다."
msgid "Unable to retrieve share types."
msgstr "공유 유형을 가져올 수 없습니다."
msgid "Unable to retrieve share."
msgstr "공유를 찾을 수 없습니다."
#, python-format
msgid "Unable to retrieve share. %s"
msgstr "공유 %s를 가져올 수 없습니다. "
msgid "Unable to retrieve share_gruop_type."
msgstr "공유 그룹 유형을 가져올 수 없습니다."
msgid "Unable to retrieve share_type."
msgstr "share_type 을 가져올 수 없습니다."
msgid "Unable to retrieve snapshot details."
msgstr "스냅샷 상세정보를 찾을 수 없습니다."
msgid "Unable to retrieve snapshot."
msgstr "스냅샷을 찾을 수 없습니다."
msgid "Unable to retrieve volume details."
msgstr "볼륨 세부 사항을 가져올 수 없습니다."
msgid "Unable to revert share to the snapshot."
msgstr "공유를 스냅샷으로 되돌릴 수 없습니다."
#, python-format
msgid "Unable to set replica '%s' as active."
msgstr "레플리카 \"%s\"를 활성화 상태로 설정 할 수 없습니다. "
msgid "Unable to unmanage share."
msgstr "공유를 관리 해제할 수 없습니다."
#, python-format
msgid "Unable to update access for share group type \"%s\"."
msgstr "공유 그룹 유형 \"%s\"에 대한 업데이트를 할 수 없습니다."
#, python-format
msgid "Unable to update access for share type \"%s\"."
msgstr "공유 유형 \"%s\" 에 대한 액세스를 업데이트할 수 없습니다."
msgid "Unable to update default quotas."
msgstr "기본 할당량을 업데이트할 수 없습니다."
msgid "Unable to update extra_specs for share type."
msgstr "공유 유형에 대한 extra_specs 을 업데이트할 수 없습니다."
msgid "Unable to update group_specs for share group type."
msgstr "공유 그룹 유형의 그룹 스펙을 업데이트할 수 없습니다."
msgid "Unable to update security service."
msgstr "보안 서비스를 업데이트 할 수 없습니다."
msgid "Unable to update share group snapshot."
msgstr "공유 그룹 스냅샷을 업데이트할 수 없습니다."
msgid "Unable to update share group type."
msgstr "공유 그룹 유형을 업데이트할 수 없습니다."
msgid "Unable to update share group."
msgstr "공유 그룹을 업데이트할 수 없습니다."
msgid "Unable to update share metadata."
msgstr "공유 메타데이터를 업데이트할 수 없습니다."
#, python-format
msgid "Unable to update share network \"%s\"."
msgstr "공유 네트워크 \"%s\"를 업데이트 할 수 없습니다."
msgid "Unable to update share network."
msgstr "공유 네트워크를 업데이트 할 수 없습니다."
msgid "Unable to update share snapshot."
msgstr "공유 스냅샷을 업데이트할 수 없습니다."
msgid "Unable to update share type."
msgstr "공유 유형을 업데이트할 수 없습니다."
msgid "Unable to update share."
msgstr "공유를 업데이트할 수 없습니다."
msgid "Unknown"
msgstr "알 수 없음"
msgid "Unmanage"
msgstr "관리 해제"
msgctxt "Current status of share"
msgid "Unmanage Error"
msgstr "관리되지 않은 에러"
msgid "Unmanage Share"
msgstr "공유 관리 해제"
msgid "Update"
msgstr "업데이트"
msgid "Update Share Group"
msgstr "공유 그룹 업데이트"
msgid "Update Share Group Snapshot"
msgstr "공유 그룹 스냅샷 업데이트"
msgid "Update Share Group Type"
msgstr "공유 그룹 유형 업데이트"
msgid "Update Share Network"
msgstr "공유 네트워크 업데이트"
msgid "Update Share Snapshot"
msgstr "공유 스냅샷 업데이트"
msgid "Update Share Type"
msgstr "공유 유형 업데이트"
msgid "Update Share group Type"
msgstr "공유 그룹 유형 업데이트"
msgid "Update share network"
msgstr "공유 네트워크 업데이트"
msgid "Updated"
msgstr "업데이트됨"
msgid "Updated At"
msgstr "업데이트"
#, python-format
msgid "Updated access for share group type \"%s\"."
msgstr "공유 그룹 유형 \"%s\"에 대한 액세스가 업데이트 되었습니다."
#, python-format
msgid "Updated access for share type \"%s\"."
msgstr "공유 유형 \"%s\" 에 대한 엑세스를 업데이트하였습니다."
#, python-format
msgid "Updated share network \"%s\"."
msgstr "공유 네트워크 \"%s\" 업데이트됨."
#, python-format
msgid "Updating share \"%s\""
msgstr "공유 \"%s\" 업데이트 중"
#, python-format
msgid "Updating share group \"%s\""
msgstr "공유 그룹 \"%s\" 업데이트 중"
#, python-format
msgid "Updating share group snapshot \"%s\""
msgstr "공유 그룹 스냅샷 \"%s\" 업데이트 중"
#, python-format
msgid "Updating share metadata \"%s\""
msgstr "공유 메타데이터 \"%s\" 업데이트중"
#, python-format
msgid "Updating share network \"%s\""
msgstr "공유 네트워크 \"%s\" 업데이트 중."
#, python-format
msgid "Updating share snapshot \"%s\""
msgstr "공유 스냅샷 \"%s\" 업데이트 중"
msgid "Use share group snapshot as a source"
msgstr "공유 그룹 스냅샷을 소스로 사용"
msgid "Use snapshot as a source"
msgstr "소스로 스냅샷 사용"
msgid "User"
msgstr "사용자"
msgid "Visibility"
msgstr "가시성"
msgid ""
"When a share is \"unmanaged\", the share will no longer be visible within "
"OpenStack. Note that the share will not be deleted.
This is "
"equivalent to the 'manila unmanage' command."
msgstr ""
"공유가 \"관리되지 않음\"으로 된 경우, 더이상 OpenStack에서 확인할 수 없습니"
"다. 공유는 삭제되지 않습니다.
'manila unmanage' 명령과 동"
"일합니다."
msgid "Writable"
msgstr "쓰기가능"
msgid "as Active?"
msgstr "활성화로?"
msgid "key=value pairs per line can be set"
msgstr "한 행 당 key=value 쌍을 설정 가능합니다"
manila-ui-3.0.0/manila_ui/features.py 0000664 0001750 0001750 00000003615 13647271543 017557 0 ustar zuul zuul 0000000 0000000 # Copyright 2017 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.
"""
This module stores functions that return boolean values and say
which manila features are enabled and which are disabled among those
that are optional for manila UI.
These functions are required mostly for complex features, which consist
of more than one logical part in manila UI and requires appropriate logic
change in more than 1 place. For example, to disable share groups feature
we need to do following:
- Remove 'share_groups' panel from 'share groups' panel group in each
dashboard.
- Disable or do not register URLs for disabled features, so, no one
will be able to request disabled features knowing direct URL.
- Add/remove buttons for other (not disabled) features that are related
to it somehow.
"""
from django.conf import settings
from horizon.utils import memoized
@memoized.memoized
def is_share_groups_enabled():
manila_config = getattr(settings, 'OPENSTACK_MANILA_FEATURES', {})
return manila_config.get('enable_share_groups', True)
@memoized.memoized
def is_replication_enabled():
manila_config = getattr(settings, 'OPENSTACK_MANILA_FEATURES', {})
return manila_config.get('enable_replication', True)
@memoized.memoized
def is_migration_enabled():
manila_config = getattr(settings, 'OPENSTACK_MANILA_FEATURES', {})
return manila_config.get('enable_migration', True)
manila-ui-3.0.0/manila_ui/__init__.py 0000664 0001750 0001750 00000001231 13647271543 017470 0 ustar zuul zuul 0000000 0000000 # -*- coding: utf-8 -*-
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import pbr.version
__version__ = pbr.version.VersionInfo(
'manila_ui').version_string()
manila-ui-3.0.0/devstack/ 0000775 0001750 0001750 00000000000 13647271736 015234 5 ustar zuul zuul 0000000 0000000 manila-ui-3.0.0/devstack/plugin.sh 0000664 0001750 0001750 00000003274 13647271543 017070 0 ustar zuul zuul 0000000 0000000 # plugin.sh - DevStack plugin.sh dispatch script manila-ui
function install_manila_ui {
# NOTE(vponomaryov): workaround for devstack bug: 1540328
# where devstack install 'test-requirements' but should not do it
# for manila-ui project as it installs Horizon from url.
# Remove following two 'mv' commands when mentioned bug is fixed.
mv $MANILA_UI_DIR/test-requirements.txt $MANILA_UI_DIR/_test-requirements.txt
setup_develop ${MANILA_UI_DIR}
mv $MANILA_UI_DIR/_test-requirements.txt $MANILA_UI_DIR/test-requirements.txt
}
# check for service enabled
if is_service_enabled horizon && is_service_enabled manila && is_service_enabled manila-ui; then
if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then
# Set up system services
# no-op
:
elif [[ "$1" == "stack" && "$2" == "install" ]]; then
# Perform installation of service source
echo_summary "Installing Manila UI"
install_manila_ui
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
# Configure after the other layer 1 and 2 services have been configured
echo_summary "Configuring Manila UI"
cp -a ${MANILA_UI_DIR}/manila_ui/local/enabled/* ${DEST}/horizon/openstack_dashboard/local/enabled/
cp -a ${MANILA_UI_DIR}/manila_ui/local/local_settings.d/* ${DEST}/horizon/openstack_dashboard/local/local_settings.d/
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
manila-ui-3.0.0/devstack/settings 0000664 0001750 0001750 00000000214 13647271543 017010 0 ustar zuul zuul 0000000 0000000 # settings file for manila-ui plugin
enable_service manila-ui
# set up default directories
MANILA_UI_DIR=${MANILA_UI_DIR:=$DEST/manila-ui}
manila-ui-3.0.0/babel-djangojs.cfg 0000664 0001750 0001750 00000000061 13647271543 016744 0 ustar zuul zuul 0000000 0000000 [javascript: **.js]
[angular: **/static/**.html]
manila-ui-3.0.0/.mailmap 0000664 0001750 0001750 00000000130 13647271543 015037 0 ustar zuul zuul 0000000 0000000 # Format is:
#
#