Retiring neutron-lbaas-dashboard

Depends-On: https://review.opendev.org/#/c/658493/
Change-Id: I3e2e42efc30eced5abb6c8fff0d0fc974fc9722b
This commit is contained in:
Adam Harwell 2019-05-10 15:12:02 -07:00
parent 5eed736df1
commit 7d60958b8c
217 changed files with 15 additions and 24931 deletions

View File

@ -1,7 +0,0 @@
[run]
branch = True
source = neutron_lbaas_dashboard
omit = neutron_lbaas_dashboard/openstack/*
[report]
ignore_errors = True

View File

@ -1,52 +0,0 @@
# Set up globals
globals:
angular: false
extends: openstack
# Most environment options are not explicitly enabled or disabled, only
# included here for completeness' sake. They are commented out, because the
# global updates.py script would otherwise override them during a global
# requirements synchronization.
#
# Individual projects should choose which platforms they deploy to.
env:
# browser global variables.
browser: true
# Adds all of the Jasmine testing global variables for version 1.3 and 2.0.
jasmine: true
# Enable eslint-plugin-angular
plugins:
- angular
# Below we adjust rules specific to horizon's usage of openstack's linting
# rules, and its own plugin inclusions.
rules:
#############################################################################
# Disabled Rules from eslint-config-openstack
#############################################################################
valid-jsdoc: 1
brace-style: 1
no-extra-parens: 1
consistent-return: 1
callback-return: 1
guard-for-in: 1
block-scoped-var: 1
semi-spacing: 1
no-redeclare: 1
no-new: 1
#############################################################################
# Angular Plugin Customization
#############################################################################
angular/controller-as-vm:
- 1
- "ctrl"
# Remove after migrating to angular 1.4 or later.
angular/no-cookiestore:
- 1

61
.gitignore vendored
View File

@ -1,61 +0,0 @@
*.py[cod]
# C extensions
*.so
# Packages
*.egg
*.egg-info
dist
build
.eggs
eggs
parts
bin
var
sdist
develop-eggs
.installed.cfg
lib
lib64
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
*.lock
.tox
nosetests.xml
.secret_key_store
.testrepository
node_modules
coverage*
test-shim.js
# Translations
*.mo
.zanata-cache/
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
# Complexity
output/*.html
output/*/index.html
# Sphinx
doc/build
doc/source/contributor/modules
# pbr generates these
AUTHORS
ChangeLog
# Editors
*~
.*.swp
.*sw?
.ropeproject/

View File

@ -1,3 +0,0 @@
# Format is:
# <preferred e-mail> <other e-mail 1>
# <preferred e-mail> <other e-mail 2>

View File

@ -1,8 +0,0 @@
- project:
templates:
- check-requirements
- horizon-nodejs10-jobs
- openstack-lower-constraints-jobs
- openstack-python-jobs-horizon
- openstack-python3-train-jobs-horizon
- publish-openstack-docs-pti

View File

@ -1,21 +0,0 @@
.. warning::
Neutron-lbaas-dashboard is now deprecated. Please see the FAQ: https://wiki.openstack.org/wiki/Neutron/LBaaS/Deprecation
If you would like to contribute to the development of OpenStack, you must
follow the steps in this page:
http://docs.openstack.org/infra/manual/developers.html
If you already have a good understanding of how the system works and your
OpenStack accounts are set up, you can skip to the development workflow
section of this documentation to learn how changes to OpenStack should be
submitted for review via the Gerrit tool:
http://docs.openstack.org/infra/manual/developers.html#development-workflow
Pull requests submitted through GitHub will be ignored.
Bugs should be filed on Launchpad, not GitHub:
https://storyboard.openstack.org/#!/project/907

View File

@ -1,4 +0,0 @@
neutron-lbaas-dashboard Style Commandments
==========================================
Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/

176
LICENSE
View File

@ -1,176 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.

15
README Normal file
View File

@ -0,0 +1,15 @@
This project is no longer maintained.
The contents of this repository are still available in the Git
source code management system. To see the contents of this
repository before it reached its end of life, please check out the
previous commit with "git checkout HEAD^1".
The new official OpenStack LBaaS project is Octavia. See the following
resources for more details:
https://wiki.openstack.org/wiki/Neutron/LBaaS/Deprecation
https://governance.openstack.org/tc/reference/projects/octavia.html
For any further questions, please email
openstack-discuss@lists.openstack.org or join #openstack-dev on
Freenode.

View File

@ -1,101 +0,0 @@
========================
Team and repository tags
========================
.. image:: https://governance.openstack.org/tc/badges/neutron-lbaas-dashboard.svg
:target: https://governance.openstack.org/tc/reference/tags/index.html
.. Change things from this point on
.. warning::
Neutron-lbaas-dashboard is now deprecated. Please see the FAQ: https://wiki.openstack.org/wiki/Neutron/LBaaS/Deprecation
=======================
neutron-lbaas-dashboard
=======================
Horizon panels for Neutron LBaaS v2
* Free software: Apache license
* Documentation: https://docs.openstack.org/neutron-lbaas-dashboard/latest/
* Source: https://opendev.org/openstack/neutron-lbaas-dashboard
* Bugs: https://storyboard.openstack.org/#!/project/907
Features
--------
* Please see neutron-lbaas repository
Howto
-----
1. Package the neutron_lbaas_dashboard by running::
python setup.py sdist
This will create a python egg in the dist folder, which can be used to
install on the horizon machine or within horizon's python virtual
environment.
2. Copy ``_1481_project_ng_loadbalancersv2_panel.py`` in
``neutron_lbaas_dashboard/enabled`` directory
to ``openstack_dashboard/local/enabled``.
3. (Optional) Copy the policy file into horizon's policy files folder, and
add this config ``POLICY_FILES``::
'neutron_lbaas': 'neutron_lbaas_policy.json',
4. Django has a compressor feature that performs many enhancements for the
delivery of static files. If the compressor feature is enabled in your
environment (``COMPRESS_OFFLINE = True``), run the following commands::
$ ./manage.py collectstatic
$ ./manage.py compress
5. Finally restart your web server to enable neutron-lbaas-dashboard
in your Horizon::
$ sudo service apache2 restart
Enabling neutron-lbaas-dashboard and octavia-dashboard
------------------------------------------------------
In general we advise against having both dashboards running at the same
time to avoid confusing users, which is exaggerated since the dashboards
will have the same label.
In rare circumstances, e.g. as part of a migration strategy, it might be
necessary to do so. The main issue to watch out for is to avoid neutron-lbaas
and Octavia getting out of sync and neutron-lbaas-dashboard showing phantom
load balancers - this can be avoided if the sync between Octavia and
neutron-lbaas is fully enabled.
Here is a table to show some cases:
+---------------+-----------------+----------------+-----------+--------------+
| Configuration | Configuration | neutron-lbaas- | octavia- | Notes |
| neutron-lbaas | Octavia | dashboard | dashboard | |
| | | enabled | enabled | |
+---------------+-----------------+----------------+-----------+--------------+
| not installed | v2 API enabled | not supported | preferred | |
+---------------+-----------------+----------------+-----------+--------------+
| octavia-driver| v2 API disabled | supported | not | sync |
| | v1 API enabled | | supported | required |
+---------------+-----------------+----------------+-----------+--------------+
| octavia-driver| v2 API enabled | supported | preferred | sync |
| | v1 API enabled | | | required |
+---------------+-----------------+----------------+-----------+--------------+
| octavia-proxy | v1 API disabled | Supported (but | preferred | |
| plugin | v2 API enabled | not | | |
| | | recommended) | | |
+---------------+-----------------+----------------+-----------+--------------+
| no octavia | not installed | preferred | not | |
| driver but | | | supported | |
| other drivers | | | | |
+---------------+-----------------+----------------+-----------+--------------+
| no octavia | v2 API enabled | preferred | preferred | independent |
| driver but | v1 API disabled | | | services |
| other drivers | | | | |
+---------------+-----------------+----------------+-----------+--------------+

View File

@ -1,6 +0,0 @@
[extractors]
django = django_babel.extract:extract_django
[python: **.py]
[django: templates/**.html]
[django: **/templates/**.csv]

View File

@ -1,14 +0,0 @@
[extractors]
# We use a custom extractor to find translatable strings in AngularJS
# templates. The extractor is included in horizon.utils for now.
# See http://babel.pocoo.org/docs/messages/#referencing-extraction-methods for
# details on how this works.
angular = horizon.utils.babel_extract_angular:extract_angular
[javascript: **.js]
# We need to look into all static folders for HTML files.
# The **/static ensures that we also search within
# .../dashboards/XYZ/static which will ensure
# that plugins are also translated.
[angular: **/static/**.html]

View File

@ -1,22 +0,0 @@
==========================================
Neutron LBaaS v2 dashboard devstack plugin
==========================================
This directory contains the neutron-lbaas-dashboard devstack plugin.
To enable the plugin, add the following to your local.conf:
enable_plugin neutron-lbaas-dashboard <neutron-lbaas-dashboard GITURL> [GITREF]
where
<neutron-lbaas-dashboard GITURL> is the URL of a neutron-lbaas-dashboard repository
[GITREF] is an optional git ref (branch/ref/tag). The default is master.
For example:
enable_plugin neutron-lbaas-dashboard https://opendev.org/openstack/neutron-lbaas-dashboard
Once you enable the plugin in your local.conf, ensure ``horizon`` and
``q-lbaasv2`` services are enabled. If both of them are enabled,
neutron-lbaas-dashboard will be enabled automatically

View File

@ -1,35 +0,0 @@
function neutron_lbaas_dashboard_install {
setup_develop $NEUTRON_LBAAS_DASHBOARD_DIR
}
function neutron_lbaas_dashboard_configure {
cp $NEUTRON_LBAAS_DASHBOARD_ENABLE_FILE_PATH \
$HORIZON_DIR/openstack_dashboard/local/enabled/
}
if is_service_enabled horizon && is_service_enabled q-lbaasv2; then
if [[ "$1" == "stack" && "$2" == "install" ]]; then
# Perform installation of service source
echo_summary "Installing neutron-lbaas-dashboard"
neutron_lbaas_dashboard_install
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
echo_summary "Configuring neutron-lbaas-dashboard"
neutron_lbaas_dashboard_configure
elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
# Initialize and start the LBaaS service
echo_summary "Initializing neutron-lbaas-dashboard"
fi
fi
if [[ "$1" == "unstack" ]]; then
# Shut down LBaaS dashboard services
:
fi
if [[ "$1" == "clean" ]]; then
# Remove state and transient data
# Remember clean.sh first calls unstack.sh
# Remove lbaas-dashboard enabled file and pyc
rm -f "$HORIZON_DIR"/openstack_dashboard/local/enabled/"$NEUTRON_LBAAS_DASHBOARD_ENABLE_FILE_NAME"*
fi

View File

@ -1,5 +0,0 @@
NEUTRON_LBAAS_DASHBOARD_DIR=$DEST/neutron-lbaas-dashboard
NEUTRON_LBAAS_DASHBOARD_ENABLE_FILE_NAME=_1481_project_ng_loadbalancersv2_panel.py
NEUTRON_LBAAS_DASHBOARD_ENABLE_FILE_PATH=$NEUTRON_LBAAS_DASHBOARD_DIR/neutron_lbaas_dashboard/enabled/$NEUTRON_LBAAS_DASHBOARD_ENABLE_FILE_NAME

View File

@ -1,6 +0,0 @@
# The order of packages is significant, because pip processes them in the order
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
openstackdocstheme>=1.18.1 # Apache-2.0
sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD
sphinxcontrib-apidoc>=0.2.1 # BSD

View File

@ -1,115 +0,0 @@
# -*- 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 logging
import os
import sys
import django
sys.path.insert(0, os.path.abspath('../..'))
sys.path.insert(0, os.path.abspath('.'))
logging.getLogger('openstack_dashboard.settings').setLevel(logging.ERROR)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'openstack_dashboard.settings')
django.setup()
# -- 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 = [
'openstackdocstheme',
'sphinx.ext.autodoc',
'sphinx.ext.coverage',
# 'sphinx.ext.intersphinx',
'sphinx.ext.todo',
'sphinx.ext.viewcode',
'sphinxcontrib.apidoc'
]
# 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'neutron-lbaas-dashboard'
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 = '_theme'
# html_static_path = ['static']
html_theme = 'openstackdocs'
html_theme_options = {
'display_toc': False
}
html_static_path = []
# Output file base name for HTML help builder.
htmlhelp_basename = '%sdoc' % project
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = '%Y-%m-%d %H:%M'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass
# [howto/manual]).
latex_documents = [
('index',
'%s.tex' % project,
u'%s Documentation' % project,
u'OpenStack Foundation', 'manual'),
]
# Example configuration for intersphinx: refer to the Python standard library.
# intersphinx_mapping = {'http://docs.python.org/': None}
# A list of ignored prefixes for module index sorting.
modindex_common_prefix = ['neutron-lbaas-dashboard.']
apidoc_output_dir = 'contributor/modules'
apidoc_module_dir = '../../neutron_lbaas_dashboard'
apidoc_excluded_paths = [
'tests',
'enabled',
'locale',
'static',
'post_install.sh'
'karma.conf.js'
]

View File

@ -1,4 +0,0 @@
============
Contributing
============
.. include:: ../../CONTRIBUTING.rst

View File

@ -1,21 +0,0 @@
.. neutron-lbaas-dashboard 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.
Welcome to neutron-lbaas-dashboard's documentation!
========================================================
.. warning::
Neutron-lbaas-dashboard is now deprecated. Please see the FAQ: https://wiki.openstack.org/wiki/Neutron/LBaaS/Deprecation
Contents:
.. toctree::
:maxdepth: 2
readme
installation
usage
contributing
reference

View File

@ -1,28 +0,0 @@
============
Installation
============
.. warning::
Neutron-lbaas-dashboard is now deprecated. Please see the FAQ: https://wiki.openstack.org/wiki/Neutron/LBaaS/Deprecation
At the command line::
$ sudo pip install neutron-lbaas-dashboard
Enable the plugin::
$ cp /usr/local/lib/python2.7/dist-packages/neutron_lbaas_dashboard/enabled/_1481_project_ng_loadbalancersv2_panel.py /opt/stack/horizon/openstack_dashboard/enabled/
Note: This file may have installed in a different location depending on your
host configuration. For example, on CentOS it may be in
/usr/lib/python2.7/site-packages.
Run the Django update commands (answer 'yes')::
$ /opt/stack/horizon/manage.py collectstatic
$ /opt/stack/horizon/manage.py compress
Restart Apache::
$ sudo service apache2 restart

View File

@ -1 +0,0 @@
.. include:: ../../README.rst

View File

@ -1,16 +0,0 @@
=========
Reference
=========
Indices and search
------------------
.. toctree::
:hidden:
contributor/modules/modules
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@ -1,87 +0,0 @@
==========
User Guide
==========
.. warning::
Neutron-lbaas-dashboard is now deprecated. Please see the FAQ: https://wiki.openstack.org/wiki/Neutron/LBaaS/Deprecation
Load-Balancer-as-a-Service (LBaaS) enables networking to distribute incoming
requests evenly among designated instances. This distribution ensures that
the workload is shared predictably among instances and enables more effective
use of system resources. Use one of these load-balancing methods to distribute
incoming requests:
* Round robin: Rotates requests evenly between multiple instances.
* Source IP: Requests from a unique source IP address are consistently
directed to the same instance.
* Least connections: Allocates requests to the instance with the
least number of active connections.
As an end user, you can create and manage load balancers and related
objects for users in various projects. You can also delete load balancers
and related objects.
LBaaS v2 has several new concepts to understand:
Load balancer
The load balancer occupies a neutron network port and
has an IP address assigned from a subnet.
Listener
Each port that listens for traffic on a particular load balancer is
configured separately and tied to the load balancer. Multiple listeners can
be associated with the same load balancer.
Pool
A pool is a group of hosts that sits behind the load balancer and
serves traffic through the load balancer.
Member
Members are the actual IP addresses that receive traffic from
the load balancer. Members are associated with pools.
Health monitor
Members may go offline from time to time and health monitors
diverts traffic away from members that are not responding properly.
Health monitors are associated with pools.
View existing load balancers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#. Log in to the OpenStack dashboard.
#. On the :guilabel:`Project` tab, open the
:guilabel:`Network` tab, and click the
:guilabel:`Load Balancers` category.
This view shows the list of existing load balancers. To view details
of any of the load balancers, click on the specific load balancer.
Create a load balancer
~~~~~~~~~~~~~~~~~~~~~~
#. Log in to the OpenStack dashboard.
#. On the :guilabel:`Project` tab, open the
:guilabel:`Network` tab, and click the
:guilabel:`Load Balancers` category.
#. Click the :guilabel:`Create Load Balancer` button.
Use the concepts described in the overview section to fill in
the necessary information about the load balancer you want to create.
Keep in mind, the health checks routinely run against each instance
within a target load balancer and the result of the health check is
used to determine if the instance receives new connections.
.. note::
A message indicates whether the action succeeded.
Delete a load balancer
~~~~~~~~~~~~~~~~~~~~~~
#. Select the load balancer you want to delete
and click the :guilabel:`Delete Load Balancer` button.
To be deleted successfully, a load balancer must not
have any listeners or pools associated with
it. The delete action is also available in the
:guilabel:`Actions` column for the individual load balancers.

View File

@ -1,147 +0,0 @@
amqp==2.1.1
appdirs==1.3.0
asn1crypto==0.23.0
Babel==2.3.4
cachetools==2.0.0
cffi==1.7.0
cliff==2.8.0
cmd2==0.8.0
contextlib2==0.4.0
coverage==4.0
cryptography==2.1
ddt==1.0.1
debtcollector==1.2.0
decorator==3.4.0
deprecation==1.0
Django==1.8
django-appconf==1.0.2
django-babel==0.5.1
django-compressor==2.0
django-pyscss==2.0.2
dogpile.cache==0.6.2
eventlet==0.18.2
extras==1.0.0
fasteners==0.7.0
fixtures==3.0.0
flake8==2.5.5
futurist==1.2.0
greenlet==0.4.10
hacking==0.12.0
horizon==14.0.0.0b3
idna==2.6
iso8601==0.1.11
Jinja2==2.10
jmespath==0.9.0
jsonpatch==1.16
jsonpointer==1.13
jsonschema==2.6.0
keystoneauth1==3.4.0
kombu==4.0.0
linecache2==1.0.0
MarkupSafe==1.0
mccabe==0.2.1
mock==2.0.0
monotonic==0.6
mox3==0.20.0
msgpack-python==0.4.0
munch==2.1.0
netaddr==0.7.18
netifaces==0.10.4
openstacksdk==0.11.2
os-client-config==1.28.0
os-service-types==1.2.0
osc-lib==1.8.0
oslo.concurrency==3.25.0
oslo.config==5.2.0
oslo.context==2.19.2
oslo.i18n==3.15.3
oslo.log==3.36.0
oslo.messaging==5.29.0
oslo.middleware==3.31.0
oslo.policy==1.30.0
oslo.serialization==2.18.0
oslo.service==1.24.0
oslo.utils==3.33.0
oslotest==3.2.0
osprofiler==1.4.0
Paste==2.0.2
PasteDeploy==1.5.0
pbr==2.0.0
pep8==1.5.7
pika==0.10.0
pika-pool==0.1.3
Pint==0.5
positional==1.2.1
prettytable==0.7.2
pycparser==2.18
pyflakes==0.8.1
pyinotify==0.9.6
pymongo==3.0.2
pyOpenSSL==17.1.0
pyparsing==2.1.0
pyperclip==1.5.27
pyScss==1.3.4
python-barbicanclient==4.5.2
python-cinderclient==3.3.0
python-dateutil==2.5.3
python-glanceclient==2.8.0
python-keystoneclient==3.8.0
python-mimeparse==1.6.0
python-neutronclient==6.7.0
python-novaclient==9.1.0
python-subunit==1.0.0
python-swiftclient==3.2.0
pytz==2013.6
PyYAML==3.12
rcssmin==1.0.6
repoze.lru==0.7
requests==2.14.2
requestsexceptions==1.2.0
rfc3986==0.3.1
rjsmin==1.0.12
Routes==2.3.1
selenium==2.50.1
semantic-version==2.3.1
simplejson==3.5.1
six==1.10.0
sphinxcontrib-apidoc===0.2.1
statsd==3.2.1
stevedore==1.20.0
tenacity==3.2.1
testscenarios==0.4
testtools==2.2.0
traceback2==1.4.0
unittest2==1.1.0
vine==1.1.4
warlock==1.2.0
WebOb==1.7.1
wrapt==1.7.0
XStatic==1.0.0
XStatic-Angular==1.5.8.0
XStatic-Angular-Bootstrap==2.2.0.0
XStatic-Angular-FileUpload==12.0.4.0
XStatic-Angular-Gettext==2.3.8.0
XStatic-Angular-lrdragndrop==1.0.2.2
XStatic-Angular-Schema-Form==0.8.13.0
XStatic-Bootstrap-Datepicker==1.3.1.0
XStatic-Bootstrap-SCSS==3.3.7.1
XStatic-bootswatch==3.3.7.0
XStatic-D3==3.5.17.0
XStatic-Font-Awesome==4.7.0.0
XStatic-Hogan==2.0.0.2
XStatic-Jasmine==2.4.1.1
XStatic-jQuery==1.8.2.1
XStatic-JQuery-Migrate==1.2.1.1
XStatic-jquery-ui==1.10.4.1
XStatic-JQuery.quicksearch==2.0.3.1
XStatic-JQuery.TableSorter==2.14.5.1
XStatic-JSEncrypt==2.3.1.1
XStatic-mdi==1.4.57.0
XStatic-objectpath==1.2.1.0
XStatic-Rickshaw==1.5.0.0
XStatic-roboto-fontface==0.5.0.0
XStatic-smart-table==1.4.13.2
XStatic-Spin==1.2.5.2
XStatic-term.js==0.0.7.0
XStatic-tv4==1.2.7.0
xvfbwrapper==0.1.3

View File

@ -1,23 +0,0 @@
#!/usr/bin/env python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import os
import sys
from django.core.management import execute_from_command_line # noqa
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE",
"openstack_dashboard.settings")
execute_from_command_line(sys.argv)

View File

@ -1,16 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import pbr.version
__version__ = pbr.version.VersionInfo(
'neutron_lbaas_dashboard').version_string()

View File

@ -1,26 +0,0 @@
# Copyright 2015 IBM Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""This package holds the REST API that supports the LBaaS v2 dashboard
Javascript code.
It is not intended to be used outside of Horizon, and makes no promises of
stability or fitness for purpose outside of that scope.
It does not promise to adhere to the general OpenStack API Guidelines set out
in https://wiki.openstack.org/wiki/APIChangeGuidelines.
"""
# import REST API modules here
from neutron_lbaas_dashboard.api.rest import barbican # noqa
from neutron_lbaas_dashboard.api.rest import nlbaasv2 # noqa

View File

@ -1,95 +0,0 @@
# Copyright 2016 IBM Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""API over the barbican service.
"""
from barbicanclient import client as barbican_client
from django.conf import settings
from django.views import generic
from keystoneclient.auth.identity import v2 as auth_v2
from keystoneclient.auth.identity import v3 as auth_v3
from keystoneclient import session
from horizon.utils.memoized import memoized # noqa
from openstack_dashboard.api import base
from openstack_dashboard.api import keystone
from openstack_dashboard.api.rest import urls
from openstack_dashboard.api.rest import utils as rest_utils
@memoized
def barbicanclient(request):
project_id = request.user.project_id
region = request.user.services_region
endpoint = base.url_for(request, 'key-manager')
if keystone.get_version() < 3:
auth = auth_v2.Token(settings.OPENSTACK_KEYSTONE_URL,
request.user.token.id,
tenant_id=project_id)
else:
domain_id = request.session.get('domain_context')
auth = auth_v3.Token(settings.OPENSTACK_KEYSTONE_URL,
request.user.token.id,
project_id=project_id,
project_domain_id=domain_id)
insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', False)
cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', None)
# If 'insecure' is True, 'verify' is False in all cases; otherwise
# pass the cacert path if it is present, or True if no cacert.
verify = not insecure and (cacert or True)
return barbican_client.Client(session=session.Session(auth=auth,
verify=verify),
endpoint=endpoint,
region_name=region)
@urls.register
class SSLCertificates(generic.View):
"""API for working with SSL certificate containers.
"""
url_regex = r'barbican/certificates/$'
@rest_utils.ajax()
def get(self, request):
"""List certificate containers.
The listing result is an object with property "items".
"""
limit = getattr(settings, 'API_RESULT_LIMIT', 1000)
containers = barbicanclient(request).containers
params = {'limit': limit, 'type': 'certificate'}
result = containers._api.get('containers', params=params)
return {'items': result.get('containers')}
@urls.register
class Secrets(generic.View):
"""API for working with secrets.
"""
url_regex = r'barbican/secrets/$'
@rest_utils.ajax()
def get(self, request):
"""List secrets.
The listing result is an object with property "items".
"""
limit = getattr(settings, 'API_RESULT_LIMIT', 1000)
secrets = barbicanclient(request).secrets
params = {'limit': limit}
result = secrets._api.get('secrets', params=params)
return {'items': result.get('secrets')}

View File

@ -1,780 +0,0 @@
# Copyright 2015 IBM Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""API over the neutron LBaaS v2 service.
"""
from six.moves import _thread as thread
from time import sleep
from django.views import generic
from horizon import conf
from openstack_dashboard.api import neutron
from openstack_dashboard.api.rest import urls
from openstack_dashboard.api.rest import utils as rest_utils
neutronclient = neutron.neutronclient
def poll_loadbalancer_status(request, loadbalancer_id, callback,
from_state='PENDING_UPDATE', to_state='ACTIVE',
callback_kwargs=None):
"""Poll for the status of the load balancer.
Polls for the status of the load balancer and calls a function when the
status changes to a specified state.
:param request: django request object
:param loadbalancer_id: id of the load balancer to poll
:param callback: function to call when polling is complete
:param from_state: initial expected state of the load balancer
:param to_state: state to check for
:param callback_kwargs: kwargs to pass into the callback function
"""
interval = conf.HORIZON_CONFIG['ajax_poll_interval'] / 1000.0
status = from_state
while status == from_state:
sleep(interval)
lb = neutronclient(request).show_loadbalancer(
loadbalancer_id).get('loadbalancer')
status = lb['provisioning_status']
if status == to_state:
kwargs = {'loadbalancer_id': loadbalancer_id}
if callback_kwargs:
kwargs.update(callback_kwargs)
callback(request, **kwargs)
def create_loadbalancer(request):
data = request.DATA
spec = {
'vip_subnet_id': data['loadbalancer']['subnet']
}
if data['loadbalancer'].get('name'):
spec['name'] = data['loadbalancer']['name']
if data['loadbalancer'].get('description'):
spec['description'] = data['loadbalancer']['description']
if data['loadbalancer'].get('ip'):
spec['vip_address'] = data['loadbalancer']['ip']
loadbalancer = neutronclient(request).create_loadbalancer(
{'loadbalancer': spec}).get('loadbalancer')
if data.get('listener'):
# There is work underway to add a new API to LBaaS v2 that will
# allow us to pass in all information at once. Until that is
# available we use a separate thread to poll for the load
# balancer status and create the other resources when it becomes
# active.
args = (request, loadbalancer['id'], create_listener)
kwargs = {'from_state': 'PENDING_CREATE'}
thread.start_new_thread(poll_loadbalancer_status, args, kwargs)
return loadbalancer
def create_listener(request, **kwargs):
"""Create a new listener.
"""
data = request.DATA
listenerSpec = {
'protocol': data['listener']['protocol'],
'protocol_port': data['listener']['port'],
'loadbalancer_id': kwargs['loadbalancer_id']
}
if data['listener'].get('name'):
listenerSpec['name'] = data['listener']['name']
if data['listener'].get('description'):
listenerSpec['description'] = data['listener']['description']
if data.get('certificates'):
listenerSpec['default_tls_container_ref'] = data['certificates'][0]
listenerSpec['sni_container_refs'] = data['certificates']
listener = neutronclient(request).create_listener(
{'listener': listenerSpec}).get('listener')
if data.get('pool'):
args = (request, kwargs['loadbalancer_id'], create_pool)
kwargs = {'callback_kwargs': {'listener_id': listener['id']}}
thread.start_new_thread(poll_loadbalancer_status, args, kwargs)
return listener
def create_pool(request, **kwargs):
"""Create a new pool.
"""
data = request.DATA
poolSpec = {
'protocol': data['pool']['protocol'],
'lb_algorithm': data['pool']['method'],
'listener_id': kwargs['listener_id']
}
if data['pool'].get('name'):
poolSpec['name'] = data['pool']['name']
if data['pool'].get('description'):
poolSpec['description'] = data['pool']['description']
pool = neutronclient(request).create_lbaas_pool(
{'pool': poolSpec}).get('pool')
if data.get('members'):
args = (request, kwargs['loadbalancer_id'], add_member)
kwargs = {'callback_kwargs': {'pool_id': pool['id'],
'index': 0}}
thread.start_new_thread(poll_loadbalancer_status, args, kwargs)
elif data.get('monitor'):
args = (request, kwargs['loadbalancer_id'], create_health_monitor)
kwargs = {'callback_kwargs': {'pool_id': pool['id']}}
thread.start_new_thread(poll_loadbalancer_status, args, kwargs)
return pool
def create_health_monitor(request, **kwargs):
"""Create a new health monitor for a pool.
"""
data = request.DATA
monitorSpec = {
'type': data['monitor']['type'],
'delay': data['monitor']['interval'],
'timeout': data['monitor']['timeout'],
'max_retries': data['monitor']['retry'],
'pool_id': kwargs['pool_id']
}
if data['monitor'].get('method'):
monitorSpec['http_method'] = data['monitor']['method']
if data['monitor'].get('path'):
monitorSpec['url_path'] = data['monitor']['path']
if data['monitor'].get('status'):
monitorSpec['expected_codes'] = data['monitor']['status']
return neutronclient(request).create_lbaas_healthmonitor(
{'healthmonitor': monitorSpec}).get('healthmonitor')
def add_member(request, **kwargs):
"""Add a member to a pool.
"""
data = request.DATA
members = data.get('members')
pool_id = kwargs.get('pool_id')
if kwargs.get('members_to_add'):
members_to_add = kwargs['members_to_add']
index = [members.index(member) for member in members
if member['id'] == members_to_add[0]][0]
loadbalancer_id = data.get('loadbalancer_id')
else:
index = kwargs.get('index')
loadbalancer_id = kwargs.get('loadbalancer_id')
member = members[index]
memberSpec = {
'address': member['address'],
'protocol_port': member['port'],
'subnet_id': member['subnet']
}
if member.get('weight'):
memberSpec['weight'] = member['weight']
member = neutronclient(request).create_lbaas_member(
pool_id, {'member': memberSpec}).get('member')
index += 1
if kwargs.get('members_to_add'):
args = (request, loadbalancer_id, update_member_list)
members_to_add = kwargs['members_to_add']
members_to_add.pop(0)
kwargs = {'callback_kwargs': {
'existing_members': kwargs.get('existing_members'),
'members_to_add': members_to_add,
'members_to_delete': kwargs.get('members_to_delete'),
'pool_id': pool_id}}
thread.start_new_thread(poll_loadbalancer_status, args, kwargs)
elif len(members) > index:
args = (request, loadbalancer_id, add_member)
kwargs = {'callback_kwargs': {'pool_id': pool_id,
'index': index}}
thread.start_new_thread(poll_loadbalancer_status, args, kwargs)
elif data.get('monitor'):
args = (request, loadbalancer_id, create_health_monitor)
kwargs = {'callback_kwargs': {'pool_id': pool_id}}
thread.start_new_thread(poll_loadbalancer_status, args, kwargs)
return member
def remove_member(request, **kwargs):
"""Remove a member from the pool.
"""
data = request.DATA
loadbalancer_id = data.get('loadbalancer_id')
pool_id = kwargs.get('pool_id')
if kwargs.get('members_to_delete'):
members_to_delete = kwargs['members_to_delete']
member_id = members_to_delete.pop(0)
neutronclient(request).delete_lbaas_member(member_id, pool_id)
args = (request, loadbalancer_id, update_member_list)
kwargs = {'callback_kwargs': {
'existing_members': kwargs.get('existing_members'),
'members_to_add': kwargs.get('members_to_add'),
'members_to_delete': members_to_delete}}
thread.start_new_thread(poll_loadbalancer_status, args, kwargs)
def update_loadbalancer(request, **kwargs):
"""Update a load balancer.
"""
data = request.DATA
spec = {}
loadbalancer_id = kwargs.get('loadbalancer_id')
if data['loadbalancer'].get('name'):
spec['name'] = data['loadbalancer']['name']
if data['loadbalancer'].get('description'):
spec['description'] = data['loadbalancer']['description']
return neutronclient(request).update_loadbalancer(
loadbalancer_id, {'loadbalancer': spec}).get('loadbalancer')
def update_listener(request, **kwargs):
"""Update a listener.
"""
data = request.DATA
listener_spec = {}
listener_id = data['listener'].get('id')
loadbalancer_id = data.get('loadbalancer_id')
if data['listener'].get('name'):
listener_spec['name'] = data['listener']['name']
if data['listener'].get('description'):
listener_spec['description'] = data['listener']['description']
if data.get('certificates'):
listener_spec['default_tls_container_ref'] = data['certificates'][0]
listener_spec['sni_container_refs'] = data['certificates']
listener = neutronclient(request).update_listener(
listener_id, {'listener': listener_spec}).get('listener')
if data.get('pool'):
args = (request, loadbalancer_id, update_pool)
thread.start_new_thread(poll_loadbalancer_status, args)
return listener
def update_pool(request, **kwargs):
"""Update a pool.
"""
data = request.DATA
pool_spec = {}
pool_id = data['pool'].get('id')
loadbalancer_id = data.get('loadbalancer_id')
if data['pool'].get('name'):
pool_spec['name'] = data['pool']['name']
if data['pool'].get('description'):
pool_spec['description'] = data['pool']['description']
pools = neutronclient(request).update_lbaas_pool(
pool_id, {'pool': pool_spec}).get('pools')
# Assemble the lists of member id's to add and remove, if any exist
tenant_id = request.user.project_id
request_member_data = data.get('members', [])
existing_members = neutronclient(request).list_lbaas_members(
pool_id, tenant_id=tenant_id).get('members')
(members_to_add, members_to_delete) = get_members_to_add_remove(
request_member_data, existing_members)
if members_to_add or members_to_delete:
args = (request, loadbalancer_id, update_member_list)
kwargs = {'callback_kwargs': {'existing_members': existing_members,
'members_to_add': members_to_add,
'members_to_delete': members_to_delete,
'pool_id': pool_id}}
thread.start_new_thread(poll_loadbalancer_status, args, kwargs)
elif data.get('monitor'):
args = (request, loadbalancer_id, update_monitor)
thread.start_new_thread(poll_loadbalancer_status, args)
return pools
def update_monitor(request, **kwargs):
"""Update a health monitor.
"""
data = request.DATA
monitor_spec = {}
monitor_id = data['monitor']['id']
if data['monitor'].get('interval'):
monitor_spec['delay'] = data['monitor']['interval']
if data['monitor'].get('timeout'):
monitor_spec['timeout'] = data['monitor']['timeout']
if data['monitor'].get('retry'):
monitor_spec['max_retries'] = data['monitor']['retry']
if data['monitor'].get('method'):
monitor_spec['http_method'] = data['monitor']['method']
if data['monitor'].get('path'):
monitor_spec['url_path'] = data['monitor']['path']
if data['monitor'].get('status'):
monitor_spec['expected_codes'] = data['monitor']['status']
healthmonitor = neutronclient(request).update_lbaas_healthmonitor(
monitor_id, {'healthmonitor': monitor_spec}).get('healthmonitor')
return healthmonitor
def update_member_list(request, **kwargs):
"""Update the list of members by adding or removing the necessary members.
"""
data = request.DATA
loadbalancer_id = data.get('loadbalancer_id')
pool_id = kwargs.get('pool_id')
existing_members = kwargs.get('existing_members')
members_to_add = kwargs.get('members_to_add')
members_to_delete = kwargs.get('members_to_delete')
if members_to_delete:
kwargs = {'existing_members': existing_members,
'members_to_add': members_to_add,
'members_to_delete': members_to_delete,
'pool_id': pool_id}
remove_member(request, **kwargs)
elif members_to_add:
kwargs = {'existing_members': existing_members,
'members_to_add': members_to_add,
'members_to_delete': members_to_delete,
'pool_id': pool_id}
add_member(request, **kwargs)
elif data.get('monitor'):
args = (request, loadbalancer_id, update_monitor)
thread.start_new_thread(poll_loadbalancer_status, args)
def get_members_to_add_remove(request_member_data, existing_members):
new_member_ids = [member['id'] for member in request_member_data]
existing_member_ids = [member['id'] for member in existing_members]
members_to_add = [member_id for member_id in new_member_ids
if member_id not in existing_member_ids]
members_to_delete = [member_id for member_id in existing_member_ids
if member_id not in new_member_ids]
return members_to_add, members_to_delete
def add_floating_ip_info(request, loadbalancers):
"""Add floating IP address info to each load balancer.
"""
floating_ips = neutron.tenant_floating_ip_list(request)
for lb in loadbalancers:
floating_ip = {}
associated_ip = next((fip for fip in floating_ips
if fip['fixed_ip'] == lb['vip_address']), None)
if associated_ip is not None:
floating_ip['id'] = associated_ip['id']
floating_ip['ip'] = associated_ip['ip']
lb['floating_ip'] = floating_ip
@urls.register
class LoadBalancers(generic.View):
"""API for load balancers.
"""
url_regex = r'nlbaas/loadbalancers/$'
@rest_utils.ajax()
def get(self, request):
"""List load balancers for current project.
The listing result is an object with property "items".
"""
tenant_id = request.user.project_id
loadbalancers = neutronclient(request).list_loadbalancers(
tenant_id=tenant_id).get('loadbalancers')
if request.GET.get('full') and neutron.floating_ip_supported(request):
add_floating_ip_info(request, loadbalancers)
return {'items': loadbalancers}
@rest_utils.ajax()
def post(self, request):
"""Create a new load balancer.
Creates a new load balancer as well as other optional resources such as
a listener, pool, monitor, etc.
"""
return create_loadbalancer(request)
@urls.register
class LoadBalancerStatusTree(generic.View):
"""API for retrieving the resource status tree for a single load balancer.
"""
url_regex = r'nlbaas/loadbalancers/(?P<loadbalancer_id>[^/]+)/statuses/$'
@rest_utils.ajax()
def get(self, request, loadbalancer_id):
"""Get the status tree for a specific load balancer.
http://localhost/api/nlbaas/loadbalancers/cc758c90-3d98-4ea1-af44-aab405c9c915/statuses
"""
return neutronclient(request).retrieve_loadbalancer_status(
loadbalancer_id)
@urls.register
class LoadBalancer(generic.View):
"""API for retrieving, updating, and deleting a single load balancer.
"""
url_regex = r'nlbaas/loadbalancers/(?P<loadbalancer_id>[^/]+)/$'
@rest_utils.ajax()
def get(self, request, loadbalancer_id):
"""Get a specific load balancer.
http://localhost/api/nlbaas/loadbalancers/cc758c90-3d98-4ea1-af44-aab405c9c915
"""
loadbalancer = neutronclient(request).show_loadbalancer(
loadbalancer_id).get('loadbalancer')
if request.GET.get('full') and neutron.floating_ip_supported(request):
add_floating_ip_info(request, [loadbalancer])
return loadbalancer
@rest_utils.ajax()
def put(self, request, loadbalancer_id):
"""Edit a load balancer.
"""
kwargs = {'loadbalancer_id': loadbalancer_id}
update_loadbalancer(request, **kwargs)
@rest_utils.ajax()
def delete(self, request, loadbalancer_id):
"""Delete a specific load balancer.
http://localhost/api/nlbaas/loadbalancers/cc758c90-3d98-4ea1-af44-aab405c9c915
"""
neutronclient(request).delete_loadbalancer(loadbalancer_id)
@urls.register
class Listeners(generic.View):
"""API for load balancer listeners.
"""
url_regex = r'nlbaas/listeners/$'
@rest_utils.ajax()
def get(self, request):
"""List of listeners for the current project.
The listing result is an object with property "items".
"""
loadbalancer_id = request.GET.get('loadbalancerId')
tenant_id = request.user.project_id
result = neutronclient(request).list_listeners(tenant_id=tenant_id)
listener_list = result.get('listeners')
if loadbalancer_id:
listener_list = self._filter_listeners(listener_list,
loadbalancer_id)
return {'items': listener_list}
@rest_utils.ajax()
def post(self, request):
"""Create a new listener.
Creates a new listener as well as other optional resources such as
a pool, members, and health monitor.
"""
kwargs = {'loadbalancer_id': request.DATA.get('loadbalancer_id')}
return create_listener(request, **kwargs)
def _filter_listeners(self, listener_list, loadbalancer_id):
filtered_listeners = []
for listener in listener_list:
if listener['loadbalancers'][0]['id'] == loadbalancer_id:
filtered_listeners.append(listener)
return filtered_listeners
@urls.register
class Listener(generic.View):
"""API for retrieving, updating, and deleting a single listener.
"""
url_regex = r'nlbaas/listeners/(?P<listener_id>[^/]+)/$'
@rest_utils.ajax()
def get(self, request, listener_id):
"""Get a specific listener.
If the param 'includeChildResources' is passed in as a truthy value,
the details of all resources that exist under the listener will be
returned along with the listener details.
http://localhost/api/nlbaas/listeners/cc758c90-3d98-4ea1-af44-aab405c9c915
"""
listener = neutronclient(request).show_listener(
listener_id).get('listener')
if request.GET.get('includeChildResources'):
resources = {}
resources['listener'] = listener
if listener.get('default_pool_id'):
pool_id = listener['default_pool_id']
pool = neutronclient(request).show_lbaas_pool(
pool_id).get('pool')
resources['pool'] = pool
if pool.get('members'):
tenant_id = request.user.project_id
members = neutronclient(request).list_lbaas_members(
pool_id, tenant_id=tenant_id).get('members')
resources['members'] = members
if pool.get('healthmonitor_id'):
monitor_id = pool['healthmonitor_id']
monitor = neutronclient(request).show_lbaas_healthmonitor(
monitor_id).get('healthmonitor')
resources['monitor'] = monitor
return resources
else:
return listener
@rest_utils.ajax()
def put(self, request, listener_id):
"""Edit a listener as well as any resources below it.
"""
kwargs = {'listener_id': listener_id}
update_listener(request, **kwargs)
@rest_utils.ajax()
def delete(self, request, listener_id):
"""Delete a specific listener.
http://localhost/api/nlbaas/listeners/cc758c90-3d98-4ea1-af44-aab405c9c915
"""
neutronclient(request).delete_listener(listener_id)
@urls.register
class Pools(generic.View):
"""API for load balancer pools.
"""
url_regex = r'nlbaas/pools/$'
@rest_utils.ajax()
def post(self, request):
"""Create a new pool.
Creates a new pool as well as other optional resources such as
members and health monitor.
"""
kwargs = {'loadbalancer_id': request.DATA.get('loadbalancer_id'),
'listener_id': request.DATA.get('parentResourceId')}
return create_pool(request, **kwargs)
@urls.register
class Pool(generic.View):
"""API for retrieving a single pool.
"""
url_regex = r'nlbaas/pools/(?P<pool_id>[^/]+)/$'
@rest_utils.ajax()
def get(self, request, pool_id):
"""Get a specific pool.
If the param 'includeChildResources' is passed in as a truthy value,
the details of all resources that exist under the pool will be
returned along with the pool details.
http://localhost/api/nlbaas/pools/cc758c90-3d98-4ea1-af44-aab405c9c915
"""
pool = neutronclient(request).show_lbaas_pool(pool_id).get('pool')
if request.GET.get('includeChildResources'):
resources = {}
resources['pool'] = pool
if pool.get('members'):
tenant_id = request.user.project_id
members = neutronclient(request).list_lbaas_members(
pool_id, tenant_id=tenant_id).get('members')
resources['members'] = members
if pool.get('healthmonitor_id'):
monitor_id = pool['healthmonitor_id']
monitor = neutronclient(request).show_lbaas_healthmonitor(
monitor_id).get('healthmonitor')
resources['monitor'] = monitor
return resources
else:
return pool
@rest_utils.ajax()
def put(self, request, pool_id):
"""Edit a listener as well as any resources below it.
"""
kwargs = {'pool_id': pool_id}
update_pool(request, **kwargs)
@rest_utils.ajax()
def delete(self, request, pool_id):
"""Delete a specific pool.
http://localhost/api/nlbaas/pools/cc758c90-3d98-4ea1-af44-aab405c9c915
"""
neutronclient(request).delete_lbaas_pool(pool_id)
@urls.register
class Members(generic.View):
"""API for load balancer members.
"""
url_regex = r'nlbaas/pools/(?P<pool_id>[^/]+)/members/$'
@rest_utils.ajax()
def get(self, request, pool_id):
"""List of members for the current project.
The listing result is an object with property "items".
"""
tenant_id = request.user.project_id
result = neutronclient(request).list_lbaas_members(pool_id,
tenant_id=tenant_id)
return {'items': result.get('members')}
@rest_utils.ajax()
def put(self, request, pool_id):
"""Update the list of members for the current project.
"""
# Assemble the lists of member id's to add and remove, if any exist
tenant_id = request.user.project_id
request_member_data = request.DATA.get('members', [])
existing_members = neutronclient(request).list_lbaas_members(
pool_id, tenant_id=tenant_id).get('members')
(members_to_add, members_to_delete) = get_members_to_add_remove(
request_member_data, existing_members)
if members_to_add or members_to_delete:
kwargs = {'existing_members': existing_members,
'members_to_add': members_to_add,
'members_to_delete': members_to_delete,
'pool_id': pool_id}
update_member_list(request, **kwargs)
@urls.register
class Member(generic.View):
"""API for retrieving a single member.
"""
url_regex = r'nlbaas/pools/(?P<pool_id>[^/]+)' + \
'/members/(?P<member_id>[^/]+)/$'
@rest_utils.ajax()
def get(self, request, member_id, pool_id):
"""Get a specific member belonging to a specific pool.
"""
return neutronclient(request).show_lbaas_member(
member_id, pool_id).get('member')
@rest_utils.ajax()
def put(self, request, member_id, pool_id):
"""Edit a pool member.
"""
data = request.DATA
spec = {
'weight': data['weight']
}
return neutronclient(request).update_lbaas_member(
member_id, pool_id, {'member': spec})
@urls.register
class HealthMonitors(generic.View):
"""API for load balancer pool health monitors.
"""
url_regex = r'nlbaas/healthmonitors/$'
@rest_utils.ajax()
def post(self, request):
"""Create a new health monitor.
"""
kwargs = {'loadbalancer_id': request.DATA.get('loadbalancer_id'),
'pool_id': request.DATA.get('parentResourceId')}
return create_health_monitor(request, **kwargs)
@urls.register
class HealthMonitor(generic.View):
"""API for retrieving a single health monitor.
"""
url_regex = r'nlbaas/healthmonitors/(?P<healthmonitor_id>[^/]+)/$'
@rest_utils.ajax()
def get(self, request, healthmonitor_id):
"""Get a specific health monitor.
"""
return neutronclient(request).show_lbaas_healthmonitor(
healthmonitor_id).get('healthmonitor')
@rest_utils.ajax()
def delete(self, request, healthmonitor_id):
"""Delete a specific health monitor.
http://localhost/api/nlbaas/healthmonitors/cc758c90-3d98-4ea1-af44-aab405c9c915
"""
neutronclient(request).delete_lbaas_healthmonitor(healthmonitor_id)
@rest_utils.ajax()
def put(self, request, healthmonitor_id):
"""Edit a health monitor.
"""
update_monitor(request)

View File

@ -1,16 +0,0 @@
# Copyright 2016 IBM Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Register the REST API URLs so they can be called from the JavaScript files
from neutron_lbaas_dashboard.api import rest # noqa

View File

@ -1,49 +0,0 @@
# (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from oslo_log import log as logging
from django.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.api import neutron
LOG = logging.getLogger(__name__)
class NGLoadBalancers(horizon.Panel):
name = _("Neutron Load Balancers")
slug = 'ngloadbalancersv2'
permissions = ('openstack.services.network',)
def __init__(self):
LOG.warning('neutron-lbaas-dashboard is now deprecated. See: '
'https://wiki.openstack.org/wiki/Neutron/LBaaS/'
'Deprecation')
def allowed(self, context):
request = context['request']
try:
if not neutron.is_service_enabled(request,
config_name='enable_lb',
ext_name='lbaasv2'):
return False
except Exception:
LOG.error("Call to list enabled services failed. This is likely "
"due to a problem communicating with the Neutron "
"endpoint. Load Balancers v2 panel will not be "
"displayed")
return False
return super(NGLoadBalancers, self).allowed(context)

View File

@ -1,12 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Load Balancers" %}{% endblock %}
{% block page_header %}{% endblock %}
{% block ng_route_base %}
<base href="{{ WEBROOT }}">
{% endblock %}
{% block main %}
<div ng-view></div>
{% endblock %}

View File

@ -1,22 +0,0 @@
# (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.conf.urls import url
from neutron_lbaas_dashboard.dashboards.project.ngloadbalancersv2 import views
urlpatterns = [
url('', views.IndexView.as_view(), name='index'),
]

View File

@ -1,20 +0,0 @@
# (c) Copyright 2015 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from horizon.views import HorizonTemplateView
class IndexView(HorizonTemplateView):
template_name = 'project/ngloadbalancersv2/index.html'
page_title = 'Neutron Load Balancers'

View File

@ -1,33 +0,0 @@
# Copyright 2015 IBM Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# The slug of the panel to be added to HORIZON_CONFIG. Required.
PANEL = 'ngloadbalancersv2'
# The slug of the dashboard the PANEL is associated with. Required.
PANEL_DASHBOARD = 'project'
# The slug of the panel group the PANEL is associated with.
PANEL_GROUP = 'network'
# Python panel class of the PANEL to be added.
ADD_PANEL = (
'neutron_lbaas_dashboard.dashboards.project.ngloadbalancersv2.panel'
'.NGLoadBalancers')
ADD_INSTALLED_APPS = ['neutron_lbaas_dashboard']
ADD_ANGULAR_MODULES = ['horizon.dashboard.project.nlbaasv2']
ADD_SCSS_FILES = ['dashboard/project/nlbaasv2/nlbaasv2.scss']
AUTO_DISCOVER_STATIC_FILES = True

View File

@ -1,163 +0,0 @@
/*
* Copyright 2015 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict';
var fs = require('fs');
var path = require('path');
module.exports = function (config) {
// This tox venv is setup in the post-install npm step
var toxPath = '../.tox/py27/lib/python2.7/site-packages/';
config.set({
preprocessors: {
// Used to collect templates for preprocessing.
// NOTE: the templates must also be listed in the files section below.
'./static/**/*.html': ['ng-html2js'],
// Used to indicate files requiring coverage reports.
'./static/**/!(*.spec).js': ['coverage'],
},
// Sets up module to process templates.
ngHtml2JsPreprocessor: {
prependPrefix: '/',
moduleName: 'templates'
},
basePath: './',
// Contains both source and test files.
files: [
/*
* shim, partly stolen from /i18n/js/horizon/
* Contains expected items not provided elsewhere (dynamically by
* Django or via jasmine template.
*/
'../test-shim.js',
// from jasmine.html
toxPath + 'xstatic/pkg/jquery/data/jquery.js',
toxPath + 'xstatic/pkg/angular/data/angular.js',
toxPath + 'xstatic/pkg/angular/data/angular-route.js',
toxPath + 'xstatic/pkg/angular/data/angular-mocks.js',
toxPath + 'xstatic/pkg/angular/data/angular-cookies.js',
toxPath + 'xstatic/pkg/angular_bootstrap/data/angular-bootstrap.js',
toxPath + 'xstatic/pkg/angular_gettext/data/angular-gettext.js',
toxPath + 'xstatic/pkg/angular_fileupload/data/ng-file-upload-all.js',
toxPath + 'xstatic/pkg/angular/data/angular-sanitize.js',
toxPath + 'xstatic/pkg/d3/data/d3.js',
toxPath + 'xstatic/pkg/rickshaw/data/rickshaw.js',
toxPath + 'xstatic/pkg/angular_smart_table/data/smart-table.js',
toxPath + 'xstatic/pkg/angular_lrdragndrop/data/lrdragndrop.js',
toxPath + 'xstatic/pkg/angular_schema_form/data/schema-form.js',
toxPath + 'xstatic/pkg/spin/data/spin.js',
toxPath + 'xstatic/pkg/spin/data/spin.jquery.js',
// TODO: These should be mocked.
toxPath + '/horizon/static/horizon/js/horizon.js',
/**
* Include framework source code from horizon that we need.
* Otherwise, karma will not be able to find them when testing.
* These files should be mocked in the foreseeable future.
*/
toxPath + 'horizon/static/framework/**/*.module.js',
toxPath + 'horizon/static/framework/**/!(*.spec|*.mock).js',
toxPath + 'openstack_dashboard/static/**/*.module.js',
toxPath + 'openstack_dashboard/static/**/!(*.spec|*.mock).js',
toxPath + 'openstack_dashboard/dashboards/**/static/**/*.module.js',
toxPath + 'openstack_dashboard/dashboards/**/static/**/!(*.spec|*.mock).js',
/**
* First, list all the files that defines application's angular modules.
* Those files have extension of `.module.js`. The order among them is
* not significant.
*/
'./static/**/*.module.js',
/**
* Followed by other JavaScript files that defines angular providers
* on the modules defined in files listed above. And they are not mock
* files or spec files defined below. The order among them is not
* significant.
*/
'./static/**/!(*.spec|*.mock).js',
/**
* Then, list files for mocks with `mock.js` extension. The order
* among them should not be significant.
*/
toxPath + 'openstack_dashboard/static/**/*.mock.js',
//'./static/**/*.mock.js',
/**
* Finally, list files for spec with `spec.js` extension. The order
* among them should not be significant.
*/
'./static/**/*.spec.js',
/**
* Angular external templates
*/
'./static/**/*.html'
],
autoWatch: true,
frameworks: ['jasmine'],
browsers: ['PhantomJS'],
phantomjsLauncher: {
// Have phantomjs exit if a ResourceError is encountered
// (useful if karma exits without killing phantom)
exitOnResourceError: true
},
reporters: ['progress', 'coverage', 'threshold'],
plugins: [
'karma-phantomjs-launcher',
'karma-jasmine',
'karma-ng-html2js-preprocessor',
'karma-coverage',
'karma-threshold-reporter'
],
coverageReporter: {
type: 'html',
dir: '../cover/',
subdir: '.',
check: {
global: {
statements: 100,
branches: 100,
functions: 100,
lines: 100
}
}
},
// Coverage threshold values.
thresholdReporter: {
statements: 100,
branches: 100,
functions: 100,
lines: 100
}
});
};

View File

@ -1,18 +0,0 @@
# Robert Simai <robert.simai@suse.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-04-23 09:10+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-05-03 02:07+0000\n"
"Last-Translator: Robert Simai <robert.simai@suse.com>\n"
"Language-Team: German\n"
"Language: de\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
msgid "Neutron Load Balancers"
msgstr "Neutron Loadbalancer"

View File

@ -1,930 +0,0 @@
# Frank Kloeker <eumel@arcor.de>, 2017. #zanata
# Frank Kloeker <eumel@arcor.de>, 2018. #zanata
# Robert Simai <robert.simai@suse.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-09-15 02:15+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-09-17 01:17+0000\n"
"Last-Translator: Robert Simai <robert.simai@suse.com>\n"
"Language-Team: German\n"
"Language: de\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#, python-format
msgid "%(ip)s..."
msgstr "%(ip)s..."
msgid "A new health monitor is being created."
msgstr "Ein neuer Gesundheitsmonitor wurde erstellt."
msgid "A new listener is being created."
msgstr "Ein neuer Listener wird erstellt."
msgid "A new load balancer is being created."
msgstr "Ein neuer Loadbalancer wird erstellt."
msgid "A new pool is being created."
msgstr "Ein neuer Pool wird erstellt."
msgid ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgstr ""
"Ein Pool repräsentiert eine Gruppe von Mitgliedern, auf die die "
"Lastverteilung angewendet wird."
msgid "Actions"
msgstr "Aktionen"
msgid "Active"
msgstr "Aktiv"
msgid "Add"
msgstr "Hinzufügen"
msgid "Add external member"
msgstr "Externes Mitglied hinzufügen"
msgid "Add members to the load balancer pool."
msgstr "Mitglieder zum Loadbalancer-Pool hinzufügen."
msgid "Add/Remove Pool Members"
msgstr "Pool-Mitglieder hinzufügen/entfernen"
msgid "Address"
msgstr "Adresse"
msgid "Admin State Up"
msgstr "Adminstatus aktiv"
msgid "Allocated Members"
msgstr "Zugewiesene Mitglieder"
msgid "An error occurred. Please try again later."
msgstr "Ein Fehler ist aufgetreten. Bitte versuchen Sie es später noch einmal."
msgid "Associate"
msgstr "Zuweisen"
msgid "Associate Floating IP"
msgstr "Floating IP zuweisen"
msgid "Associate Floating IP Address"
msgstr "Floating-IP-Adresse zuweisen"
msgid "Associating floating IP with load balancer."
msgstr "Floating-IP mit Loadbalancer verbinden."
msgid "Available Instances"
msgstr "Verfügbare Instanzen"
msgid "Back"
msgstr "Zurück"
msgid "Cancel"
msgstr "Abbrechen"
msgid "Certificate Name"
msgstr "Zertifikatname"
msgid "Confirm Delete Health Monitor"
msgstr "Gesundheitsmonitor löschen bestätigen"
msgid "Confirm Delete Listeners"
msgstr "Listener löschen bestätigen"
msgid "Confirm Delete Load Balancers"
msgstr "Loadbalancer löschen bestätigen"
msgid "Confirm Delete Pool"
msgstr "Pool löschen bestätigen"
msgid "Confirm Disassociate Floating IP Address"
msgstr "Ablösung der Floating-IP-Adresse bestätigen"
msgid "Connection Limit"
msgstr "Verbindungsgrenze"
msgid "Create Health Monitor"
msgstr "Gesundheitsmonitor erzeugen"
msgid "Create Listener"
msgstr "Listener erstellen"
msgid "Create Load Balancer"
msgstr "Loadbalancer erstellen"
msgid "Create Pool"
msgstr "Pool erstellen"
msgid "Default Pool ID"
msgstr "Standard Pool-ID"
msgid "Degraded"
msgstr "Degradiert"
msgid "Delay"
msgstr "Verzögerung"
msgid "Delete Health Monitor"
msgstr "Gesundheitsmonitor löschen"
msgid "Delete Listener"
msgstr "Listener löschen"
msgid "Delete Listeners"
msgstr "Listener löschen"
msgid "Delete Load Balancer"
msgstr "Loadbalancer löschen"
msgid "Delete Load Balancers"
msgstr "Gelöschte Loadbalancer"
msgid "Delete Pool"
msgstr "Pool löschen"
#, python-format
msgid "Deleted health monitor: %s."
msgstr "Gelöschter Gesundheitsmonitor: %s."
#, python-format
msgid "Deleted listeners: %s."
msgstr "Gelöschte Listener: %s."
#, python-format
msgid "Deleted load balancers: %s."
msgstr "Gelöschte Loadbalancer: %s."
#, python-format
msgid "Deleted pool: %s."
msgstr "Gelöschter Pool: %s."
msgid "Description"
msgstr "Beschreibung"
msgid "Disassociate"
msgstr "Trennen"
msgid "Disassociate Floating IP"
msgstr "Floating IP trennen"
#, python-format
msgid "Disassociated floating IP address from load balancer: %s."
msgstr "Verbindung der Floating-IP zum Loadbalancer lösen: %s."
msgid ""
"Each port that listens for traffic on a particular load balancer is "
"configured separately and\n"
" tied to the load balancer. Multiple listeners can be associated with the "
"same load balancer but\n"
" each must use a unique port."
msgstr ""
"Jeder Port, der an einem bestimmten Loadbalancer auf Datenverkehr wartet, "
"wird separat konfiguriert und\n"
" an den Loadbalancer gebunden. Multiple Listener können dem selben "
"Loadbalancer zugewiesen werden aber\n"
" jeder muss seinen einmaligen Port haben."
msgid "Edit"
msgstr "Bearbeiten"
msgid "Edit Pool"
msgstr "Pool bearbeiten"
msgid "Error"
msgstr "Fehler"
msgid "Expected Codes"
msgstr "Erwartete Codes"
msgid "Expected status codes"
msgstr "Erwartete Statuscodes"
msgid "Expected status codes:"
msgstr "Erwarteter Status-Code:"
msgid "Expiration Date"
msgstr "Ablaufdatum"
msgid "Floating IP Address"
msgstr "Floating IP-Adresse"
msgid "Floating IP address or pool"
msgstr "Floating-IP-Addresse oder Pool"
msgid "Floating IP addresses"
msgstr "Floating-IP-Adressen"
msgid "Floating IP pools"
msgstr "Floating-IP-Pools"
msgid "HTTP Method"
msgstr "HTTP-Methode"
msgid "HTTP method"
msgstr "HTTP-Methode"
msgid "HTTP method:"
msgstr "HTTP Methode:"
msgid "Health Monitor ID"
msgstr "Gesundheitsmonitor-ID"
msgid "ID"
msgstr "ID"
msgid "IP Address"
msgstr "IP-Adresse"
#, python-format
msgid "IP Addresses (%(count)s)"
msgstr "IP-Adressen (%(count)s)"
msgid "IP address"
msgstr "IP-Adresse"
msgid "IP address:"
msgstr "IP-Adresse:"
msgid ""
"If an IP address is provided it must be a well-formed IPv4 or IPv6 address. "
"The system will\n"
" attempt to assign the provided IP address to the load balancer. If an IP "
"address is not provided\n"
" then one will be allocated for you."
msgstr ""
"Wenn eine IP-Adresse zur Verfügung gestellt wird, muss diese im IPv4 oder "
"IPv6 Format sein. Das System wird\n"
" versuchen, die zur Verfügung gestellte IP-Adresse zum Loadbalancer "
"hinzuzufügen. Wenn keine IP-Adresse zur Verfügung gestellt wird, \n"
" wird eine für Sie allokiert."
msgid ""
"If the listener uses the TERMINATED_HTTPS protocol, then one or more SSL "
"certificates must\n"
" be selected. The first certificate will be the default."
msgstr ""
"Wenn der Listener das TERMINATED_HTTPS Protokoll verwendet, müssen ein oder "
"mehrere Zertifikate ausgewählt sein.\n"
" Das erste Zertifikat wird der Standard."
msgid "Inactive"
msgstr "Inaktiv"
msgid "Interval (sec)"
msgstr "Intervall (sek)"
msgid "Interval:"
msgstr "Intervall:"
msgid "Key Manager API Guide: Creating a Certificate Container"
msgstr "Key-Manager-API-Guide: Erstellen eines Zertifikat-Containers"
msgid "Key Manager Service Command-Line Client"
msgstr "Key-Manager-Service Kommandozeilen-Tool"
msgid ""
"LEAST_CONNECTIONS: Allocates requests to the instance with the least number "
"of active\n"
" connections."
msgstr ""
"LEAST_CONNECTIONS: Allokiert Anfragen zur Instanz mit den wenigsten aktiven\n"
" Verbindungen."
msgid "Least Connections"
msgstr "Letzte Verbindungen"
#, python-format
msgid "Listener %(index)s"
msgstr "Listener %(index)s"
msgid "Listener 1"
msgstr "Listener 1"
msgid "Listener Details"
msgstr "Listener Details"
msgid "Listener ID"
msgstr "Listener-ID"
msgid "Listeners"
msgstr "Listener"
#, python-format
msgid "Load Balancer %(index)s"
msgstr "Loadbalancer %(index)s"
msgid "Load Balancer Algorithm"
msgstr "Loadbalancer-Algorithmus"
msgid "Load Balancer Details"
msgstr "Loadbalancer-Details"
msgid "Load Balancer ID"
msgstr "Loadbalancer-ID"
msgid "Load Balancers"
msgstr "Loadbalancer"
msgid "Loading"
msgstr "Ladevorgang"
msgid "Max Retries"
msgstr "Max Wiederholungen"
msgid "Member ID"
msgstr "Mitglied-ID"
msgid "Members"
msgstr "Mitglieder"
msgid ""
"Members are the actual IP addresses that will receive traffic from the load "
"balancer. Each\n"
" member must have a unique combination of IP address and port."
msgstr ""
"Mitglieder sind die aktuellen IP-Adressen, die Datenverkehr vom Loadbalancer "
"empfangen. Jedes Mitglied\n"
" muss eine einmalige Kombination aus IP-Adresse und Port haben."
msgid "Method"
msgstr "Methode"
msgid "Method:"
msgstr "Methode:"
msgid "Monitor Details"
msgstr "Monitordetails"
msgid "Monitor ID"
msgstr "Monitor-ID"
msgid "Monitor type"
msgstr "Monitor-Typ"
msgid "Name"
msgstr "Name"
msgid "No available certificates"
msgstr "Keine Zertifikate verfügbar"
msgid "No available instances"
msgstr "Keine Instanzen verfügbar"
msgid "No items to display."
msgstr "Keine Einträge zum Anzeigen."
msgid "No members have been allocated"
msgstr "Es wurden keine Mitglieder zugewiesen"
msgid "None"
msgstr "Keine"
msgid "Offline"
msgstr "Offline"
msgid "Online"
msgstr "Online"
msgid "Operating Status"
msgstr "Betriebsstatus"
msgid "Overview"
msgstr "Übersicht"
msgid "Pending Create"
msgstr "Geplante Erstellung"
msgid "Pending Delete"
msgstr "Geplante Löschung"
msgid "Pending Update"
msgstr "Geplante Aktualisierung"
msgid "Pool 1"
msgstr "Pool 1"
msgid "Pool Details"
msgstr "Pool-Details"
msgid "Pool ID"
msgstr "Pool-ID"
msgid "Pool Members"
msgstr "Pool-Mitglieder"
msgid "Pool member weight has been updated."
msgstr "Pool-Mitglied Gewicht wurde aktualisiert."
msgid "Port"
msgstr "Port"
msgid "Port ID"
msgstr "Port-ID"
msgid "Port:"
msgstr "Port:"
msgid "Protocol"
msgstr "Protokoll"
msgid "Protocol Port"
msgstr "Protokollport"
msgid "Protocol:"
msgstr "Protokoll:"
msgid "Provide the details for the health monitor."
msgstr "Geben Sie die Details zum Gesundheitsmonitor an."
msgid "Provide the details for the listener."
msgstr "Geben Sie die Details für den Listener an."
msgid "Provide the details for the load balancer."
msgstr "Geben Sie die Details zum Loadbalancer an."
msgid "Provide the details for the pool."
msgstr "Geben Sie die Details zum Pool an."
msgid "Provider"
msgstr "Anbieter"
msgid "Provisioning Status"
msgstr "Provisionierungsstatus"
msgid "ROUND_ROBIN: Rotates requests evenly between multiple instances."
msgstr ""
"ROUND_ROBIN: Rotiert Anfragen zufällig zwischen verschiedenen Instanzen."
msgid "Remove"
msgstr "Entfernen"
msgid "Retries"
msgstr "Wiederholungen"
msgid "Retries:"
msgstr "Wiederholungen:"
msgid "Round Robin"
msgstr "Rundlauf-Verfahren"
msgid ""
"SOURCE_IP: Requests from a unique source IP address are consistently "
"directed to the same instance."
msgstr ""
"SOURCE_IP: Anforderungen von einer eindeutigen Quell-IP-Adresse werden "
"konsistent an die gleiche Instanz gerichtet."
msgid "SSL Certificates"
msgstr "SSL-Zertifikate"
msgid ""
"Select a floating IP address to associate with the load balancer or a "
"floating IP pool in which to allocate a new floating IP address."
msgstr ""
"Wählen Sie eine Floating-IP-Adresse, um sie dem Loadbalancer zuzuweisen, "
"oder einen Floating-IP-Pool, in welchem eine Floating-IP-Adresse belegt "
"werden kann."
msgid "Select certificates from the available certificates below"
msgstr ""
"Wählen Sie Zertifikate aus den unten stehenden verfügbaren Zertifikaten aus"
msgid "Select one or more SSL certificates for the listener."
msgstr "Wählen Sie ein oder mehrere Zertifikate für den Listener."
msgid "Session Persistence"
msgstr "Sitzungspersistenz"
msgid "Source IP"
msgstr "Quell-IP"
msgid "Subnet"
msgstr "Teilnetz"
msgid "Subnet ID"
msgstr "Subnetz-ID"
msgid "Subnet:"
msgstr "Teilnetz:"
msgid "Tenant ID"
msgstr "Mandanten-ID"
msgid ""
"The Available Instances table contains existing compute instances that can "
"be added as members\n"
" of the pool. Use the \"Add external member\" button to add a member not "
"found in the Available\n"
" Instances table."
msgstr ""
"Die Tabelle Verfügbare Instanzen enthält existierende Compute Instanzen, die "
"als Mitglieder des Pools hinzugefügt werden \n"
"können. Verwenden Sie \"Externes Mitglied hinzufügen\", um ein Mitglied "
"hinzuzufügen, dass sich nicht in der Tabelle \n"
"befindet."
msgid "The HTTP method used to perform the health check."
msgstr ""
"Die HTTP-Methode die zur Durchführung des Gesundheitchecks angewendet wird."
msgid "The IP address is not valid."
msgstr "Die IP-Adresse ist ungültig."
msgid ""
"The IP address of the member to receive traffic from the load balancer. Must "
"be a well-formed\n"
" IPv4 or IPv6 address."
msgstr ""
"Die IP-Addresse des Mitglieds, der den Verkehr vom Loadbalancer erhält. Muss "
"im bekannten Format sein als\n"
" IPv4 oder IPv6 Addresse."
msgid "The URL path is not valid."
msgstr "Der URL-Pfad ist ungültig."
msgid ""
"The expected HTTP status codes to get from a successful health check. Must "
"be a single number,\n"
" a comma separated list of numbers, or a range (two numbers separated by a "
"hyphen)."
msgstr ""
"Der erwartete HTTP Status-Code welcher vom erfolgreichen Gesundheitscheck "
"zurückgeliefert wird. Muss eine einfache Zahl sein,\n"
" eine kommaseparierte Liste von Zahlen oder ein Bereich (2 Zahlen separiert "
"von einem Bindestrich)."
msgid "The expected status code is not valid."
msgstr "Der erwartete Statuscode ist ungültig."
#, python-format
msgid "The following health monitor could not be deleted: %s."
msgstr "Die folgenden Gesundheitsmonitore konnten nicht gelöscht werden: %s"
#, python-format
msgid ""
"The following listeners could not be deleted, possibly due to existing "
"pools: %s."
msgstr ""
"Die folgenden Listener können nicht gelöscht werden, möglicherweise auf "
"Grund der vorhandenen Pools: %s."
#, python-format
msgid "The following listeners will not be deleted due to existing pools: %s."
msgstr ""
"Die folgenden Listener werden auf Grund der vorhandenen Pools nicht "
"gelöscht: %s."
#, python-format
msgid "The following load balancers are pending and cannot be deleted: %s."
msgstr ""
"Die folgenden Loadbalancer sind anhängig und können nicht gelöscht werden: "
"%s."
#, python-format
msgid ""
"The following load balancers could not be deleted, possibly due to existing "
"listeners: %s."
msgstr ""
"Die folgenden Loadbalancer können nicht gelöscht werden, möglicherweise auf "
"Grund der vorhandenen Listener: %s."
#, python-format
msgid "The following pool could not be deleted: %s."
msgstr "Der folgende Pool konnte nicht gelöscht werden: %s"
msgid "The health check interval must be greater than or equal to the timeout."
msgstr ""
"Das Gesundheitscheck-Intervall muss größer oder gleich dem Zeitlimit sein."
msgid "The health monitor has been updated."
msgstr "Der Gesundheitsmonitor wurde aktualisiert."
msgid ""
"The health monitor is used to determine the health of your pool members. "
"Health checks\n"
" routinely run against each member within the pool and the result of the "
"health check is used\n"
" to determine if the member receives new connections. Each pool can only "
"have one health\n"
" monitor."
msgstr ""
"Der Gesundheitsmonitor wird verwendet, um den Zustand Ihrer Pool-Mitglieder "
"zu bestimmen. Gesundheitschecks\n"
" laufen routinemäßig für alle Mitglieder im Pool und das Ergebnis\n"
" wird verwendet um zu bestimmen, \n"
"ob das Mitglied neue Verbindungen empfängt. Jeder Pool kann seinen eigenen "
"Gesundheitsmonitor haben."
msgid ""
"The interval between health checks. Must be greater than or equal to the "
"timeout."
msgstr ""
"Das Intervall zwischen den Integritätsprüfungen Muss größer oder gleich dem "
"Timeout sein."
msgid "The listener has been updated."
msgstr "Der Listener wurde aktualisiert."
msgid ""
"The load balancer algorithm that distributes traffic to the pool members."
msgstr ""
"Der L oadbalancer-Algorithmus zum Verteilen der Anfragen auf die Pool-"
"Mitglieder."
msgid "The load balancer has been updated."
msgstr "Der Loadbalancer wurde aktualisiert."
msgid ""
"The load balancer occupies a neutron network port and has an IP address "
"assigned from a subnet."
msgstr ""
"Der Loadbalancer belegt einen Neutron-Port und bekommt eine IP-Adresse aus "
"einem Subnetz zugewiesen."
msgid "The max retry count must be a number between 1 and 10."
msgstr "Die maximale Wiederholungszahl muss eine Zahl zwischen 1 und 10 sein."
msgid "The network on which to allocate the load balancer's IP address."
msgstr "Das Netzwerk von dem die IP-Adresse des Loadbalancers allokiert wird."
msgid "The network which contains the IP address of the member."
msgstr "Das Netzwerk, das die IP-Adresse des Mitglieds enthält."
msgid ""
"The number of allowed connection failures before marking the member as "
"inactive. Must be a\n"
" number from 1 to 10."
msgstr ""
"Die Anzahl der erlaubten Verbindungsfehlern bevor das Mitglied als inaktiv "
"markiert wird. Muss eine\n"
" Nummer von 1 bis 10 sein."
msgid "The pool has been updated."
msgstr "Der Pool wurde aktualisiert."
msgid "The pool members have been updated."
msgstr "Die Pool-Mitglieder wurden aktualisiert."
msgid "The port must be a number between 1 and 65535."
msgstr "Der Port muss eine Zahl zwischen 1 und 65535 sein."
msgid ""
"The port must be unique among all listeners attached to this load balancer."
msgstr ""
"Der Port muss über alle Listener, die diesem Loadbalancer zugewiesen sind, "
"einmalig sein. "
msgid ""
"The port on which the front end listens. Must be an integer from 1 to 65535."
msgstr ""
"Der Port auf dem das Frontdend hört. Muss eine Zahl zwischen 1 und 65535 "
"sein."
msgid ""
"The port on which the member listens for traffic. Must be a number from 1 to "
"65535."
msgstr ""
"Der Port, an dem das Mitglied den Datenverkehr überwacht. Muss eine Zahl "
"zwischen 1 und 65535 sein."
msgid ""
"The protocol for which the front end listens. The TERMINATED_HTTPS protocol "
"is only available if\n"
" the key-manager service is enabled and you have authority to list "
"certificate containers and\n"
" secrets."
msgstr ""
"Das Protokoll auf das das Frontend hört. Das TERMINATED_HTTPS Protokoll ist "
"nur verfügbar, wenn\n"
" der Key-Manager-Dienst aktiviert ist und Sie die Berechtigung haben, "
"Certifikat-Container und deren Geheimnisse aufzulisten."
msgid ""
"The target of the health check HTTP request to the member. Must be a valid "
"URL path."
msgstr ""
"Das Ziel des HTTP-Requests des Gesundheitschecks. Muss ein gültiger URL-Pfad "
"sein."
msgid ""
"The time after which a health check times out. Must be a number greater than "
"or equal to 0\n"
" and less than or equal to the interval."
msgstr ""
"Die Zeit nachdem ein Gesundheitscheck eine Auszeit nimmt. Muss eine Nummer "
"groesser oder gleich 0 sein\n"
" und kleiner oder gleich zum Intervall."
msgid "The timeout must be a number greater than or equal to 0."
msgstr "Das Zeitlimit muss eine Zahl größer oder gleich 0 sein."
msgid "The weight must be a number between 1 and 256."
msgstr "Das Gewicht muss eine Zahl zwischen 1 und 256 sein."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared\n"
" to the other members of the pool. A higher weight means it will receive "
"more traffic. Must be\n"
" a number from 1 to 256."
msgstr ""
"Die Gewichtung eines Mitglieds bestimmt den Teil der Anforderungen oder "
"Verbindungen, die es vergleicht\n"
" zu den anderen Mitgliedern des Pools. Ein höhere Gewichtung bedeutet mehr "
"Verkehr. Muss sein\n"
" eine Zahl von 1 bis 256."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared to the other members of the pool."
msgstr ""
"Das Gewicht eines Mitglieds bestimmt die Menge an Anfragen oder "
"Verbindungen, die es bedient, verglichen mit den anderen Mitgliedern des "
"Pools."
msgid "Timeout"
msgstr "Zeitlimit"
msgid "Timeout (sec)"
msgstr "Timeout (sek)"
msgid "Timeout:"
msgstr "Timeout:"
msgid "Type"
msgstr "Typ"
msgid "URL Path"
msgstr "URL Pfad"
msgid "URL path"
msgstr "URL-Pfad"
msgid "URL path:"
msgstr "URL-Pfad:"
msgid "Unable to create health monitor."
msgstr "Gesundheitsmonitor kann nicht erzeugt werden."
msgid "Unable to create listener."
msgstr "Listener kann nicht erstellt werden"
msgid "Unable to create load balancer."
msgstr "Loadbalancer kann nicht erstellt werden."
msgid "Unable to create pool."
msgstr "Pool kann nicht erzeugt werden."
msgid "Unable to delete health monitor."
msgstr "Gesundheitsmonitor kann nicht gelöscht werden."
msgid "Unable to delete listener."
msgstr "Listener kann nicht gelöscht werden."
msgid "Unable to delete load balancer."
msgstr "Loadbalancer kann nicht gelöscht werden."
msgid "Unable to delete pool."
msgstr "Pool kann nicht gelöscht werden."
#, python-format
msgid "Unable to disassociate floating IP address from load balancer: %s."
msgstr ""
"Verbindung der Floating-IP zum Loadbalancer kann nicht gelöst werden: %s."
msgid "Unable to retrieve SSL certificates."
msgstr "SSL-Zertifikate können nicht abgerufen werden."
msgid "Unable to retrieve health monitor."
msgstr "Gesundheitsmonitor kann nicht abgerufen werden."
msgid "Unable to retrieve listener."
msgstr "Listener kann nicht abgerufen werden."
msgid "Unable to retrieve listeners."
msgstr "Listener können nicht abgerufen werden."
msgid "Unable to retrieve load balancer status tree."
msgstr "Loadbalancer Statusbaum kann nicht abgerufen werden."
msgid "Unable to retrieve load balancer."
msgstr "Loadbalancer kann nicht abgerufen werden."
msgid "Unable to retrieve load balancers."
msgstr "Loadbalancer können nicht abgerufen werden."
msgid "Unable to retrieve member."
msgstr "Mitglied kann nicht abgerufen werden."
msgid "Unable to retrieve members."
msgstr "Mitglieder können nicht abgerufen werden."
msgid "Unable to retrieve pool."
msgstr "Pool kann nicht abgerufen werden."
msgid "Unable to retrieve secrets."
msgstr "Geheimdaten können nicht abgerufen werden."
msgid "Unable to update health monitor."
msgstr "Gesundheitsmonitor kann nicht aktualisiert werden."
msgid "Unable to update listener."
msgstr "Listener kann nicht aktualisiert werden."
msgid "Unable to update load balancer."
msgstr "Loadbalancer kann nicht aktualisiert werden."
msgid "Unable to update member list."
msgstr "Mitgliederliste kann nicht aktualisiert werden."
msgid "Unable to update member."
msgstr "Mitglied kann nicht aktualisiert werden."
msgid "Unable to update pool."
msgstr "Pool kann nicht aktualisiert werden."
msgid "Update"
msgstr "Aktualisieren"
msgid "Update Health Monitor"
msgstr "Gesundheitsmonitor aktualisieren"
msgid "Update Listener"
msgstr "Listener aktualisieren"
msgid "Update Load Balancer"
msgstr "Loadbalancer aktualisieren"
msgid "Update Member Weight"
msgstr "Mitglied-Gewicht aktualisieren"
msgid "Update Pool"
msgstr "Pool aktualisieren"
msgid "Update Weight"
msgstr "Gewicht aktualisieren"
msgid ""
"Use the key-manager service to create any certificate containers before "
"creating the listener.\n"
" The following documentation provides information on how to create a "
"certificate container:"
msgstr ""
"Benutzen Sie den Key-Manager-Dienst zum Erstellen aller Zertifikat-"
"Container, bevor Sie den Listener erstellen.\n"
" Die folgende Dokumentation stellt Informationen zur Verfügung, wie "
"Zertifikat-Container zu erstellen sind:"
msgid "Weight"
msgstr "Gewicht"
msgid "Weight:"
msgstr "Gewichtung:"
#, python-format
msgid ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
msgstr ""
"Sie sind im Begriff, die Verbindung der Floating-IP-Adresse vom Loadbalancer "
"%s zu lösen. Bitte bestätigen Sie."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
msgstr ""
"Sie haben \"%s\" ausgewählt. Bitte bestätigen Sie die Auswahl. Gelöschte "
"Gesundheitsmonitore können nicht mehr hergestellt werden."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted listeners "
"are not recoverable."
msgstr ""
"Sie haben \"%s\" ausgewählt. Bitte bestätigen Sie die Auswahl. Gelöschte "
"Listener können nicht mehr hergestellt werden."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
msgstr ""
"Sie haben \"%s\" ausgewählt. Bitte bestätigen Sie die Auswahl. Gelöschte "
"Loadbalancer können nicht mehr hergestellt werden."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."
msgstr ""
"Sie haben \"%s\" ausgewählt. Bitte bestätigen Sie die Auswahl. Gelöschte "
"Pools können nicht mehr hergestellt werden."

View File

@ -1,18 +0,0 @@
# Andi Chandler <andi@gowling.com>, 2017. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-02-05 21:38+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-28 03:59+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\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 "Load Balancers"
msgstr "Load Balancers"

View File

@ -1,919 +0,0 @@
# Andi Chandler <andi@gowling.com>, 2017. #zanata
# Andi Chandler <andi@gowling.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-03-29 00:48+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-30 10:11+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\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"
#, python-format
msgid "%(ip)s..."
msgstr "%(ip)s..."
msgid "A new health monitor is being created."
msgstr "A new health monitor is being created."
msgid "A new listener is being created."
msgstr "A new listener is being created."
msgid "A new load balancer is being created."
msgstr "A new load balancer is being created."
msgid "A new pool is being created."
msgstr "A new pool is being created."
msgid ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgstr ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgid "Actions"
msgstr "Actions"
msgid "Active"
msgstr "Active"
msgid "Add"
msgstr "Add"
msgid "Add external member"
msgstr "Add external member"
msgid "Add members to the load balancer pool."
msgstr "Add members to the load balancer pool."
msgid "Add/Remove Pool Members"
msgstr "Add/Remove Pool Members"
msgid "Address"
msgstr "Address"
msgid "Admin State Up"
msgstr "Admin State Up"
msgid "Allocated Members"
msgstr "Allocated Members"
msgid "An error occurred. Please try again later."
msgstr "An error occurred. Please try again later."
msgid "Associate"
msgstr "Associate"
msgid "Associate Floating IP"
msgstr "Associate Floating IP"
msgid "Associate Floating IP Address"
msgstr "Associate Floating IP Address"
msgid "Associating floating IP with load balancer."
msgstr "Associating floating IP with load balancer."
msgid "Available Instances"
msgstr "Available Instances"
msgid "Back"
msgstr "Back"
msgid "Cancel"
msgstr "Cancel"
msgid "Certificate Name"
msgstr "Certificate Name"
msgid "Confirm Delete Health Monitor"
msgstr "Confirm Delete Health Monitor"
msgid "Confirm Delete Listeners"
msgstr "Confirm Delete Listeners"
msgid "Confirm Delete Load Balancers"
msgstr "Confirm Delete Load Balancers"
msgid "Confirm Delete Pool"
msgstr "Confirm Delete Pool"
msgid "Confirm Disassociate Floating IP Address"
msgstr "Confirm Disassociate Floating IP Address"
msgid "Connection Limit"
msgstr "Connection Limit"
msgid "Create Health Monitor"
msgstr "Create Health Monitor"
msgid "Create Listener"
msgstr "Create Listener"
msgid "Create Load Balancer"
msgstr "Create Load Balancer"
msgid "Create Pool"
msgstr "Create Pool"
msgid "Default Pool ID"
msgstr "Default Pool ID"
msgid "Degraded"
msgstr "Degraded"
msgid "Delay"
msgstr "Delay"
msgid "Delete Health Monitor"
msgstr "Delete Health Monitor"
msgid "Delete Listener"
msgstr "Delete Listener"
msgid "Delete Listeners"
msgstr "Delete Listeners"
msgid "Delete Load Balancer"
msgstr "Delete Load Balancer"
msgid "Delete Load Balancers"
msgstr "Delete Load Balancers"
msgid "Delete Pool"
msgstr "Delete Pool"
#, python-format
msgid "Deleted health monitor: %s."
msgstr "Deleted health monitor: %s."
#, python-format
msgid "Deleted listeners: %s."
msgstr "Deleted listeners: %s."
#, python-format
msgid "Deleted load balancers: %s."
msgstr "Deleted load balancers: %s."
#, python-format
msgid "Deleted pool: %s."
msgstr "Deleted pool: %s."
msgid "Description"
msgstr "Description"
msgid "Disassociate"
msgstr "Disassociate"
msgid "Disassociate Floating IP"
msgstr "Disassociate Floating IP"
#, python-format
msgid "Disassociated floating IP address from load balancer: %s."
msgstr "Disassociated floating IP address from load balancer: %s."
msgid ""
"Each port that listens for traffic on a particular load balancer is "
"configured separately and\n"
" tied to the load balancer. Multiple listeners can be associated with the "
"same load balancer but\n"
" each must use a unique port."
msgstr ""
"Each port that listens for traffic on a particular load balancer is "
"configured separately and\n"
" tied to the load balancer. Multiple listeners can be associated with the "
"same load balancer but\n"
" each must use a unique port."
msgid "Edit"
msgstr "Edit"
msgid "Edit Pool"
msgstr "Edit Pool"
msgid "Error"
msgstr "Error"
msgid "Expected Codes"
msgstr "Expected Codes"
msgid "Expected status codes"
msgstr "Expected status codes"
msgid "Expected status codes:"
msgstr "Expected status codes:"
msgid "Expiration Date"
msgstr "Expiration Date"
msgid "Floating IP Address"
msgstr "Floating IP Address"
msgid "Floating IP address or pool"
msgstr "Floating IP address or pool"
msgid "Floating IP addresses"
msgstr "Floating IP addresses"
msgid "Floating IP pools"
msgstr "Floating IP pools"
msgid "HTTP Method"
msgstr "HTTP Method"
msgid "HTTP method"
msgstr "HTTP method"
msgid "HTTP method:"
msgstr "HTTP method:"
msgid "Health Monitor ID"
msgstr "Health Monitor ID"
msgid "ID"
msgstr "ID"
msgid "IP Address"
msgstr "IP Address"
#, python-format
msgid "IP Addresses (%(count)s)"
msgstr "IP Addresses (%(count)s)"
msgid "IP address"
msgstr "IP address"
msgid "IP address:"
msgstr "IP address:"
msgid ""
"If an IP address is provided it must be a well-formed IPv4 or IPv6 address. "
"The system will\n"
" attempt to assign the provided IP address to the load balancer. If an IP "
"address is not provided\n"
" then one will be allocated for you."
msgstr ""
"If an IP address is provided it must be a well-formed IPv4 or IPv6 address. "
"The system will\n"
" attempt to assign the provided IP address to the load balancer. If an IP "
"address is not provided\n"
" then one will be allocated for you."
msgid ""
"If the listener uses the TERMINATED_HTTPS protocol, then one or more SSL "
"certificates must\n"
" be selected. The first certificate will be the default."
msgstr ""
"If the listener uses the TERMINATED_HTTPS protocol, then one or more SSL "
"certificates must\n"
" be selected. The first certificate will be the default."
msgid "Inactive"
msgstr "Inactive"
msgid "Interval (sec)"
msgstr "Interval (sec)"
msgid "Interval:"
msgstr "Interval:"
msgid "Key Manager API Guide: Creating a Certificate Container"
msgstr "Key Manager API Guide: Creating a Certificate Container"
msgid "Key Manager Service Command-Line Client"
msgstr "Key Manager Service Command-Line Client"
msgid ""
"LEAST_CONNECTIONS: Allocates requests to the instance with the least number "
"of active\n"
" connections."
msgstr ""
"LEAST_CONNECTIONS: Allocates requests to the instance with the least number "
"of active\n"
" connections."
msgid "Least Connections"
msgstr "Least Connections"
#, python-format
msgid "Listener %(index)s"
msgstr "Listener %(index)s"
msgid "Listener 1"
msgstr "Listener 1"
msgid "Listener Details"
msgstr "Listener Details"
msgid "Listener ID"
msgstr "Listener ID"
msgid "Listeners"
msgstr "Listeners"
#, python-format
msgid "Load Balancer %(index)s"
msgstr "Load Balancer %(index)s"
msgid "Load Balancer Algorithm"
msgstr "Load Balancer Algorithm"
msgid "Load Balancer Details"
msgstr "Load Balancer Details"
msgid "Load Balancer ID"
msgstr "Load Balancer ID"
msgid "Load Balancers"
msgstr "Load Balancers"
msgid "Loading"
msgstr "Loading"
msgid "Max Retries"
msgstr "Max Retries"
msgid "Member ID"
msgstr "Member ID"
msgid "Members"
msgstr "Members"
msgid ""
"Members are the actual IP addresses that will receive traffic from the load "
"balancer. Each\n"
" member must have a unique combination of IP address and port."
msgstr ""
"Members are the actual IP addresses that will receive traffic from the load "
"balancer. Each\n"
" member must have a unique combination of IP address and port."
msgid "Method"
msgstr "Method"
msgid "Method:"
msgstr "Method:"
msgid "Monitor Details"
msgstr "Monitor Details"
msgid "Monitor ID"
msgstr "Monitor ID"
msgid "Monitor type"
msgstr "Monitor type"
msgid "Name"
msgstr "Name"
msgid "No available certificates"
msgstr "No available certificates"
msgid "No available instances"
msgstr "No available instances"
msgid "No items to display."
msgstr "No items to display."
msgid "No members have been allocated"
msgstr "No members have been allocated"
msgid "None"
msgstr "None"
msgid "Offline"
msgstr "Offline"
msgid "Online"
msgstr "Online"
msgid "Operating Status"
msgstr "Operating Status"
msgid "Overview"
msgstr "Overview"
msgid "Pending Create"
msgstr "Pending Create"
msgid "Pending Delete"
msgstr "Pending Delete"
msgid "Pending Update"
msgstr "Pending Update"
msgid "Pool 1"
msgstr "Pool 1"
msgid "Pool Details"
msgstr "Pool Details"
msgid "Pool ID"
msgstr "Pool ID"
msgid "Pool Members"
msgstr "Pool Members"
msgid "Pool member weight has been updated."
msgstr "Pool member weight has been updated."
msgid "Port"
msgstr "Port"
msgid "Port ID"
msgstr "Port ID"
msgid "Port:"
msgstr "Port:"
msgid "Protocol"
msgstr "Protocol"
msgid "Protocol Port"
msgstr "Protocol Port"
msgid "Protocol:"
msgstr "Protocol:"
msgid "Provide the details for the health monitor."
msgstr "Provide the details for the health monitor."
msgid "Provide the details for the listener."
msgstr "Provide the details for the listener."
msgid "Provide the details for the load balancer."
msgstr "Provide the details for the load balancer."
msgid "Provide the details for the pool."
msgstr "Provide the details for the pool."
msgid "Provider"
msgstr "Provider"
msgid "Provisioning Status"
msgstr "Provisioning Status"
msgid "ROUND_ROBIN: Rotates requests evenly between multiple instances."
msgstr "ROUND_ROBIN: Rotates requests evenly between multiple instances."
msgid "Remove"
msgstr "Remove"
msgid "Retries"
msgstr "Retries"
msgid "Retries:"
msgstr "Retries:"
msgid "Round Robin"
msgstr "Round Robin"
msgid ""
"SOURCE_IP: Requests from a unique source IP address are consistently "
"directed to the same instance."
msgstr ""
"SOURCE_IP: Requests from a unique source IP address are consistently "
"directed to the same instance."
msgid "SSL Certificates"
msgstr "SSL Certificates"
msgid ""
"Select a floating IP address to associate with the load balancer or a "
"floating IP pool in which to allocate a new floating IP address."
msgstr ""
"Select a floating IP address to associate with the load balancer or a "
"floating IP pool in which to allocate a new floating IP address."
msgid "Select certificates from the available certificates below"
msgstr "Select certificates from the available certificates below"
msgid "Select one or more SSL certificates for the listener."
msgstr "Select one or more SSL certificates for the listener."
msgid "Session Persistence"
msgstr "Session Persistence"
msgid "Source IP"
msgstr "Source IP"
msgid "Subnet"
msgstr "Subnet"
msgid "Subnet ID"
msgstr "Subnet ID"
msgid "Subnet:"
msgstr "Subnet:"
msgid "Tenant ID"
msgstr "Tenant ID"
msgid ""
"The Available Instances table contains existing compute instances that can "
"be added as members\n"
" of the pool. Use the \"Add external member\" button to add a member not "
"found in the Available\n"
" Instances table."
msgstr ""
"The Available Instances table contains existing compute instances that can "
"be added as members\n"
" of the pool. Use the \"Add external member\" button to add a member not "
"found in the Available\n"
" Instances table."
msgid "The HTTP method used to perform the health check."
msgstr "The HTTP method used to perform the health check."
msgid "The IP address is not valid."
msgstr "The IP address is not valid."
msgid ""
"The IP address of the member to receive traffic from the load balancer. Must "
"be a well-formed\n"
" IPv4 or IPv6 address."
msgstr ""
"The IP address of the member to receive traffic from the Load Balancer. Must "
"be a well-formed\n"
" IPv4 or IPv6 address."
msgid "The URL path is not valid."
msgstr "The URL path is not valid."
msgid ""
"The expected HTTP status codes to get from a successful health check. Must "
"be a single number,\n"
" a comma separated list of numbers, or a range (two numbers separated by a "
"hyphen)."
msgstr ""
"The expected HTTP status codes to get from a successful health check. Must "
"be a single number,\n"
" a comma separated list of numbers, or a range (two numbers separated by a "
"hyphen)."
msgid "The expected status code is not valid."
msgstr "The expected status code is not valid."
#, python-format
msgid "The following health monitor could not be deleted: %s."
msgstr "The following health monitor could not be deleted: %s."
#, python-format
msgid ""
"The following listeners could not be deleted, possibly due to existing "
"pools: %s."
msgstr ""
"The following listeners could not be deleted, possibly due to existing "
"pools: %s."
#, python-format
msgid "The following listeners will not be deleted due to existing pools: %s."
msgstr "The following listeners will not be deleted due to existing pools: %s."
#, python-format
msgid "The following load balancers are pending and cannot be deleted: %s."
msgstr "The following load balancers are pending and cannot be deleted: %s."
#, python-format
msgid ""
"The following load balancers could not be deleted, possibly due to existing "
"listeners: %s."
msgstr ""
"The following load balancers could not be deleted, possibly due to existing "
"listeners: %s."
#, python-format
msgid "The following pool could not be deleted: %s."
msgstr "The following pool could not be deleted: %s."
msgid "The health check interval must be greater than or equal to the timeout."
msgstr ""
"The health check interval must be greater than or equal to the timeout."
msgid "The health monitor has been updated."
msgstr "The health monitor has been updated."
msgid ""
"The health monitor is used to determine the health of your pool members. "
"Health checks\n"
" routinely run against each member within the pool and the result of the "
"health check is used\n"
" to determine if the member receives new connections. Each pool can only "
"have one health\n"
" monitor."
msgstr ""
"The health monitor is used to determine the health of your pool members. "
"Health checks\n"
" routinely run against each member within the pool and the result of the "
"health check is used\n"
" to determine if the member receives new connections. Each pool can only "
"have one health\n"
" monitor."
msgid ""
"The interval between health checks. Must be greater than or equal to the "
"timeout."
msgstr ""
"The interval between health checks. Must be greater than or equal to the "
"timeout."
msgid "The listener has been updated."
msgstr "The listener has been updated."
msgid ""
"The load balancer algorithm that distributes traffic to the pool members."
msgstr ""
"The load balancer algorithm that distributes traffic to the pool members."
msgid "The load balancer has been updated."
msgstr "The load balancer has been updated."
msgid ""
"The load balancer occupies a neutron network port and has an IP address "
"assigned from a subnet."
msgstr ""
"The load balancer occupies a Neutron network port and has an IP address "
"assigned from a subnet."
msgid "The max retry count must be a number between 1 and 10."
msgstr "The max retry count must be a number between 1 and 10."
msgid "The network on which to allocate the load balancer's IP address."
msgstr "The network on which to allocate the Load Balancer's IP address."
msgid "The network which contains the IP address of the member."
msgstr "The network which contains the IP address of the member."
msgid ""
"The number of allowed connection failures before marking the member as "
"inactive. Must be a\n"
" number from 1 to 10."
msgstr ""
"The number of allowed connection failures before marking the member as "
"inactive. Must be a\n"
" number from 1 to 10."
msgid "The pool has been updated."
msgstr "The pool has been updated."
msgid "The pool members have been updated."
msgstr "The pool members have been updated."
msgid "The port must be a number between 1 and 65535."
msgstr "The port must be a number between 1 and 65535."
msgid ""
"The port must be unique among all listeners attached to this load balancer."
msgstr ""
"The port must be unique among all listeners attached to this load balancer."
msgid ""
"The port on which the front end listens. Must be an integer from 1 to 65535."
msgstr ""
"The port on which the front end listens. Must be an integer from 1 to 65535."
msgid ""
"The port on which the member listens for traffic. Must be a number from 1 to "
"65535."
msgstr ""
"The port on which the member listens for traffic. Must be a number from 1 to "
"65535."
msgid ""
"The protocol for which the front end listens. The TERMINATED_HTTPS protocol "
"is only available if\n"
" the key-manager service is enabled and you have authority to list "
"certificate containers and\n"
" secrets."
msgstr ""
"The protocol for which the front end listens. The TERMINATED_HTTPS protocol "
"is only available if\n"
" the key-manager service is enabled and you have authority to list "
"certificate containers and\n"
" secrets."
msgid ""
"The target of the health check HTTP request to the member. Must be a valid "
"URL path."
msgstr ""
"The target of the health check HTTP request to the member. Must be a valid "
"URL path."
msgid ""
"The time after which a health check times out. Must be a number greater than "
"or equal to 0\n"
" and less than or equal to the interval."
msgstr ""
"The time after which a health check times out. Must be a number greater than "
"or equal to 0\n"
" and less than or equal to the interval."
msgid "The timeout must be a number greater than or equal to 0."
msgstr "The timeout must be a number greater than or equal to 0."
msgid "The weight must be a number between 1 and 256."
msgstr "The weight must be a number between 1 and 256."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared\n"
" to the other members of the pool. A higher weight means it will receive "
"more traffic. Must be\n"
" a number from 1 to 256."
msgstr ""
"The weight of a member determines the portion of requests or connections it "
"services compared\n"
" to the other members of the pool. A higher weight means it will receive "
"more traffic. Must be\n"
" a number from 1 to 256."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared to the other members of the pool."
msgstr ""
"The weight of a member determines the portion of requests or connections it "
"services compared to the other members of the pool."
msgid "Timeout"
msgstr "Timeout"
msgid "Timeout (sec)"
msgstr "Timeout (sec)"
msgid "Timeout:"
msgstr "Timeout:"
msgid "Type"
msgstr "Type"
msgid "URL Path"
msgstr "URL Path"
msgid "URL path"
msgstr "URL path"
msgid "URL path:"
msgstr "URL path:"
msgid "Unable to create health monitor."
msgstr "Unable to create health monitor."
msgid "Unable to create listener."
msgstr "Unable to create listener."
msgid "Unable to create load balancer."
msgstr "Unable to create load balancer."
msgid "Unable to create pool."
msgstr "Unable to create pool."
msgid "Unable to delete health monitor."
msgstr "Unable to delete health monitor."
msgid "Unable to delete listener."
msgstr "Unable to delete listener."
msgid "Unable to delete load balancer."
msgstr "Unable to delete load balancer."
msgid "Unable to delete pool."
msgstr "Unable to delete pool."
#, python-format
msgid "Unable to disassociate floating IP address from load balancer: %s."
msgstr "Unable to disassociate floating IP address from load balancer: %s."
msgid "Unable to retrieve SSL certificates."
msgstr "Unable to retrieve SSL certificates."
msgid "Unable to retrieve health monitor."
msgstr "Unable to retrieve health monitor."
msgid "Unable to retrieve listener."
msgstr "Unable to retrieve listener."
msgid "Unable to retrieve listeners."
msgstr "Unable to retrieve listeners."
msgid "Unable to retrieve load balancer status tree."
msgstr "Unable to retrieve load balancer status tree."
msgid "Unable to retrieve load balancer."
msgstr "Unable to retrieve load balancer."
msgid "Unable to retrieve load balancers."
msgstr "Unable to retrieve load balancers."
msgid "Unable to retrieve member."
msgstr "Unable to retrieve member."
msgid "Unable to retrieve members."
msgstr "Unable to retrieve members."
msgid "Unable to retrieve pool."
msgstr "Unable to retrieve pool."
msgid "Unable to retrieve secrets."
msgstr "Unable to retrieve secrets."
msgid "Unable to update health monitor."
msgstr "Unable to update health monitor."
msgid "Unable to update listener."
msgstr "Unable to update listener."
msgid "Unable to update load balancer."
msgstr "Unable to update load balancer."
msgid "Unable to update member list."
msgstr "Unable to update member list."
msgid "Unable to update member."
msgstr "Unable to update member."
msgid "Unable to update pool."
msgstr "Unable to update pool."
msgid "Update"
msgstr "Update"
msgid "Update Health Monitor"
msgstr "Update Health Monitor"
msgid "Update Listener"
msgstr "Update Listener"
msgid "Update Load Balancer"
msgstr "Update Load Balancer"
msgid "Update Member Weight"
msgstr "Update Member Weight"
msgid "Update Pool"
msgstr "Update Pool"
msgid "Update Weight"
msgstr "Update Weight"
msgid ""
"Use the key-manager service to create any certificate containers before "
"creating the listener.\n"
" The following documentation provides information on how to create a "
"certificate container:"
msgstr ""
"Use the key-manager service to create any certificate containers before "
"creating the listener.\n"
" The following documentation provides information on how to create a "
"certificate container:"
msgid "Weight"
msgstr "Weight"
msgid "Weight:"
msgstr "Weight:"
#, python-format
msgid ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
msgstr ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
msgstr ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted listeners "
"are not recoverable."
msgstr ""
"You have selected \"%s\". Please confirm your selection. Deleted listeners "
"are not recoverable."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
msgstr ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."
msgstr ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."

View File

@ -1,18 +0,0 @@
# Gérald LONLAS <g.lonlas@gmail.com>, 2016. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard 3.0.1.dev6\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2017-09-28 01:36+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2016-10-28 03:48+0000\n"
"Last-Translator: Gérald LONLAS <g.lonlas@gmail.com>\n"
"Language-Team: French\n"
"Language: fr\n"
"X-Generator: Zanata 3.9.6\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
msgid "Load Balancers"
msgstr "Répartiteurs de charge"

View File

@ -1,542 +0,0 @@
# Corinne Verheyde <cverheyd@gmail.com>, 2017. #zanata
# Cédric Savignan <liced@liced.fr>, 2017. #zanata
# Loic Nicolle <loic.nicolle@orange.com>, 2017. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-03-29 00:48+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2017-10-05 02:15+0000\n"
"Last-Translator: Cédric Savignan <liced@liced.fr>\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 "%(ip)s..."
msgstr "%(ip)s..."
msgid "A new health monitor is being created."
msgstr "Un nouveau moniteur de santé est en cours de création."
msgid "A new load balancer is being created."
msgstr "Un nouveau répartiteur de charge est en cours de création."
msgid "A new pool is being created."
msgstr "Un nouveau pool est en cours de création."
msgid ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgstr ""
"Un pool représente un groupe de membres sur lequel l'équilibrage de charge "
"sera appliqué."
msgid "Actions"
msgstr "Actions"
msgid "Active"
msgstr "Actif"
msgid "Add"
msgstr "Ajouter"
msgid "Add external member"
msgstr "Ajouter un membre exterieur"
msgid "Add members to the load balancer pool."
msgstr "Ajouter des membres au pool du répartiteur de charge."
msgid "Add/Remove Pool Members"
msgstr "Ajouter/Retirer des membres du pool"
msgid "Address"
msgstr "Adresse"
msgid "Admin State Up"
msgstr "Etat Admin activé"
msgid "Allocated Members"
msgstr "Membres alloués"
msgid "An error occurred. Please try again later."
msgstr "Une erreur s'est produite. Veuillez réessayer ultérieurement."
msgid "Associate"
msgstr "Associer"
msgid "Associate Floating IP"
msgstr "Associer une adresse IP flottante"
msgid "Associate Floating IP Address"
msgstr "Associer une adresse IP flottante"
msgid "Associating floating IP with load balancer."
msgstr "Associer une adresse IP flottante au répartiteur de charge."
msgid "Available Instances"
msgstr "Instances disponibles"
msgid "Back"
msgstr "Retour"
msgid "Cancel"
msgstr "Annuler"
msgid "Certificate Name"
msgstr "Nom du certificat"
msgid "Confirm Delete Health Monitor"
msgstr "Confirmer la suppression du moniteur de santé"
msgid "Confirm Delete Listeners"
msgstr "Confirmer la suppression des Listeners"
msgid "Confirm Delete Load Balancers"
msgstr "Confirmer la suppression des répartiteurs de charge"
msgid "Confirm Delete Pool"
msgstr "Confirmer la suppression du pool"
msgid "Confirm Disassociate Floating IP Address"
msgstr "Confirmer la dé-association de l'adresse IP flottante"
msgid "Connection Limit"
msgstr "Limite de connexion"
msgid "Create Health Monitor"
msgstr "Créer un moniteur de santé"
msgid "Create Load Balancer"
msgstr "Créer un répartiteur de charge"
msgid "Create Pool"
msgstr "Créer un pool"
msgid "Default Pool ID"
msgstr "ID du pool par défaut"
msgid "Degraded"
msgstr "Dégradé"
msgid "Delay"
msgstr "Délai"
msgid "Delete Health Monitor"
msgstr "Supprimer un moniteur de santé"
msgid "Delete Load Balancer"
msgstr "Supprimer le répartiteur de charge"
msgid "Delete Load Balancers"
msgstr "Supprimer les répartiteurs de charge"
msgid "Delete Pool"
msgstr "Supprimer le pool"
#, python-format
msgid "Deleted health monitor: %s."
msgstr "Moniteur de santé %s supprimé."
#, python-format
msgid "Deleted load balancers: %s."
msgstr "Répartiteurs de charge supprimé: %s."
#, python-format
msgid "Deleted pool: %s."
msgstr "Pool %s supprimé"
msgid "Description"
msgstr "Description"
msgid "Disassociate"
msgstr "Dissocier"
msgid "Disassociate Floating IP"
msgstr "Dissocier l'adresse IP flottante"
msgid "Edit"
msgstr "Editer"
msgid "Edit Pool"
msgstr "Editer le pool"
msgid "Error"
msgstr "Erreur"
msgid "Expected Codes"
msgstr "Codes attendus"
msgid "Expected status codes"
msgstr "Codes de statut attendus"
msgid "Expiration Date"
msgstr "Date d'expiration"
msgid "Floating IP Address"
msgstr "Adresse IP flottante"
msgid "Floating IP addresses"
msgstr "Adresses IP flottantes"
msgid "Floating IP pools"
msgstr "Pools d'IP flottantes"
msgid "HTTP Method"
msgstr "Méthode HTTP"
msgid "HTTP method"
msgstr "Méthode HTTP"
msgid "Health Monitor ID"
msgstr "ID du moniteur de santé"
msgid "ID"
msgstr "ID"
msgid "IP Address"
msgstr "Adresse IP"
#, python-format
msgid "IP Addresses (%(count)s)"
msgstr "Adresses IP (%(count)s)"
msgid "IP address"
msgstr "Adresse IP"
msgid "Inactive"
msgstr "Inactif"
msgid "Least Connections"
msgstr "Connexions minimales"
msgid "Listeners"
msgstr "Listeners"
#, python-format
msgid "Load Balancer %(index)s"
msgstr "Répartiteur de charge %(index)s"
msgid "Load Balancer Algorithm"
msgstr "Algorithme du répartiteur de charge"
msgid "Load Balancer Details"
msgstr "Détails du répartiteur de charge"
msgid "Load Balancer ID"
msgstr "ID de l'équilibreur de charge"
msgid "Load Balancers"
msgstr "Répartiteurs de charge"
msgid "Loading"
msgstr "Chargement..."
msgid "Max Retries"
msgstr "Tentatives maxi."
msgid "Member ID"
msgstr "ID du membre"
msgid "Members"
msgstr "Membres"
msgid "Monitor Details"
msgstr "Détails du moniteur"
msgid "Monitor ID"
msgstr "ID du moniteur"
msgid "Name"
msgstr "Nom"
msgid "No available certificates"
msgstr "Aucun certificat disponible"
msgid "No available instances"
msgstr "Aucune instance disponible"
msgid "No items to display."
msgstr "Aucun élément à afficher."
msgid "No members have been allocated"
msgstr "Aucun membre n'a été alloué"
msgid "None"
msgstr "Aucun"
msgid "Offline"
msgstr "Hors ligne"
msgid "Online"
msgstr "En ligne"
msgid "Operating Status"
msgstr "Statut opérationnel"
msgid "Overview"
msgstr "Vue d'ensemble"
msgid "Pending Create"
msgstr "Création en attente"
msgid "Pending Delete"
msgstr "Suppression en attente"
msgid "Pending Update"
msgstr "Mise à jour en attente"
msgid "Pool 1"
msgstr "Pool 1"
msgid "Pool Details"
msgstr "Détails du pool"
msgid "Pool ID"
msgstr "ID du pool"
msgid "Pool Members"
msgstr "Membres du pool"
msgid "Port"
msgstr "Port"
msgid "Port ID"
msgstr "ID port"
msgid "Protocol"
msgstr "Protocole"
msgid "Protocol Port"
msgstr "Port de protocole"
msgid "Provide the details for the health monitor."
msgstr "Spécifier les détails pour le moniteur d'état."
msgid "Provide the details for the pool."
msgstr "Spécifier les détails pour le pool."
msgid "Provider"
msgstr "Fournisseur"
msgid "Provisioning Status"
msgstr "Statut de Déploiement"
msgid "Remove"
msgstr "Retirer"
msgid "Round Robin"
msgstr "Round Robin"
msgid "SSL Certificates"
msgstr "Certificats SSL"
msgid "Select certificates from the available certificates below"
msgstr "Sélectionner les certificats depuis la liste disponible ci dessous"
msgid "Session Persistence"
msgstr "Persistance de session"
msgid "Source IP"
msgstr "IP source"
msgid "Subnet ID"
msgstr "ID sous-réseau"
msgid "Tenant ID"
msgstr "ID du tenant"
msgid "The IP address is not valid."
msgstr "L'adresse IP n'est pas valide."
msgid "The URL path is not valid."
msgstr "Le chemin d'URL n'est pas valide."
msgid "The expected status code is not valid."
msgstr "Le code de statut attendu n'est pas valide."
#, python-format
msgid "The following health monitor could not be deleted: %s."
msgstr "Le moniteur de santé suivant ne peut être supprimé: %s"
#, python-format
msgid "The following pool could not be deleted: %s."
msgstr "Le pool suivant ne peut être supprimé: %s"
msgid "The health check interval must be greater than or equal to the timeout."
msgstr ""
"Le diagnostic d'intégrité doit être supérieur ou égal au délai d'attente."
msgid "The health monitor has been updated."
msgstr "Le moniteur de santé a été mis à jour."
msgid "The load balancer has been updated."
msgstr "Le répartiteur de charge a été mis à jour."
msgid "The max retry count must be a number between 1 and 10."
msgstr "Le compteur max de tentatives doit être un nombre entre 1 et 10."
msgid "The pool has been updated."
msgstr "Le pool a été mis à jour."
msgid "The pool members have been updated."
msgstr "Les membres du pool ont été mis à jour."
msgid "The port must be a number between 1 and 65535."
msgstr "Le numéro de port doit être un nombre compris entre 1 et 65535."
msgid "The timeout must be a number greater than or equal to 0."
msgstr "Le délai d'attente dois être un nombre supérieur ou égal à 0."
msgid "The weight must be a number between 1 and 256."
msgstr "Le poids doit être un nombre compris entre 1 et 256"
msgid "Timeout"
msgstr "Délai d'attente"
msgid "Type"
msgstr "Type"
msgid "URL Path"
msgstr "Chemin d'URL"
msgid "URL path"
msgstr "Chemin d'URL"
msgid "Unable to create health monitor."
msgstr "Impossible de créer le moniteur de santé."
msgid "Unable to create listener."
msgstr "Impossible de créer le listener."
msgid "Unable to create load balancer."
msgstr "Impossible de créer le load balancer."
msgid "Unable to create pool."
msgstr "Impossible de créer le pool."
msgid "Unable to delete health monitor."
msgstr "Impossible de supprimer le moniteur de santé."
msgid "Unable to delete listener."
msgstr "Impossible de supprimer le listener."
msgid "Unable to delete load balancer."
msgstr "Impossible de supprimer le load balancer."
msgid "Unable to delete pool."
msgstr "Impossible de supprimer le pool."
#, python-format
msgid "Unable to disassociate floating IP address from load balancer: %s."
msgstr ""
"Impossible de dissocier les adresses IP flottantes du répartiteur de charge: "
"%s."
msgid "Unable to retrieve SSL certificates."
msgstr "Impossible de récupérer les certificats SSL."
msgid "Unable to retrieve health monitor."
msgstr "Impossible de récupérer le moniteur de santé."
msgid "Unable to retrieve listener."
msgstr "impossible de récupérer le listener."
msgid "Unable to retrieve listeners."
msgstr "Impossible de récupérer les listeners."
msgid "Unable to retrieve load balancer."
msgstr "Impossible de récupérer le load balancer."
msgid "Unable to retrieve load balancers."
msgstr "Impossible de récupérer les load balancers."
msgid "Unable to retrieve member."
msgstr "Impossible de récupérer le membre."
msgid "Unable to retrieve members."
msgstr "Impossible de récupérer les membres."
msgid "Unable to retrieve pool."
msgstr "Impossible de récupérer le pool."
msgid "Unable to retrieve secrets."
msgstr "Impossible de récupérer les secrets."
msgid "Unable to update health monitor."
msgstr "Impossible de mettre à jour le moniteur de santé."
msgid "Unable to update listener."
msgstr "Impossible de mettre à jour le listener."
msgid "Unable to update load balancer."
msgstr "Impossible de mettre à jour le load balancer."
msgid "Unable to update member list."
msgstr "Impossible de mettre à jour la liste des membres."
msgid "Unable to update member."
msgstr "Impossible de mettre à jour le membre."
msgid "Unable to update pool."
msgstr "Impossible de mettre à jour le pool."
msgid "Update"
msgstr "Mettre à jour"
msgid "Update Health Monitor"
msgstr "Mettre à jour le moniteur de santé"
msgid "Update Listener"
msgstr "Mettre à jour le Listener"
msgid "Update Load Balancer"
msgstr "Mettre à jour le répartiteur de charge"
msgid "Update Member Weight"
msgstr "Mettre à jour le poids du membre"
msgid "Update Pool"
msgstr "Mettre à jour le pool"
msgid "Update Weight"
msgstr "Mettre à jour les poids"
msgid "Weight"
msgstr "Poids"
#, python-format
msgid ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
msgstr ""
"Vous êtes sur le point de dissocier l'adresse IP flottante de l'équilibreur "
"de charge \"%s\". Veuillez confirmer."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
msgstr ""
"Vous avez sélectionné \"%s\". Veuillez confirmer votre sélection. Les "
"moniteurs de santé supprimés ne seront pas récupérable."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
msgstr ""
"Vous avez sélectionné \"%s\". Veuillez confirmer votre sélection. Les "
"répartiteurs de charge supprimés ne seront pas récupérable."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."
msgstr ""
"Vous avez sélectionné \"%s\". Veuillez confirmer votre sélection. Les pools "
"supprimés ne sont pas récupérables."

View File

@ -1,18 +0,0 @@
# suhartono <cloudsuhartono@gmail.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-04-23 09:10+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-04-30 02:23+0000\n"
"Last-Translator: suhartono <cloudsuhartono@gmail.com>\n"
"Language-Team: Indonesian\n"
"Language: id\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
msgid "Neutron Load Balancers"
msgstr "Neutron Load Balancers"

View File

@ -1,923 +0,0 @@
# suhartono <cloudsuhartono@gmail.com>, 2017. #zanata
# suhartono <cloudsuhartono@gmail.com>, 2018. #zanata
# suhartono <cloudsuhartono@gmail.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-01-08 11:42+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-01-21 04:56+0000\n"
"Last-Translator: suhartono <cloudsuhartono@gmail.com>\n"
"Language-Team: Indonesian\n"
"Language: id\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
#, python-format
msgid "%(ip)s..."
msgstr "%(ip)s..."
msgid "A new health monitor is being created."
msgstr "Sebuah pemantauan kesehatan baru sedang dibuat."
msgid "A new listener is being created."
msgstr "Sebuah pendengar baru sedang dibuat."
msgid "A new load balancer is being created."
msgstr "Sebuah penyeimbang beban baru sedang dibuat."
msgid "A new pool is being created."
msgstr "Sebuah kolam baru sedang dibuat."
msgid ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgstr ""
"Sebuah kolam mewakili sekelompok anggota dimana load balancing akan "
"diterapkan."
msgid "Actions"
msgstr "Actions (tindakan)"
msgid "Active"
msgstr "Active (aktif)"
msgid "Add"
msgstr "Add (tambah)"
msgid "Add external member"
msgstr "Tambahkan anggota eksternal"
msgid "Add members to the load balancer pool."
msgstr "Tambahkan anggota ke kolam penyeimbang beban."
msgid "Add/Remove Pool Members"
msgstr "Add/Remove Pool Members (anggota kolam Add/Remove)"
msgid "Address"
msgstr "Address (alamat)"
msgid "Admin State Up"
msgstr "Admin State Up"
msgid "Allocated Members"
msgstr "Anggota yang dialokasikan"
msgid "An error occurred. Please try again later."
msgstr "Terjadi kesalahan. Silakan coba lagi nanti."
msgid "Associate"
msgstr "Associate (mengkaitkan)"
msgid "Associate Floating IP"
msgstr "Associate Floating IP (mengkaitkan IP mengambang)"
msgid "Associate Floating IP Address"
msgstr "Associate Floating IP Address (alamat IP mengambang asosiasi)"
msgid "Associating floating IP with load balancer."
msgstr "Pengkaitan IP mengambang dengan beban penyeimbang."
msgid "Available Instances"
msgstr "Instance yang tersedia"
msgid "Back"
msgstr "Back"
msgid "Cancel"
msgstr "Cancel (batalkan)"
msgid "Certificate Name"
msgstr "Certificate Name (nama sertifikat)"
msgid "Confirm Delete Health Monitor"
msgstr "Confirm Delete Health Monitor (konfirmasi hapus pemantauan kesehatan)"
msgid "Confirm Delete Listeners"
msgstr "Confirm Delete Listeners (konfirmasi penghapusan pendengar)"
msgid "Confirm Delete Load Balancers"
msgstr "Confirm Delete Load Balancers (konfirmasi hapus beban penyeimbang)"
msgid "Confirm Delete Pool"
msgstr "Confirm Delete Pool (konfirmasi hapus kolam)"
msgid "Confirm Disassociate Floating IP Address"
msgstr "Konfirmasi pemisahan alamat IP mengambang"
msgid "Connection Limit"
msgstr "Connection Limit (batas koneksi)"
msgid "Create Health Monitor"
msgstr "Create Health Monitor (buat pemantauan kesehatan)"
msgid "Create Listener"
msgstr "Create Listener (buat pendengar)"
msgid "Create Load Balancer"
msgstr "Create Load Balancer (buat penyeimbang beban)"
msgid "Create Pool"
msgstr "Create Pool (buat kolam)"
msgid "Default Pool ID"
msgstr "Default Pool ID (ID pool default)"
msgid "Degraded"
msgstr "Degraded (diturunkan)"
msgid "Delay"
msgstr "Delay (menunda)"
msgid "Delete Health Monitor"
msgstr "Delete Health Monitor (hapus pemantauan kesehatan)"
msgid "Delete Listener"
msgstr "Delete Listener (hapus pendengar)"
msgid "Delete Listeners"
msgstr "Delete Listeners (hapus pendengar)"
msgid "Delete Load Balancer"
msgstr "Delete Load Balancer (hapus penyeimbang beban)"
msgid "Delete Load Balancers"
msgstr "Delete Load Balancers (hapus penyeimbang beban)"
msgid "Delete Pool"
msgstr "Delete Pool (hapus kolam)"
#, python-format
msgid "Deleted health monitor: %s."
msgstr "Pemantauan kesehatan yang dihapus: %s."
#, python-format
msgid "Deleted listeners: %s."
msgstr "Pendengar yang dihapus: %s."
#, python-format
msgid "Deleted load balancers: %s."
msgstr "Penyeimbang beban yang dihapus: %s."
#, python-format
msgid "Deleted pool: %s."
msgstr "Kolam yang dihapus: %s."
msgid "Description"
msgstr "Description (gambaran)"
msgid "Disassociate"
msgstr "Disassociate (pemisahan)"
msgid "Disassociate Floating IP"
msgstr "Disassociate Floating IP (memisahkan IP mengambang)"
#, python-format
msgid "Disassociated floating IP address from load balancer: %s."
msgstr "Alamat IP mengambang yang dipisahkan dari penyeimbang beban: %s."
msgid ""
"Each port that listens for traffic on a particular load balancer is "
"configured separately and\n"
" tied to the load balancer. Multiple listeners can be associated with the "
"same load balancer but\n"
" each must use a unique port."
msgstr ""
"Setiap port yang mendengarkan lalu lintas pada penyeimbang beban tertentu "
"dikonfigurasi secara terpisah dan\n"
"   terikat penyeimbang beban. Beberapa pendengar dapat dikaitkan dengan "
"penyeimbang beban yang sama tetapi\n"
"   masing-masing harus menggunakan port yang unik."
msgid "Edit"
msgstr "Edit"
msgid "Edit Pool"
msgstr "Edit Pool (edit kolam)"
msgid "Error"
msgstr "Error (kesalahan)"
msgid "Expected Codes"
msgstr "Expected Codes (kode yang diharapkan)"
msgid "Expected status codes"
msgstr "Expected status codes (kode status yang diharapkan)"
msgid "Expected status codes:"
msgstr "Kode status yang diharapkan:"
msgid "Expiration Date"
msgstr "Expiration Date (tanggal kadaluarsa)"
msgid "Floating IP Address"
msgstr "Floating IP Address (alamat IP mengambang)"
msgid "Floating IP address or pool"
msgstr "Alamat IP mengambang atau pool"
msgid "Floating IP addresses"
msgstr "Floating IP addresses (alamat IP mengambang)"
msgid "Floating IP pools"
msgstr "Floating IP pools (pool IP mengambang)"
msgid "HTTP Method"
msgstr "HTTP Method (metode HTTP)"
msgid "HTTP method"
msgstr "HTTP method (methode HTTP)"
msgid "HTTP method:"
msgstr "HTTP method:"
msgid "Health Monitor ID"
msgstr "Health Monitor ID (ID pemantauan kesehatan)"
msgid "ID"
msgstr "ID"
msgid "IP Address"
msgstr "IP Address (alamat IP)"
#, python-format
msgid "IP Addresses (%(count)s)"
msgstr "Alamat IP (%(count)s)"
msgid "IP address"
msgstr "Alamat IP"
msgid "IP address:"
msgstr "Alamat IP:"
msgid ""
"If an IP address is provided it must be a well-formed IPv4 or IPv6 address. "
"The system will\n"
" attempt to assign the provided IP address to the load balancer. If an IP "
"address is not provided\n"
" then one will be allocated for you."
msgstr ""
"Jika alamat IP diberikan, alamat IPv4 atau IPv6 yang terbentuk dengan baik. "
"Sistem akan\n"
"   mencoba menetapkan alamat IP yang diberikan ke load balancer. Jika alamat "
"IP tidak disediakan\n"
"   maka satu akan dialokasikan untuk Anda."
msgid ""
"If the listener uses the TERMINATED_HTTPS protocol, then one or more SSL "
"certificates must\n"
" be selected. The first certificate will be the default."
msgstr ""
"Jika pendengar menggunakan protokol TERMINATED_HTTPS, maka satu atau lebih "
"sertifikat SSL harus\n"
"   dipilih. Sertifikat pertama akan menjadi default."
msgid "Inactive"
msgstr "Inactive"
msgid "Interval (sec)"
msgstr "Interval (sec)"
msgid "Interval:"
msgstr "Interval:"
msgid "Key Manager API Guide: Creating a Certificate Container"
msgstr "Key Manager API Guide: Creating a Certificate Container"
msgid "Key Manager Service Command-Line Client"
msgstr "Key Manager Service Command-Line Client"
msgid ""
"LEAST_CONNECTIONS: Allocates requests to the instance with the least number "
"of active\n"
" connections."
msgstr ""
"LEAST_CONNECTIONS: Alokasikan permintaan ke instance dengan jumlah paling "
"sedikit koneksi aktif."
msgid "Least Connections"
msgstr "Least Connections (koneksi paling sedikit)"
#, python-format
msgid "Listener %(index)s"
msgstr "Pendengar %(index)s"
msgid "Listener 1"
msgstr "Listener 1"
msgid "Listener Details"
msgstr "Listener Details (rincian pendengar)"
msgid "Listener ID"
msgstr "Listener ID"
msgid "Listeners"
msgstr "Listeners (pendengar)"
#, python-format
msgid "Load Balancer %(index)s"
msgstr "Penyeimbang beban %(index)s"
msgid "Load Balancer Algorithm"
msgstr "Load Balancer Algorithm (algoritma penyeimbang beban)"
msgid "Load Balancer Details"
msgstr "Load Balancer Details (rincian beban penyeimbang)"
msgid "Load Balancer ID"
msgstr "Load Balancer ID (ID penyeimbang beban)"
msgid "Load Balancers"
msgstr "Load Balancers (penyeimbang beban)"
msgid "Loading"
msgstr "Loading (pemuatan)"
msgid "Max Retries"
msgstr "Max Retries (pengulangan terbanyak)"
msgid "Member ID"
msgstr "Member ID (ID anggota)"
msgid "Members"
msgstr "Members (anggota)"
msgid ""
"Members are the actual IP addresses that will receive traffic from the load "
"balancer. Each\n"
" member must have a unique combination of IP address and port."
msgstr ""
"Anggota adalah alamat IP yang sebenarnya yang akan menerima lalu lintas dari "
"penyeimbang beban. Setiap\n"
"   anggota harus memiliki kombinasi yang unik dari alamat IP dan port."
msgid "Method"
msgstr "Method"
msgid "Method:"
msgstr "Method:"
msgid "Monitor Details"
msgstr "Monitor Details (rincian pemantauan)"
msgid "Monitor ID"
msgstr "Monitor ID"
msgid "Monitor type"
msgstr "Monitor type"
msgid "Name"
msgstr "Name (nama)"
msgid "No available certificates"
msgstr "Tidak ada sertifikat yang tersedia"
msgid "No available instances"
msgstr "Tidak ada instance yang tersedia"
msgid "No items to display."
msgstr "Tidak ada item untuk ditampilkan."
msgid "No members have been allocated"
msgstr "Tidak ada anggota telah dialokasikan"
msgid "None"
msgstr "None (tidak ada)"
msgid "Offline"
msgstr "Offline"
msgid "Online"
msgstr "Online"
msgid "Operating Status"
msgstr "Operating Status (status operasi)"
msgid "Overview"
msgstr "Overview (ikhtisar)"
msgid "Pending Create"
msgstr "Pending Create (penundaan pembuatan)"
msgid "Pending Delete"
msgstr "Pending Delete (penundaan penghapusan)"
msgid "Pending Update"
msgstr "Pending Update (penundaan pembaharuan)"
msgid "Pool 1"
msgstr "Pool 1"
msgid "Pool Details"
msgstr "Pool Details (rincian kolam)"
msgid "Pool ID"
msgstr "Pool ID (ID kolam)"
msgid "Pool Members"
msgstr "Pool Members (anggota kolam)"
msgid "Pool member weight has been updated."
msgstr "Berat anggota kolam telah diperbarui."
msgid "Port"
msgstr "Port"
msgid "Port ID"
msgstr "Port ID (ID port)"
msgid "Port:"
msgstr "Port:"
msgid "Protocol"
msgstr "Protocol (protokol)"
msgid "Protocol Port"
msgstr "Protocol Port (port protokol)"
msgid "Protocol:"
msgstr "Protocol:"
msgid "Provide the details for the health monitor."
msgstr "Memberikan rincian untuk pemantauan kesehatan."
msgid "Provide the details for the listener."
msgstr "Memberikan rincian untuk pendengar."
msgid "Provide the details for the load balancer."
msgstr "Memberikan rincian untuk penyeimbang beban."
msgid "Provide the details for the pool."
msgstr "Memberikan rincian untuk kolam."
msgid "Provider"
msgstr "Provider (penyedia)"
msgid "Provisioning Status"
msgstr "Provisioning Status (status penyediaan)"
msgid "ROUND_ROBIN: Rotates requests evenly between multiple instances."
msgstr ""
"ROUND_ROBIN: Memutar permintaan secara merata di antara beberapa instance."
msgid "Remove"
msgstr "Remove (hilangkan)"
msgid "Retries"
msgstr "Retries"
msgid "Retries:"
msgstr "Retries:"
msgid "Round Robin"
msgstr "Round Robin"
msgid ""
"SOURCE_IP: Requests from a unique source IP address are consistently "
"directed to the same instance."
msgstr ""
"SOURCE_IP: Permintaan dari alamat IP sumber yang unik secara konsisten "
"diarahkan ke instance yang sama."
msgid "SSL Certificates"
msgstr "SSL Certificates (sertifikat SSL)"
msgid ""
"Select a floating IP address to associate with the load balancer or a "
"floating IP pool in which to allocate a new floating IP address."
msgstr ""
"Pilih alamat IP mengambang untuk mengasosiasikan dengan penyeimbang beban "
"atau pool IP mengambang yang mengalokasikan alamat IP mengambang baru."
msgid "Select certificates from the available certificates below"
msgstr "Pilih sertifikat dari sertifikat yang tersedia di bawah ini"
msgid "Select one or more SSL certificates for the listener."
msgstr "Pilih salah satu atau lebih sertifikat SSL untuk pendengar."
msgid "Session Persistence"
msgstr "Session Persistence"
msgid "Source IP"
msgstr "Source IP (IP sumber)"
msgid "Subnet"
msgstr "Subnet"
msgid "Subnet ID"
msgstr "Subnet ID (ID subnet)"
msgid "Subnet:"
msgstr "Subnet:"
msgid "Tenant ID"
msgstr "Tenant ID"
msgid ""
"The Available Instances table contains existing compute instances that can "
"be added as members\n"
" of the pool. Use the \"Add external member\" button to add a member not "
"found in the Available\n"
" Instances table."
msgstr ""
"Tabel Available Instance berisi instance komptasi yang ada dimana dapat "
"ditambahkan sebagai anggota\n"
"   kolam. Gunakan tombol \"Add external member\" untuk menambahkan anggota "
"yang tidak ditemukan di tabel \n"
"   Available Instance."
msgid "The HTTP method used to perform the health check."
msgstr "Metode HTTP yang digunakan untuk melakukan pemeriksaan kesehatan."
msgid "The IP address is not valid."
msgstr "Alamat IP tidak valid."
msgid ""
"The IP address of the member to receive traffic from the load balancer. Must "
"be a well-formed\n"
" IPv4 or IPv6 address."
msgstr ""
"Alamat IP anggota untuk menerima lalu lintas dari load balancer. Harus "
"terbentuk dengan baik\n"
"   Alamat IPv4 atau IPv6."
msgid "The URL path is not valid."
msgstr "Path URL tidak sah."
msgid ""
"The expected HTTP status codes to get from a successful health check. Must "
"be a single number,\n"
" a comma separated list of numbers, or a range (two numbers separated by a "
"hyphen)."
msgstr ""
"Kode status HTTP yang diharapkan untuk mendapatkan dari pemeriksaan "
"kesehatan yang sukses. Harus berupa angka tunggal,\n"
"   daftar angka yang dipisahkan koma, atau rentang (dua angka dipisahkan "
"oleh tanda hubung)."
msgid "The expected status code is not valid."
msgstr "Kode status yang diharapkan adalah tidak sah."
#, python-format
msgid "The following health monitor could not be deleted: %s."
msgstr "Pemantauan kesehatan berikut ini tidak bisa dihapus: %s."
#, python-format
msgid ""
"The following listeners could not be deleted, possibly due to existing "
"pools: %s."
msgstr ""
"Pendengar berikut ini tidak bisa dihapus, mungkin karena kolam yang ada: %s."
#, python-format
msgid "The following listeners will not be deleted due to existing pools: %s."
msgstr "Pendengar berikut tidak akan dihapus karena kolam yang ada: %s."
#, python-format
msgid "The following load balancers are pending and cannot be deleted: %s."
msgstr "Penyeimbang beban berikut yang tertunda dan tidak dapat dihapus: %s."
#, python-format
msgid ""
"The following load balancers could not be deleted, possibly due to existing "
"listeners: %s."
msgstr ""
"Penyeimbang beban berikut tidak dapat dihapus, mungkin karena pendengar yang "
"sedang ada: %s."
#, python-format
msgid "The following pool could not be deleted: %s."
msgstr "Kolam berikut ini tidak bisa dihapus: %s."
msgid "The health check interval must be greater than or equal to the timeout."
msgstr ""
"Interval pemeriksaan kesehatan harus lebih besar dari atau sama dengan batas "
"waktu."
msgid "The health monitor has been updated."
msgstr "Pemantauan kesehatan telah diperbarui."
msgid ""
"The health monitor is used to determine the health of your pool members. "
"Health checks\n"
" routinely run against each member within the pool and the result of the "
"health check is used\n"
" to determine if the member receives new connections. Each pool can only "
"have one health\n"
" monitor."
msgstr ""
"Pemantauan kesehatan digunakan untuk menentukan kesehatan anggota kolam "
"Anda. Pemeriksaan kesehatan\n"
"   secara rutin dijalankan terhadap setiap anggota dalam kolam dan hasil "
"dari pemeriksaan kesehatan digunakan\n"
"   untuk menentukan apakah anggota menerima sambungan baru. Setiap kolam "
"hanya dapat memiliki satu pemantauan kesehatan."
msgid ""
"The interval between health checks. Must be greater than or equal to the "
"timeout."
msgstr ""
"Interval antara pemeriksaan kesehatan. Harus lebih besar dari atau sama "
"dengan batas waktu."
msgid "The listener has been updated."
msgstr "Pendengar telah diperbarui."
msgid ""
"The load balancer algorithm that distributes traffic to the pool members."
msgstr ""
"Algoritma penyeimbang beban yang mendistribusikan lalu lintas ke anggota "
"pool."
msgid "The load balancer has been updated."
msgstr "Penyeimbang beban telah diperbarui."
msgid ""
"The load balancer occupies a neutron network port and has an IP address "
"assigned from a subnet."
msgstr ""
"Penyeimbang beban menempati port jaringan neutron dan memiliki alamat IP "
"yang ditetapkan dari subnet."
msgid "The max retry count must be a number between 1 and 10."
msgstr "Jumlah retry max harus dalam angka antara 1 dan 10."
msgid "The network on which to allocate the load balancer's IP address."
msgstr "Jaringan yang digunakan untuk mengalokasikan alamat IP load balancer."
msgid "The network which contains the IP address of the member."
msgstr "Jaringan yang berisi alamat IP anggota."
msgid ""
"The number of allowed connection failures before marking the member as "
"inactive. Must be a\n"
" number from 1 to 10."
msgstr ""
"Jumlah kegagalan sambungan yang diizinkan sebelum menandai anggota sebagai "
"tidak aktif. Harus menjadi\n"
"   angka dari 1 hingga 10."
msgid "The pool has been updated."
msgstr "Kolam telah diperbarui."
msgid "The pool members have been updated."
msgstr "Para anggota kolam telah diperbarui."
msgid "The port must be a number between 1 and 65535."
msgstr "Port harus dalam angka antara 1 dan 65535."
msgid ""
"The port must be unique among all listeners attached to this load balancer."
msgstr ""
"Port harus unik di antara semua pendengar yang terkait pada penyeimbang "
"beban ini."
msgid ""
"The port on which the front end listens. Must be an integer from 1 to 65535."
msgstr ""
"Port tempat front end mendengarkan. Harus berupa bilangan bulat dari 1 "
"hingga 65535."
msgid ""
"The port on which the member listens for traffic. Must be a number from 1 to "
"65535."
msgstr ""
"Port tempat anggota mendengarkan lalu lintas. Harus berupa angka dari 1 "
"hingga 65535."
msgid ""
"The protocol for which the front end listens. The TERMINATED_HTTPS protocol "
"is only available if\n"
" the key-manager service is enabled and you have authority to list "
"certificate containers and\n"
" secrets."
msgstr ""
"Protokol di mana front end mendengarkan. Protokol TERMINATED_HTTPS hanya "
"tersedia jika\n"
"   layanan key-manager diaktifkan dan Anda memiliki wewenang untuk "
"mendaftarkan kontainer sertifikat dan\n"
"   rahasia."
msgid ""
"The target of the health check HTTP request to the member. Must be a valid "
"URL path."
msgstr ""
"Target permintaan HTTP pemeriksaan kesehatan ke anggota. Harus berupa jalur "
"URL yang valid."
msgid ""
"The time after which a health check times out. Must be a number greater than "
"or equal to 0\n"
" and less than or equal to the interval."
msgstr ""
"Waktu setelah waktu pemeriksaan kesehatan habis. Harus berupa angka yang "
"lebih besar atau sama dengan 0\n"
"   dan kurang dari atau sama dengan interval."
msgid "The timeout must be a number greater than or equal to 0."
msgstr "Timeout harus berupa angka lebih besar dari atau sama dengan 0."
msgid "The weight must be a number between 1 and 256."
msgstr "Berat harus dalam angka antara 1 dan 256."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared\n"
" to the other members of the pool. A higher weight means it will receive "
"more traffic. Must be\n"
" a number from 1 to 256."
msgstr ""
"Bobot anggota menentukan porsi permintaan atau koneksi yang dibandingkan "
"dengan layanannya\n"
"   ke anggota kolam lainnya. Bobot yang lebih tinggi berarti akan menerima "
"lebih banyak lalu lintas. Harus\n"
"   angka dari 1 hingga 256."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared to the other members of the pool."
msgstr ""
"Berat anggota menentukan porsi dari permintaan atau koneksi layanan IT "
"dibandingkan dengan anggota lain dari kolam."
msgid "Timeout"
msgstr "Timeout (waktu habis)"
msgid "Timeout (sec)"
msgstr "Timeout (sec)"
msgid "Timeout:"
msgstr "Timeout:"
msgid "Type"
msgstr "Type (tipe)"
msgid "URL Path"
msgstr "URL Path"
msgid "URL path"
msgstr "Path URL"
msgid "URL path:"
msgstr "URL path:"
msgid "Unable to create health monitor."
msgstr "Tidak dapat membuat pemantauan kesehatan."
msgid "Unable to create listener."
msgstr "Tidak dapat membuat pendengar."
msgid "Unable to create load balancer."
msgstr "Tidak dapat membuat penyeimbang beban."
msgid "Unable to create pool."
msgstr "Tidak dapat membuat kolam."
msgid "Unable to delete health monitor."
msgstr "Tidak dapat menghapus pemantauan kesehatan."
msgid "Unable to delete listener."
msgstr "Tidak dapat menghapus pendengar."
msgid "Unable to delete load balancer."
msgstr "Tidak dapat menghapus penyeimbang beban."
msgid "Unable to delete pool."
msgstr "Tidak dapat menghapus kolam."
#, python-format
msgid "Unable to disassociate floating IP address from load balancer: %s."
msgstr ""
"Tidak dapat memisahkan alamat IP mengambang dari penyeimbang beban: %s."
msgid "Unable to retrieve SSL certificates."
msgstr "Tidak dapat mengambil sertifikat SSL."
msgid "Unable to retrieve health monitor."
msgstr "Tidak dapat mengambil pemantauan kesehatan."
msgid "Unable to retrieve listener."
msgstr "Tidak dapat mengambil pendengar."
msgid "Unable to retrieve listeners."
msgstr "Tidak dapat mengambil pendengar."
msgid "Unable to retrieve load balancer status tree."
msgstr "Tidak dapat mengambil status pohon penyeimbang beban."
msgid "Unable to retrieve load balancer."
msgstr "Tidak dapat mengambil penyeimbang beban."
msgid "Unable to retrieve load balancers."
msgstr "Tidak dapat mengambil penyeimbang beban."
msgid "Unable to retrieve member."
msgstr "Tidak dapat mengambil anggota."
msgid "Unable to retrieve members."
msgstr "Tidak dapat mengambil anggota."
msgid "Unable to retrieve pool."
msgstr "Tidak dapat mengambil kolam (pool)."
msgid "Unable to retrieve secrets."
msgstr "Tidak dapat mengambil rahasia."
msgid "Unable to update health monitor."
msgstr "Tidak dapat memperbarui pemantauan kesehatan."
msgid "Unable to update listener."
msgstr "Tidak dapat memperbarui pendengar."
msgid "Unable to update load balancer."
msgstr "Tidak dapat memperbarui penyeimbang beban."
msgid "Unable to update member list."
msgstr "Tidak dapat memperbarui daftar anggota."
msgid "Unable to update member."
msgstr "Tidak dapat memperbarui anggota."
msgid "Unable to update pool."
msgstr "Tidak dapat memperbarui kolam."
msgid "Update"
msgstr "Update (perbarui)"
msgid "Update Health Monitor"
msgstr "Update Health Monitor (perbaharui pemantauan kesehatan)"
msgid "Update Listener"
msgstr "Update Listener (perbarui pendengar)"
msgid "Update Load Balancer"
msgstr "Update Load Balancer (perbarui penyeimbang beban)"
msgid "Update Member Weight"
msgstr "Update Member Weight"
msgid "Update Pool"
msgstr "Update Pool (perbarui kolam)"
msgid "Update Weight"
msgstr "Update Weight (perbarui berat)"
msgid ""
"Use the key-manager service to create any certificate containers before "
"creating the listener.\n"
" The following documentation provides information on how to create a "
"certificate container:"
msgstr ""
"Gunakan layanan key-manager untuk membuat kontainer sertifikat apa pun "
"sebelum membuat listener.\n"
"   Dokumentasi berikut menyediakan informasi tentang cara membuat kontainer "
"sertifikat:"
msgid "Weight"
msgstr "Weight (berat)"
msgid "Weight:"
msgstr "Weight:"
#, python-format
msgid ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
msgstr ""
"Anda akan memisahkan alamat IP mengambang dari penyeimbang beban \"%s\". "
"Silahkan konfirmasi."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
msgstr ""
"Anda telah memilih \"%s\". Harap mengkonfirmasi pilihan Anda. Pemantauan "
"kesehatan yang telah dihapus tidak dapat dipulihkan."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted listeners "
"are not recoverable."
msgstr ""
"Anda telah memilih \"%s\". Harap mengkonfirmasi pilihan Anda. Pendengar yang "
"telah dihapus tidak dapat dipulihkan."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
msgstr ""
"Anda telah memilih \"%s\". Harap mengkonfirmasi pilihan Anda. Penyeimbang "
"beban yang telah dihapus tidak dapat dipulihkan."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."
msgstr ""
"Anda telah memilih \"%s\". Harap mengkonfirmasi pilihan Anda. Kolam yang "
"telah dihapus tidak dapat dipulihkan."

View File

@ -1,18 +0,0 @@
# Yusuke Higashino <yusuke_higashino@adoc.co.jp>, 2016. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard 3.0.1.dev6\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2017-09-28 01:36+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-21 01:20+0000\n"
"Last-Translator: Yusuke Higashino <yusuke_higashino@adoc.co.jp>\n"
"Language-Team: Japanese\n"
"Language: ja\n"
"X-Generator: Zanata 3.9.6\n"
"Plural-Forms: nplurals=1; plural=0\n"
msgid "Load Balancers"
msgstr "ロードバランサー"

View File

@ -1,896 +0,0 @@
# Yukinori Yagisawa <yukky37@gmail.com>, 2016. #zanata
# Yusuke Higashino <yusuke_higashino@adoc.co.jp>, 2016. #zanata
# Kyohei Moriyama <flogofrein@gmail.com>, 2017. #zanata
# Yuko Katabami <yukokatabami@gmail.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-08-25 00:47+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-09-13 08:10+0000\n"
"Last-Translator: Yukinori Yagisawa <yukky37@gmail.com>\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 "%(ip)s..."
msgstr "%(ip)s..."
msgid "A new health monitor is being created."
msgstr "新しいヘルスモニターは作成中です。"
msgid "A new listener is being created."
msgstr "新しいリスナーは作成中です。"
msgid "A new load balancer is being created."
msgstr "新しいロードバランサーが作成されました。"
msgid "A new pool is being created."
msgstr "新しいプールが作成されました。"
msgid ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgstr "プールは負荷分散が適用されるメンバーのグループを表します。"
msgid "Actions"
msgstr "アクション"
msgid "Active"
msgstr "稼働中"
msgid "Add"
msgstr "追加"
msgid "Add external member"
msgstr "メンバーの追加"
msgid "Add members to the load balancer pool."
msgstr "ロードバランサーにメンバーを追加します。"
msgid "Add/Remove Pool Members"
msgstr "プールメンバーの追加・削除"
msgid "Address"
msgstr "アドレス"
msgid "Admin State Up"
msgstr "管理状態有効"
msgid "Allocated Members"
msgstr "割り当て済みのメンバー"
msgid "An error occurred. Please try again later."
msgstr "エラーが発生しました。後からもう一度お試しください。"
msgid "Associate"
msgstr "割り当て"
msgid "Associate Floating IP"
msgstr "Floating IP の割り当て"
msgid "Associate Floating IP Address"
msgstr "Floating IP アドレス の割り当て"
msgid "Associating floating IP with load balancer."
msgstr "ロードバランサーのFloating IP アドレスの割り当て"
msgid "Available Instances"
msgstr "有効なインスタンス"
msgid "Back"
msgstr "戻る"
msgid "Cancel"
msgstr "取り消し"
msgid "Certificate Name"
msgstr "証明書名"
msgid "Confirm Delete Health Monitor"
msgstr "ヘルスモニターの削除の確認"
msgid "Confirm Delete Listeners"
msgstr "リスナーの削除の確認"
msgid "Confirm Delete Load Balancers"
msgstr "ロードバランサーの削除確認"
msgid "Confirm Delete Pool"
msgstr "プールの削除確認"
msgid "Confirm Disassociate Floating IP Address"
msgstr "Floating IP アドレスの割り当てを解除確認"
msgid "Connection Limit"
msgstr "最大接続数"
msgid "Create Health Monitor"
msgstr "ヘルスモニターの作成"
msgid "Create Listener"
msgstr "リスナーの作成"
msgid "Create Load Balancer"
msgstr "ロードバランサーの作成"
msgid "Create Pool"
msgstr "プールの作成"
msgid "Default Pool ID"
msgstr "デフォルトプール ID"
msgid "Degraded"
msgstr "縮退中"
msgid "Delay"
msgstr "遅延"
msgid "Delete Health Monitor"
msgstr "ヘルスモニター削除"
msgid "Delete Listener"
msgstr "リスナーの削除"
msgid "Delete Listeners"
msgstr "リスナーの削除"
msgid "Delete Load Balancer"
msgstr "ロードバランサーの削除"
msgid "Delete Load Balancers"
msgstr "ロードバランサーの削除"
msgid "Delete Pool"
msgstr "プールの削除"
#, python-format
msgid "Deleted health monitor: %s."
msgstr "ヘルスモニター %s を削除しました。"
#, python-format
msgid "Deleted listeners: %s."
msgstr "リスナーを削除しました: %s。"
#, python-format
msgid "Deleted load balancers: %s."
msgstr "ロードバランサーが削除されました:%s。"
#, python-format
msgid "Deleted pool: %s."
msgstr "プールを削除しました:%s。"
msgid "Description"
msgstr "説明"
msgid "Disassociate"
msgstr "割り当て解除"
msgid "Disassociate Floating IP"
msgstr "Floating IP の割り当て解除"
#, python-format
msgid "Disassociated floating IP address from load balancer: %s."
msgstr "ロードバランサー:%sからFloating IP アドレスの割り当てを解除しました。"
msgid ""
"Each port that listens for traffic on a particular load balancer is "
"configured separately and\n"
" tied to the load balancer. Multiple listeners can be associated with the "
"same load balancer but\n"
" each must use a unique port."
msgstr ""
"あるロードバランサーでトラフィックをリッスンするポート番号は、個別に設定し"
"て、ロードバランサーに関連付けできます。\n"
" 同じロードバランサーに複数のリスナーを関連付けできますが、\n"
" それぞれが一意のポートを使用しなければいけません。"
msgid "Edit"
msgstr "編集"
msgid "Edit Pool"
msgstr "プールの編集"
msgid "Error"
msgstr "エラー"
msgid "Expected Codes"
msgstr "コードの期待値"
msgid "Expected status codes"
msgstr "ステータスコードの期待値"
msgid "Expected status codes:"
msgstr "ステータスコードの期待値:"
msgid "Expiration Date"
msgstr "有効期限 (日付)"
msgid "Floating IP Address"
msgstr "Floating IP アドレス"
msgid "Floating IP addresses"
msgstr "Floating IP アドレス"
msgid "Floating IP pools"
msgstr "Floating IP プール"
msgid "HTTP Method"
msgstr "HTTP メソッド"
msgid "HTTP method"
msgstr "HTTP メソッド"
msgid "HTTP method:"
msgstr "HTTP メソッド:"
msgid "Health Monitor ID"
msgstr "ヘルスモニター ID"
msgid "ID"
msgstr "ID"
msgid "IP Address"
msgstr "IP アドレス"
#, python-format
msgid "IP Addresses (%(count)s)"
msgstr "IP アドレス(%(count)s)"
msgid "IP address"
msgstr "IP アドレス"
msgid "IP address:"
msgstr "IP アドレス:"
msgid ""
"If an IP address is provided it must be a well-formed IPv4 or IPv6 address. "
"The system will\n"
" attempt to assign the provided IP address to the load balancer. If an IP "
"address is not provided\n"
" then one will be allocated for you."
msgstr ""
"IP アドレスを指定する場合には、正しい形式の IPv4 または IPv6 アドレスを使用す"
"る必要があります。\n"
" システムは、指定された IP アドレスをロードバランサーに割り当てるように試み"
"ます。IP アドレスが指定されていない場合には、\n"
" システムによって確保されます。"
msgid ""
"If the listener uses the TERMINATED_HTTPS protocol, then one or more SSL "
"certificates must\n"
" be selected. The first certificate will be the default."
msgstr ""
"リスナーが TERMINATED_HTTPS プロトコルを使用する場合には、SSL 証明書を1 つま"
"たは複数選択する必要があります。\n"
" 最初の証明書がデフォルトとなります。"
msgid "Inactive"
msgstr "非稼働"
msgid "Interval (sec)"
msgstr "間隔 (秒)"
msgid "Interval:"
msgstr "間隔:"
msgid "Key Manager API Guide: Creating a Certificate Container"
msgstr "Key Manager API Guide: Creating a Certificate Container"
msgid "Key Manager Service Command-Line Client"
msgstr "Key Manager サービスのコマンドラインクライアント"
msgid ""
"LEAST_CONNECTIONS: Allocates requests to the instance with the least number "
"of active\n"
" connections."
msgstr ""
"最小接続数: アクティブな接続数が最も少ないメンバーにリクエストを割り当てま"
"す。"
msgid "Least Connections"
msgstr "最小接続数"
#, python-format
msgid "Listener %(index)s"
msgstr "リスナー %(index)s"
msgid "Listener 1"
msgstr "リスナー 1"
msgid "Listener Details"
msgstr "リスナーの詳細"
msgid "Listener ID"
msgstr "リスナーID"
msgid "Listeners"
msgstr "リスナー"
#, python-format
msgid "Load Balancer %(index)s"
msgstr "ロードバランサー %(index)s"
msgid "Load Balancer Algorithm"
msgstr "ロードバランサーアルゴリズム"
msgid "Load Balancer Details"
msgstr "ロードバランサーの詳細"
msgid "Load Balancer ID"
msgstr "ロードバランサーID"
msgid "Load Balancers"
msgstr "ロードバランサー"
msgid "Loading"
msgstr "読み込み中"
msgid "Max Retries"
msgstr "最大試行回数"
msgid "Member ID"
msgstr "メンバー ID"
msgid "Members"
msgstr "メンバー"
msgid ""
"Members are the actual IP addresses that will receive traffic from the load "
"balancer. Each\n"
" member must have a unique combination of IP address and port."
msgstr ""
"メンバーは、ロードバランサーからのトラフィックを受信する実際の IP アドレスで"
"す。\n"
"メンバーには、IP アドレスとポートの一意の組み合わせが必要です。"
msgid "Method"
msgstr "メソッド"
msgid "Method:"
msgstr "メソッド:"
msgid "Monitor Details"
msgstr "モニターの詳細"
msgid "Monitor ID"
msgstr "モニター ID"
msgid "Monitor type"
msgstr "モニタータイプ"
msgid "Name"
msgstr "名前"
msgid "No available certificates"
msgstr "利用可能な証明書がありません"
msgid "No available instances"
msgstr "有効なインスタンスがありません"
msgid "No items to display."
msgstr "表示する項目がありません"
msgid "No members have been allocated"
msgstr "メンバーが割り当てられていません。"
msgid "None"
msgstr "なし"
msgid "Offline"
msgstr "オフライン"
msgid "Online"
msgstr "オンライン"
msgid "Operating Status"
msgstr "動作状態"
msgid "Overview"
msgstr "概要"
msgid "Pending Create"
msgstr "作成待ち"
msgid "Pending Delete"
msgstr "削除待ち"
msgid "Pending Update"
msgstr "更新待ち"
msgid "Pool 1"
msgstr "プール 1"
msgid "Pool Details"
msgstr "プールの詳細"
msgid "Pool ID"
msgstr "プール ID"
msgid "Pool Members"
msgstr "プールメンバー"
msgid "Pool member weight has been updated."
msgstr "プールメンバーのウェイトが更新されました。"
msgid "Port"
msgstr "ポート"
msgid "Port ID"
msgstr "ポート ID"
msgid "Port:"
msgstr "ポート:"
msgid "Protocol"
msgstr "プロトコル"
msgid "Protocol Port"
msgstr "ポート番号"
msgid "Protocol:"
msgstr "プロトコル:"
msgid "Provide the details for the health monitor."
msgstr "ヘルスモニターの詳細を設定してください。"
msgid "Provide the details for the listener."
msgstr "リスナーの詳細を設定してください。"
msgid "Provide the details for the load balancer."
msgstr "ロードバランサーの詳細を設定してください。"
msgid "Provide the details for the pool."
msgstr "プールの詳細を設定してください"
msgid "Provider"
msgstr "プロバイダー"
msgid "Provisioning Status"
msgstr "プロビジョニング状態"
msgid "ROUND_ROBIN: Rotates requests evenly between multiple instances."
msgstr "ラウンドロビン: リクエストを複数のメンバーで順番に均等に割り当てます。"
msgid "Remove"
msgstr "削除"
msgid "Retries"
msgstr "最大試行回数"
msgid "Retries:"
msgstr "再試行回数:"
msgid "Round Robin"
msgstr "ラウンドロビン"
msgid ""
"SOURCE_IP: Requests from a unique source IP address are consistently "
"directed to the same instance."
msgstr ""
"送信元 IP: 同じ送信元 IP アドレスからのリクエストは同じメンバーに転送されま"
"す。"
msgid "SSL Certificates"
msgstr "SSL 証明書"
msgid ""
"Select a floating IP address to associate with the load balancer or a "
"floating IP pool in which to allocate a new floating IP address."
msgstr ""
"ロードバランサを設定するためにフローティングIPアドレス、もしくは、新しいフ"
"ローティングIPアドレス配置するためのフローティングIPアドレスプールを選択して"
"ください"
msgid "Select certificates from the available certificates below"
msgstr "以下の一覧から証明書を選択してください"
msgid "Select one or more SSL certificates for the listener."
msgstr "SSL 証明書を 1 つ以上選択してください"
msgid "Session Persistence"
msgstr "セッション永続性"
msgid "Source IP"
msgstr "送信元 IP"
msgid "Subnet"
msgstr "サブネット"
msgid "Subnet ID"
msgstr "サブネット ID"
msgid "Subnet:"
msgstr "サブネット:"
msgid "Tenant ID"
msgstr "テナント ID"
msgid ""
"The Available Instances table contains existing compute instances that can "
"be added as members\n"
" of the pool. Use the \"Add external member\" button to add a member not "
"found in the Available\n"
" Instances table."
msgstr ""
"利用可能なインスタンスの表には、プールのメンバーとして追加可能な既存のコン"
"ピュートインスタンスが含まれます。\n"
" 利用可能なインスタンスの表にないメンバーを追加するには、\n"
" 「メンバーの追加」ボタンを使用します。"
msgid "The HTTP method used to perform the health check."
msgstr "ヘルスチェックの実行に使用される HTTP メソッドです。"
msgid "The IP address is not valid."
msgstr "IP アドレスが無効です。"
msgid ""
"The IP address of the member to receive traffic from the load balancer. Must "
"be a well-formed\n"
" IPv4 or IPv6 address."
msgstr ""
"ロードバランサーからトラフィックを受信するメンバーの IP アドレス。\n"
" 正しい形式の IPv4 または IPv6 アドレスでなければいけません。"
msgid "The URL path is not valid."
msgstr "URL は有効ではありません。"
msgid ""
"The expected HTTP status codes to get from a successful health check. Must "
"be a single number,\n"
" a comma separated list of numbers, or a range (two numbers separated by a "
"hyphen)."
msgstr ""
"ヘルスチェックが成功した場合の HTTP ステータスコードの期待値。\n"
" 単一の値、複数の値のコンマ区切りリスト、範囲 (ハイフンで区切られた 2 つの"
"値) のいずれかにする必要があります。"
msgid "The expected status code is not valid."
msgstr "ステータスコードの期待値が有効ではありません。"
#, python-format
msgid "The following health monitor could not be deleted: %s."
msgstr "以下のヘルスモニターは削除できません: %s。"
#, python-format
msgid ""
"The following listeners could not be deleted, possibly due to existing "
"pools: %s."
msgstr "以下のリスナーはおそらくプールがあるため削除できませんでした: %s。"
#, python-format
msgid "The following listeners will not be deleted due to existing pools: %s."
msgstr "以下のリスナーはプールがあるため削除できません: %s。"
#, python-format
msgid "The following load balancers are pending and cannot be deleted: %s."
msgstr "以下のロードバランサーは待機状態のため削除することができません:%s"
#, python-format
msgid ""
"The following load balancers could not be deleted, possibly due to existing "
"listeners: %s."
msgstr ""
"以下のロードバランサーはおそらくリスナーがあるため削除することができません:"
"%s。"
#, python-format
msgid "The following pool could not be deleted: %s."
msgstr "以下のプールは削除できませんでした: %s。"
msgid "The health check interval must be greater than or equal to the timeout."
msgstr "ヘルスチェックの間隔はタイムアウト値以上でなければいけません。"
msgid "The health monitor has been updated."
msgstr "ヘルスモニターが更新されました。"
msgid ""
"The health monitor is used to determine the health of your pool members. "
"Health checks\n"
" routinely run against each member within the pool and the result of the "
"health check is used\n"
" to determine if the member receives new connections. Each pool can only "
"have one health\n"
" monitor."
msgstr ""
"ヘルスモニターは、プールメンバーの正常性の確認に使用されます。\n"
" ヘルスチェックは、プール内の各メンバーに対して定期的に実行され、ヘルス"
"チェックの結果は、\n"
" そのメンバーが新規接続を受けるかどうかの決定に使用されます。\n"
" 1 つのプールで使用できるヘルスモニターは 1 つのみです。"
msgid ""
"The interval between health checks. Must be greater than or equal to the "
"timeout."
msgstr "ヘルスチェックの間隔はタイムアウト値以上でなければいけません。"
msgid "The listener has been updated."
msgstr "リスナーが更新されました。"
msgid ""
"The load balancer algorithm that distributes traffic to the pool members."
msgstr "トラフィックをプールメンバーに分配するロードバランサーのアルゴリズム。"
msgid "The load balancer has been updated."
msgstr "ロードバランサーが更新されました。"
msgid ""
"The load balancer occupies a neutron network port and has an IP address "
"assigned from a subnet."
msgstr ""
"ロードバランサーは neutron のネットワークポートを所有し、サブネットから割り当"
"てられた IP アドレスを持ちます。"
msgid "The max retry count must be a number between 1 and 10."
msgstr "最大試行回数は 1 10 の数字でなければいけません。"
msgid "The network on which to allocate the load balancer's IP address."
msgstr "ロードバランサーの IP アドレスを割り当てるネットワーク"
msgid "The network which contains the IP address of the member."
msgstr "メンバーの IP アドレスを含むネットワーク。"
msgid ""
"The number of allowed connection failures before marking the member as "
"inactive. Must be a\n"
" number from 1 to 10."
msgstr ""
"メンバーが無効になるまで許容可能な接続エラー回数。\n"
" 1 から 10 までの数字でなければいけません。"
msgid "The pool has been updated."
msgstr "プールが更新されました。"
msgid "The pool members have been updated."
msgstr "プールメンバーが更新されました。"
msgid "The port must be a number between 1 and 65535."
msgstr "ポートは 1 65535 の数字でなければいけません。"
msgid ""
"The port must be unique among all listeners attached to this load balancer."
msgstr ""
"ポートは、このロードバランサーにアタッチされた全リスナーの間で、一意でなけれ"
"ばいけません。"
msgid ""
"The port on which the front end listens. Must be an integer from 1 to 65535."
msgstr ""
"フロントエンドがリッスンするポート。1 から 65535 までの整数でなければいけませ"
"ん。"
msgid ""
"The port on which the member listens for traffic. Must be a number from 1 to "
"65535."
msgstr ""
"メンバーがトラフィックをリッスンするポート。1 から 65535 までの数字でなければ"
"いけません。"
msgid ""
"The protocol for which the front end listens. The TERMINATED_HTTPS protocol "
"is only available if\n"
" the key-manager service is enabled and you have authority to list "
"certificate containers and\n"
" secrets."
msgstr ""
"フロントエンドがリッスンするプロトコル。TERMINATED_HTTPS プロトコルは、key-"
"manager サービスが有効化されており、\n"
" 証明書のコンテナーとシークレットを一覧表示する権限がある場合にのみ\n"
" 利用可能です。"
msgid ""
"The target of the health check HTTP request to the member. Must be a valid "
"URL path."
msgstr ""
"メンバーに対するヘルスチェックの HTTP リクエストのターゲット。有効な URL パス"
"でなければいけません。"
msgid ""
"The time after which a health check times out. Must be a number greater than "
"or equal to 0\n"
" and less than or equal to the interval."
msgstr ""
"ヘルスチェックがタイムアウトになる時間。\n"
" 0 以上の数字でなければいけません。"
msgid "The timeout must be a number greater than or equal to 0."
msgstr "タイムアウトの値 は 0 以上でなければいけません。"
msgid "The weight must be a number between 1 and 256."
msgstr "ウェイトは1256までとなっています。"
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared\n"
" to the other members of the pool. A higher weight means it will receive "
"more traffic. Must be\n"
" a number from 1 to 256."
msgstr ""
"メンバーの重みによって、そのメンバーが処理するリクエストまたは接続の割合 "
"(プールの他のメンバーに対する割合) が決定されます。\n"
" 重みが高いと、より多くのトラフィックを受信することになります。\n"
" 1 から 256 までの数字でなければいけません。"
msgid "Timeout"
msgstr "タイムアウト"
msgid "Timeout (sec)"
msgstr "タイムアウト (秒)"
msgid "Timeout:"
msgstr "タイムアウト:"
msgid "Type"
msgstr "種別"
msgid "URL Path"
msgstr "URL パス"
msgid "URL path"
msgstr "URL パス"
msgid "URL path:"
msgstr "URL パス:"
msgid "Unable to create health monitor."
msgstr "ヘルスモニターを作成できません。"
msgid "Unable to create listener."
msgstr "リスナーの作成ができません。"
msgid "Unable to create load balancer."
msgstr "ロードバランサーの作成ができません。"
msgid "Unable to create pool."
msgstr "プールの作成ができません。"
msgid "Unable to delete health monitor."
msgstr "ヘルスモニターを削除できません。"
msgid "Unable to delete listener."
msgstr "リスナーの削除ができません。"
msgid "Unable to delete load balancer."
msgstr "ロードバランサーの削除ができません。"
msgid "Unable to delete pool."
msgstr "プールの削除ができません。"
#, python-format
msgid "Unable to disassociate floating IP address from load balancer: %s."
msgstr ""
"ロードバランサー:%sからFloating IP アドレスの割り当て解除ができません。"
msgid "Unable to retrieve SSL certificates."
msgstr "SSL認証の取得ができません。"
msgid "Unable to retrieve health monitor."
msgstr "ヘルスモニターを取得できません。"
msgid "Unable to retrieve listener."
msgstr "リスナーの取得ができません。"
msgid "Unable to retrieve listeners."
msgstr "リスター一覧の取得ができません。"
msgid "Unable to retrieve load balancer status tree."
msgstr "ロードバランサのステータスツリーを取得できません"
msgid "Unable to retrieve load balancer."
msgstr "ロードバランサーの取得ができません。"
msgid "Unable to retrieve load balancers."
msgstr "ロードバランサー一覧の取得ができません。"
msgid "Unable to retrieve member."
msgstr "メンバーの取得ができません。"
msgid "Unable to retrieve members."
msgstr "メンバー一覧の取得ができません。"
msgid "Unable to retrieve pool."
msgstr "プールの取得できません。"
msgid "Unable to retrieve secrets."
msgstr "事前共通鍵の取得ができません。"
msgid "Unable to update health monitor."
msgstr "ヘルスモニターを更新できません。"
msgid "Unable to update listener."
msgstr "リスナーの更新ができません。"
msgid "Unable to update load balancer."
msgstr "ロードバランサーの更新ができません。"
msgid "Unable to update member list."
msgstr "メンバーの一覧を更新できません。"
msgid "Unable to update member."
msgstr "メンバーを更新できません。"
msgid "Unable to update pool."
msgstr "プールの更新ができません。"
msgid "Update"
msgstr "更新"
msgid "Update Health Monitor"
msgstr "ヘルスモニターの更新"
msgid "Update Listener"
msgstr "リスナーの更新"
msgid "Update Load Balancer"
msgstr "ロードバランサーの更新"
msgid "Update Member Weight"
msgstr "メンバーウェイトの更新"
msgid "Update Pool"
msgstr "プールの更新"
msgid "Update Weight"
msgstr "ウェイトの更新"
msgid ""
"Use the key-manager service to create any certificate containers before "
"creating the listener.\n"
" The following documentation provides information on how to create a "
"certificate container:"
msgstr ""
"リスナーを作成する前に key-manager サービスを使用して証明書のコンテナーを作成"
"します。\n"
" 以下のドキュメントには、証明書のコンテナーの作成に関する情報が記載されてい"
"ます。"
msgid "Weight"
msgstr "ウェイト"
msgid "Weight:"
msgstr "重み:"
#, python-format
msgid ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
msgstr ""
"あなたはロードバランサー\"%s\"からFloating IP アドレスの割り当てを解除しよう"
"としています。確認してください。"
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
msgstr ""
"\"%s\" を選択しました。選択内容を確認してください。削除されたヘルスモニターは"
"元に戻せません。"
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted listeners "
"are not recoverable."
msgstr ""
"\"%s\" を選択しました。選択内容を確認してください。削除されたリスナーは元に戻"
"せません。"
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
msgstr ""
"\"%s\" を選択しました。選択内容を確認してください。削除されたロードバランサー"
"は元に戻せません。"
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."
msgstr ""
"\"%s\" を選択しました。選択内容を確認してください。削除されたプールは元に戻せ"
"ません。"

View File

@ -1,18 +0,0 @@
# ByungYeol Woo <wby1089@gmail.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-04-23 09:10+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-05-01 10:55+0000\n"
"Last-Translator: ByungYeol Woo <wby1089@gmail.com>\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 "Neutron Load Balancers"
msgstr "Neutron 로드 밸런서"

View File

@ -1,898 +0,0 @@
# ByungYeol Woo <wby1089@gmail.com>, 2017. #zanata
# Eunseop Shin <kairos9603@khu.ac.kr>, 2017. #zanata
# Hyeunjee Kim <beyond.torvalds@gmail.com>, 2017. #zanata
# Sungjin Kang <gang.sungjin@gmail.com>, 2017. #zanata
# youngwoo Kim <koain@naver.com>, 2017. #zanata
# ByungYeol Woo <wby1089@gmail.com>, 2018. #zanata
# Soonyeul Park <ardentpark@gmail.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-09-21 03:22+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-09-22 08:01+0000\n"
"Last-Translator: Soonyeul Park <ardentpark@gmail.com>\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"
#, python-format
msgid "%(ip)s..."
msgstr "%(ip)s..."
msgid "A new health monitor is being created."
msgstr "새로운 상태 모니터를 생성하고 있습니다."
msgid "A new listener is being created."
msgstr "새로운 리스너가 생성되고 있습니다."
msgid "A new load balancer is being created."
msgstr "새 로드 밸런서가 생성되고 있습니다."
msgid "A new pool is being created."
msgstr "새로운 풀이 생성되고 있습니다."
msgid ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgstr "풀은 로드 밸런싱이 적용될 멤버들의 그룹을 나타냅니다."
msgid "Actions"
msgstr "작업"
msgid "Active"
msgstr "활성"
msgid "Add"
msgstr "추가"
msgid "Add external member"
msgstr "외부 멤버 추가"
msgid "Add members to the load balancer pool."
msgstr "로드 밸런서 풀에 멤버를 추가합니다."
msgid "Add/Remove Pool Members"
msgstr "풀 맴버 추가/삭제"
msgid "Address"
msgstr "주소"
msgid "Admin State Up"
msgstr "관리 업 상태"
msgid "Allocated Members"
msgstr "할당된 멤버"
msgid "An error occurred. Please try again later."
msgstr "오류가 발생했습니다. 나중에 다시 시도하십시오."
msgid "Associate"
msgstr "연결"
msgid "Associate Floating IP"
msgstr "유동 IP 연결"
msgid "Associate Floating IP Address"
msgstr "유동 IP 주소와 연결"
msgid "Associating floating IP with load balancer."
msgstr "유동 IP와 로드 밸런서 연결"
msgid "Available Instances"
msgstr "가용 인스턴스"
msgid "Back"
msgstr "뒤로"
msgid "Cancel"
msgstr "취소"
msgid "Certificate Name"
msgstr "인증서 이름"
msgid "Confirm Delete Health Monitor"
msgstr "상태 모니터 삭제 확인"
msgid "Confirm Delete Listeners"
msgstr "리스너 삭제 확인"
msgid "Confirm Delete Load Balancers"
msgstr "로드 밸런서 삭제 확인"
msgid "Confirm Delete Pool"
msgstr "풀 삭제 확인"
msgid "Confirm Disassociate Floating IP Address"
msgstr "유동 IP 주소 연결 해제 확인"
msgid "Connection Limit"
msgstr "연결 제한"
msgid "Create Health Monitor"
msgstr "상태 모니터 생성"
msgid "Create Listener"
msgstr "리스너 생성"
msgid "Create Load Balancer"
msgstr "로드 밸런서 생성"
msgid "Create Pool"
msgstr "풀 생성"
msgid "Default Pool ID"
msgstr "기본 풀 ID"
msgid "Degraded"
msgstr "기능이 만료됨"
msgid "Delay"
msgstr "지연"
msgid "Delete Health Monitor"
msgstr "상태 모니터 삭제"
msgid "Delete Listener"
msgstr "리스너 삭제"
msgid "Delete Listeners"
msgstr "리스너 삭제"
msgid "Delete Load Balancer"
msgstr "로드 밸런서 삭제"
msgid "Delete Load Balancers"
msgstr "로드 밸런서 삭제"
msgid "Delete Pool"
msgstr "풀 삭제"
#, python-format
msgid "Deleted health monitor: %s."
msgstr "상태 모니터 %s를 삭제하였습니다."
#, python-format
msgid "Deleted listeners: %s."
msgstr "삭제된 리스너 : %s."
#, python-format
msgid "Deleted load balancers: %s."
msgstr "삭제된 로드 밸런서: %s."
#, python-format
msgid "Deleted pool: %s."
msgstr "삭제된 풀: %s."
msgid "Description"
msgstr "설명"
msgid "Disassociate"
msgstr "연결 해제"
msgid "Disassociate Floating IP"
msgstr "유동 IP 연결 해제"
#, python-format
msgid "Disassociated floating IP address from load balancer: %s."
msgstr "다음 로드 밸런서에서 유동 IP 주소가 연결 해제됨: %s."
msgid ""
"Each port that listens for traffic on a particular load balancer is "
"configured separately and\n"
" tied to the load balancer. Multiple listeners can be associated with the "
"same load balancer but\n"
" each must use a unique port."
msgstr ""
"특정 로드 밸런서에서 발생하는 트래픽을 위한 리스너의 각 포트는 별도로 설정되"
"어야 하고\n"
" 로드 밸런서에 연결되어야 합니다. 여러 리스너는 같은 로드 밸런서에 연결되 "
"수 있지만\n"
" 각각 유일한 포트를 사용해야 합니다."
msgid "Edit"
msgstr "편집"
msgid "Edit Pool"
msgstr "풀 편집"
msgid "Error"
msgstr "오류"
msgid "Expected Codes"
msgstr "예상 코드"
msgid "Expected status codes"
msgstr "예상 상태 코드"
msgid "Expected status codes:"
msgstr "예상된 상태 코드:"
msgid "Expiration Date"
msgstr "만료 날짜"
msgid "Floating IP Address"
msgstr "유동 IP 주소"
msgid "Floating IP address or pool"
msgstr "플로팅 IP 주소나 풀"
msgid "Floating IP addresses"
msgstr "유동 IP 주소"
msgid "Floating IP pools"
msgstr "유동 IP 풀"
msgid "HTTP Method"
msgstr "HTTP 메서드"
msgid "HTTP method"
msgstr "HTTP 메서드"
msgid "HTTP method:"
msgstr "HTTP 메소드:"
msgid "Health Monitor ID"
msgstr "상태 모니터 ID"
msgid "ID"
msgstr "ID"
msgid "IP Address"
msgstr "IP 주소"
#, python-format
msgid "IP Addresses (%(count)s)"
msgstr "IP 주소 (%(count)s)"
msgid "IP address"
msgstr "IP 주소"
msgid "IP address:"
msgstr "IP 주소:"
msgid ""
"If an IP address is provided it must be a well-formed IPv4 or IPv6 address. "
"The system will\n"
" attempt to assign the provided IP address to the load balancer. If an IP "
"address is not provided\n"
" then one will be allocated for you."
msgstr ""
" IP 주소가 제공된 경우 올바른 형식의 IPv4 또는 IPv6 주소여야합니다. 시스템"
"은\n"
" 제공된 IP 주소를 로드 밸런서에 할당하려고 시도합니다. IP 주소가 제공되지 "
"않은 경우\n"
" 하나가 할당될 것입니다."
msgid ""
"If the listener uses the TERMINATED_HTTPS protocol, then one or more SSL "
"certificates must\n"
" be selected. The first certificate will be the default."
msgstr ""
"리스너가 TERMINATED_HTTPS 프로토콜을 이용하고 있다면, 하나 이상의 SSL 인증서"
"를 선택하십시오. 첫번째 인증서는 default 인증서가 됩니다."
msgid "Inactive"
msgstr "비활성"
msgid "Interval (sec)"
msgstr "간격 (초)"
msgid "Interval:"
msgstr "간격:"
msgid "Key Manager API Guide: Creating a Certificate Container"
msgstr "키 관리자 API 가이드: 인증서 컨테이너 생성하기"
msgid "Key Manager Service Command-Line Client"
msgstr "키 관리자 서비스 커맨드라인 클라이언트"
msgid ""
"LEAST_CONNECTIONS: Allocates requests to the instance with the least number "
"of active\n"
" connections."
msgstr ""
"LEAST_CONNECTIONS: 활성화된 연결이 가장 적은 인스턴스로\n"
" 요청을 할당합니다."
msgid "Least Connections"
msgstr "최소 연결"
#, python-format
msgid "Listener %(index)s"
msgstr "Listener %(index)s"
msgid "Listener 1"
msgstr "Listener 1"
msgid "Listener Details"
msgstr "리스너 세부정보"
msgid "Listener ID"
msgstr "리스너 ID"
msgid "Listeners"
msgstr "리스너"
#, python-format
msgid "Load Balancer %(index)s"
msgstr "Load Balancer %(index)s"
msgid "Load Balancer Algorithm"
msgstr "로드 밸런서 알고리즘"
msgid "Load Balancer Details"
msgstr "로드 밸런서 세부정보"
msgid "Load Balancer ID"
msgstr "로드 밸런서 ID"
msgid "Load Balancers"
msgstr "로드 밸런서"
msgid "Loading"
msgstr "불러오는 중"
msgid "Max Retries"
msgstr "최대 재시도"
msgid "Member ID"
msgstr "맴버 ID"
msgid "Members"
msgstr "맴버"
msgid ""
"Members are the actual IP addresses that will receive traffic from the load "
"balancer. Each\n"
" member must have a unique combination of IP address and port."
msgstr ""
"멤버는 로드 밸런서에서 트래픽을 받게 되는 실제 IP 주소입니다.\n"
" 각 멤버는 유일한 IP 주소와 포트의 조합을 가지고 있어야 합니다."
msgid "Method"
msgstr "방법"
msgid "Method:"
msgstr "메소드:"
msgid "Monitor Details"
msgstr "모니터 세부정보"
msgid "Monitor ID"
msgstr "모니터 ID"
msgid "Monitor type"
msgstr "모니터 타입"
msgid "Name"
msgstr "이름"
msgid "No available certificates"
msgstr "이용 가능한 인증서 없음"
msgid "No available instances"
msgstr "가용 인스턴스가 없음"
msgid "No items to display."
msgstr "표시할 항목이 없습니다."
msgid "No members have been allocated"
msgstr "할당된 멤버가 없음."
msgid "None"
msgstr "없음"
msgid "Offline"
msgstr "오프라인"
msgid "Online"
msgstr "온라인"
msgid "Operating Status"
msgstr "운영 상태"
msgid "Overview"
msgstr "개요"
msgid "Pending Create"
msgstr "생성 대기중"
msgid "Pending Delete"
msgstr "삭제 대기중"
msgid "Pending Update"
msgstr "업데이트 대기중"
msgid "Pool 1"
msgstr "Pool 1"
msgid "Pool Details"
msgstr "풀 세부정보"
msgid "Pool ID"
msgstr "풀 ID"
msgid "Pool Members"
msgstr "풀 맴버"
msgid "Pool member weight has been updated."
msgstr "풀 멤버의 가중치가 업데이트 되었습니다."
msgid "Port"
msgstr "포트"
msgid "Port ID"
msgstr "포트 ID"
msgid "Port:"
msgstr "포트:"
msgid "Protocol"
msgstr "프로토콜"
msgid "Protocol Port"
msgstr "프로토콜 포트"
msgid "Protocol:"
msgstr "프로토콜:"
msgid "Provide the details for the health monitor."
msgstr "상태 모니터의 세부 사항을 제공하십시오."
msgid "Provide the details for the listener."
msgstr "리스너에 대한 자세한 정보를 제공하십시오."
msgid "Provide the details for the load balancer."
msgstr "로드 밸런서에 대한 자세한 정보를 제공하십시오."
msgid "Provide the details for the pool."
msgstr "풀에 대한 자세한 정보를 작성하십시오."
msgid "Provider"
msgstr "프로바이더"
msgid "Provisioning Status"
msgstr "프로비저닝 상태"
msgid "ROUND_ROBIN: Rotates requests evenly between multiple instances."
msgstr "ROUND_ROBIN: 여러 인스턴스들 사이에서 짝수로 요청을 순환합니다."
msgid "Remove"
msgstr "제거"
msgid "Retries"
msgstr "재시도"
msgid "Retries:"
msgstr "재시도:"
msgid "Round Robin"
msgstr "라운드 로빈"
msgid ""
"SOURCE_IP: Requests from a unique source IP address are consistently "
"directed to the same instance."
msgstr ""
"SOURCE_IP: 하나의 고유한 소스 IP 주소로부터의 요청들은 지속적으로 같은 인스턴"
"스로 이동합니다."
msgid "SSL Certificates"
msgstr "SSL 인증서"
msgid ""
"Select a floating IP address to associate with the load balancer or a "
"floating IP pool in which to allocate a new floating IP address."
msgstr ""
"로드 밸런서와 연결할 유동 IP 주소 또는 새로운 유동 IP 주소를 할당하기 위한 유"
"동 IP 풀을 선택하세요."
msgid "Select certificates from the available certificates below"
msgstr "아래의 이용가능한 인증서 중에서 선택"
msgid "Select one or more SSL certificates for the listener."
msgstr "Listener 에 대한 하나 이상의 SSL 인증서를 선택하십시오."
msgid "Session Persistence"
msgstr "세션 지속성"
msgid "Source IP"
msgstr "소스 IP"
msgid "Subnet"
msgstr "서브넷"
msgid "Subnet ID"
msgstr "서브넷 ID"
msgid "Subnet:"
msgstr "서브넷:"
msgid "Tenant ID"
msgstr "테넌트 ID"
msgid ""
"The Available Instances table contains existing compute instances that can "
"be added as members\n"
" of the pool. Use the \"Add external member\" button to add a member not "
"found in the Available\n"
" Instances table."
msgstr ""
"사용 가능한 인스턴스 테이블에는 풀의 멤버로 추가 할 수 있는 기존의 \n"
" 컴퓨트 인스턴스가 포함되어 있습니다. \"외부 멤버 추가\" 버튼을 사용하여 \n"
" 사용 가능한 인스턴스 테이블에 없는 멤버를 추가하십시오."
msgid "The HTTP method used to perform the health check."
msgstr "상태 체크를 수행하기 위한 HTTP 메소드."
msgid "The IP address is not valid."
msgstr "올바른 IP 주소가 아닙니다."
msgid ""
"The IP address of the member to receive traffic from the load balancer. Must "
"be a well-formed\n"
" IPv4 or IPv6 address."
msgstr ""
"로드 밸런서에서 트래픽을 받는 멤버의 IP 주소입니다. 양식에 맞는 \n"
" IPv4나 IPv6 주소이어야 합니다."
msgid "The URL path is not valid."
msgstr "URL 경로가 올바르지 않습니다."
msgid ""
"The expected HTTP status codes to get from a successful health check. Must "
"be a single number,\n"
" a comma separated list of numbers, or a range (two numbers separated by a "
"hyphen)."
msgstr ""
"상태 체크가 성공했을 때 수신하게 되는 HTTP 상태 코드입니다. 단일 숫자이어야 "
"하고,\n"
" 쉼표로 구분된 숫자 리스트이거나 두 개의 숫자가 하이픈으로 구별된 범주이어"
"야 합니다."
msgid "The expected status code is not valid."
msgstr "status code가 올바르지 않습니다."
#, python-format
msgid "The following health monitor could not be deleted: %s."
msgstr "상태 모니터 %s는 삭제할 수 없습니다."
#, python-format
msgid ""
"The following listeners could not be deleted, possibly due to existing "
"pools: %s."
msgstr "리스너 %s는 존재하는 풀 때문에 삭제할 수 없습니다."
#, python-format
msgid "The following listeners will not be deleted due to existing pools: %s."
msgstr "다음 리스너는 기존 풀 때문세 삭제되지 않을 것입니다: %s."
#, python-format
msgid "The following load balancers are pending and cannot be deleted: %s."
msgstr "다음 로드 밸런싱는 보류 중이며 삭제할 수 없습니다: %s."
#, python-format
msgid ""
"The following load balancers could not be deleted, possibly due to existing "
"listeners: %s."
msgstr ""
"기존 리스너가 존재하는 등의 이유로 다음 로드 밸런서는 삭제될 수 없습니다: %s."
#, python-format
msgid "The following pool could not be deleted: %s."
msgstr "다음 풀은 삭제될 수 없습니다: %s."
msgid "The health check interval must be greater than or equal to the timeout."
msgstr "상태 체크 간격은 타임아웃 값 이상이어야 합니다."
msgid "The health monitor has been updated."
msgstr "상태 모니터가 업데이트 되었습니다."
msgid ""
"The health monitor is used to determine the health of your pool members. "
"Health checks\n"
" routinely run against each member within the pool and the result of the "
"health check is used\n"
" to determine if the member receives new connections. Each pool can only "
"have one health\n"
" monitor."
msgstr ""
"상태 모니터는 풀 멤버의 상태를 결정하는 데 사용됩니다. 상태 체크는\n"
" 풀 내의 각 멤버에 대해 주기적으로 실행하고, 상태 체크 결과로 \n"
" 멤버가 새 연결을 받을 수 있는지를 결정합니다. 각 풀은 하나의 상태 모니터"
"만 \n"
" 가질 수 있습니다."
msgid ""
"The interval between health checks. Must be greater than or equal to the "
"timeout."
msgstr "상태 체크 사이의 간격. 타임아웃 설정값 이상이어야 합니다."
msgid "The listener has been updated."
msgstr "리스너가 업데이트 되었습니다."
msgid ""
"The load balancer algorithm that distributes traffic to the pool members."
msgstr "풀 멤버에게 트래픽을 분배시키는 로드 밸런서 알고리즘."
msgid "The load balancer has been updated."
msgstr "로드 밸런서가 업데이트 되었습니다."
msgid ""
"The load balancer occupies a neutron network port and has an IP address "
"assigned from a subnet."
msgstr ""
"로드 밸런서는 뉴트론 네트워크 포트를 사용하고 서브넷에서 할당된 IP를 가집니"
"다."
msgid "The max retry count must be a number between 1 and 10."
msgstr "최대 재시도 횟수는 1 ~ 10회입니다."
msgid "The network on which to allocate the load balancer's IP address."
msgstr "로드 밸런서의 IP 주소를 할당하기 위한 네트워크"
msgid "The network which contains the IP address of the member."
msgstr "멤버의 IP 주소를 포함하고 있는 네트워크입니다."
msgid ""
"The number of allowed connection failures before marking the member as "
"inactive. Must be a\n"
" number from 1 to 10."
msgstr ""
"재시도 횟수를 초과하여 연결이 실패하면 멤버는 비활성화 되고, 재시도 횟수는\n"
" 1에서 10까지의 숫자이어야 합니다."
msgid "The pool has been updated."
msgstr "풀이 업데이트 되었습니다."
msgid "The pool members have been updated."
msgstr "풀 멤버가 업데이트 되었습니다."
msgid "The port must be a number between 1 and 65535."
msgstr "포트 번호는 1 ~ 65535 사이 숫자를 사용해야 합니다."
msgid ""
"The port must be unique among all listeners attached to this load balancer."
msgstr ""
"이 로드 밸런서에 연결될 포트는 모든 리스너 중 유일한 포트이어야 합니다."
msgid ""
"The port on which the front end listens. Must be an integer from 1 to 65535."
msgstr "프런트 엔드에서 listen하는 포트. 1에서 65535 사이의 정수여야 합니다."
msgid ""
"The port on which the member listens for traffic. Must be a number from 1 to "
"65535."
msgstr ""
"트래픽을 수신하는 멤버의 포트 번호입니다. 포트 번호는 1 ~ 65535 사이 숫자이어"
"야 합니다."
msgid ""
"The protocol for which the front end listens. The TERMINATED_HTTPS protocol "
"is only available if\n"
" the key-manager service is enabled and you have authority to list "
"certificate containers and\n"
" secrets."
msgstr ""
"프런트 엔드에서 수신하는 프로토콜. TERMINATED_HTTPS 프로토콜은\n"
" key-manager 서비스가 활성화되고 인증서 컨테이너와 비밀값을 리스트할 수 있"
"는 \n"
" 권한이 있어야 이용이 가능합니다."
msgid ""
"The target of the health check HTTP request to the member. Must be a valid "
"URL path."
msgstr ""
"상태 체크하기 위해 멤버에게 HTTP 요청하는 대상. 유효한 URL 경로이어야 합니다."
msgid ""
"The time after which a health check times out. Must be a number greater than "
"or equal to 0\n"
" and less than or equal to the interval."
msgstr ""
"상태 체크 시간이 종료되는 시간. 0 이상의 숫자이어야 하고\n"
" 타임아웃 값은 상태 체크 간격 값 이하이어야 합니다."
msgid "The timeout must be a number greater than or equal to 0."
msgstr "타임아웃 시간은 0 이거나 보다 커야됩니다."
msgid "The weight must be a number between 1 and 256."
msgstr "가중치는 반드시 숫자 1과 256사이여야 합니다."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared\n"
" to the other members of the pool. A higher weight means it will receive "
"more traffic. Must be\n"
" a number from 1 to 256."
msgstr ""
"멤버의 가중치는 풀의 다른 멤버와 비교하여 요청이나 연결의\n"
" 양을 결정합니다. 가중치가 높을수록 더 많은 트래픽을 받게 됩니다.\n"
" 가중치는 숫자 1과 256사이여야 합니다."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared to the other members of the pool."
msgstr ""
"맴버의 가중치는 풀의 다른 맴버와 비교하여 서비스의 요청이나 연결 부분을 결정"
"합니다."
msgid "Timeout"
msgstr "제한시간"
msgid "Timeout (sec)"
msgstr "타임아웃 (초)"
msgid "Timeout:"
msgstr "타임아웃:"
msgid "Type"
msgstr "타입"
msgid "URL Path"
msgstr "URL 경로"
msgid "URL path"
msgstr "URL 경로"
msgid "URL path:"
msgstr "URL 경로:"
msgid "Unable to create health monitor."
msgstr "상태 모니터를 생성할 수 없습니다."
msgid "Unable to create listener."
msgstr "리스너를 생성할 수 없습니다."
msgid "Unable to create load balancer."
msgstr "로드 밸런서를 생성할 수 없습니다."
msgid "Unable to create pool."
msgstr "풀을 생성할 수 없습니다."
msgid "Unable to delete health monitor."
msgstr "상태 모니터를 삭제할 수 없습니다."
msgid "Unable to delete listener."
msgstr "리스너를 삭제할 수 없습니다."
msgid "Unable to delete load balancer."
msgstr "로드 밸런서를 삭제할 수 없습니다."
msgid "Unable to delete pool."
msgstr "풀을 삭제할 수 없습니다."
#, python-format
msgid "Unable to disassociate floating IP address from load balancer: %s."
msgstr "다음 로드 밸런서에서 유동 IP를 연결 해제 할 수 없습니다: %s"
msgid "Unable to retrieve SSL certificates."
msgstr "SSL 인증을 찾을 수 없습니다."
msgid "Unable to retrieve health monitor."
msgstr "상태 모니터를 가져올 수 없습니다."
msgid "Unable to retrieve listener."
msgstr "리스너를 가져올 수 없습니다."
msgid "Unable to retrieve listeners."
msgstr "리스너를 가져올 수 없습니다."
msgid "Unable to retrieve load balancer status tree."
msgstr "로드 밸런서 상태 트리를 가져올 수 없습니다."
msgid "Unable to retrieve load balancer."
msgstr "로드 밸런서를 가져올 수 없습니다."
msgid "Unable to retrieve load balancers."
msgstr "로드 밸런서를 가져올 수 없습니다."
msgid "Unable to retrieve member."
msgstr "멤버를 가져올 수 없습니다."
msgid "Unable to retrieve members."
msgstr "멤버를 가져올 수 없습니다."
msgid "Unable to retrieve pool."
msgstr "풀을 가져올 수 없습니다."
msgid "Unable to retrieve secrets."
msgstr "비밀 값을 찾을 수 없습니다."
msgid "Unable to update health monitor."
msgstr "상태 모니터를 업데이트할 수 없습니다."
msgid "Unable to update listener."
msgstr "리스너를 업데이트할 수 없습니다."
msgid "Unable to update load balancer."
msgstr "로드 밸런서를 업데이트할 수 없습니다. "
msgid "Unable to update member list."
msgstr "멤버 목록을 업데이트할 수 없습니다."
msgid "Unable to update member."
msgstr "멤버를 업데이트할 수 없습니다."
msgid "Unable to update pool."
msgstr "풀을 업데이트할 수 없습니다."
msgid "Update"
msgstr "업데이트"
msgid "Update Health Monitor"
msgstr "상태 모니터 갱신"
msgid "Update Listener"
msgstr "리스너 업데이트"
msgid "Update Load Balancer"
msgstr "로드 밸런서 업데이트"
msgid "Update Member Weight"
msgstr "맴버 가중치 업데이트"
msgid "Update Pool"
msgstr "풀 업데이트"
msgid "Update Weight"
msgstr "가중치 업데이트"
msgid ""
"Use the key-manager service to create any certificate containers before "
"creating the listener.\n"
" The following documentation provides information on how to create a "
"certificate container:"
msgstr ""
"리스너를 만들기 전에 인증서 컨테이너를 만들기 위해 키 관리자 서비스를 사용하"
"세요.\n"
" 다음 문서는 인증서 컨테이너를 어떻게 만드는지에 대한 정보를 제공합니다:"
msgid "Weight"
msgstr "가충치"
msgid "Weight:"
msgstr "가중치:"
#, python-format
msgid ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
msgstr ""
"로드 밸런서 \"%s\"에서 유동 IP 주소를 연결 해제하려고 합니다. 확인해주세요. "
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
msgstr ""
"\"%s\"을(를) 선택했습니다. 선택 내역을 확인하십시오. 삭제된 상태 모니터는 복"
"구할 수 없습니다."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted listeners "
"are not recoverable."
msgstr ""
"\"%s\"을(를) 선택했습니다. 선택을 확인하십시오. 삭제한 리스너는 복구할 수 없"
"습니다."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
msgstr ""
"\"%s\"를 선택했습니다. 선택 내역을 확인하십시오. 삭제된 로드 밸런서는 복구되"
"지 않습니다."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."
msgstr ""
"\"%s\"을(를) 선택했습니다. 선택 내역을 확인하십시오. 삭제된 풀은 복구할 수 없"
"습니다."

View File

@ -1,18 +0,0 @@
# Rodrigo Loures <rmoraesloures@gmail.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-02-05 21:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-01-18 10:01+0000\n"
"Last-Translator: Rodrigo Loures <rmoraesloures@gmail.com>\n"
"Language-Team: Portuguese (Brazil)\n"
"Language: pt_BR\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
msgid "Load Balancers"
msgstr "Balanceadores de carga"

View File

@ -1,19 +0,0 @@
# Artem <amikhalev90@gmail.com>, 2016. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard 3.0.1.dev6\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2017-09-28 01:36+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2016-10-19 02:32+0000\n"
"Last-Translator: Artem <amikhalev90@gmail.com>\n"
"Language-Team: Russian\n"
"Language: ru\n"
"X-Generator: Zanata 3.9.6\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
msgid "Load Balancers"
msgstr "Балансировщики нагрузки"

View File

@ -1,662 +0,0 @@
# Aleksey Alekseenko <9118250541@mail.ru>, 2016. #zanata
# Alexander <ainikitenkov@gmail.com>, 2016. #zanata
# Andrew <apapsujko@gmail.com>, 2016. #zanata
# Artem <amikhalev90@gmail.com>, 2016. #zanata
# Artem <amikhalev90@gmail.com>, 2017. #zanata
# Fedor Tarasenko <feodor.tarasenko@gmail.com>, 2017. #zanata
# Ivan Startsev <istartsev67@gmail.com>, 2017. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-03-29 00:48+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2017-02-28 06:46+0000\n"
"Last-Translator: Ivan Startsev <istartsev67@gmail.com>\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 "%(ip)s..."
msgstr "%(ip)s..."
msgid "A new health monitor is being created."
msgstr "Новый монитор работоспособности создается."
msgid "A new listener is being created."
msgstr "Новый получатель запросов создается."
msgid "A new load balancer is being created."
msgstr "Новый балансировщик нагрузки создается."
msgid "A new pool is being created."
msgstr "Новый пул создается."
msgid ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgstr ""
"Пул представляет собой группу участников, среди которых распределяется "
"нагрузка."
msgid "Actions"
msgstr "Действия"
msgid "Active"
msgstr "Активный"
msgid "Add"
msgstr "Добавить"
msgid "Add external member"
msgstr "Добавить внешнего участника"
msgid "Add members to the load balancer pool."
msgstr "Добавить участников в пул балансировщика нагрузки."
msgid "Add/Remove Pool Members"
msgstr "Добавить/Удалить участников пула"
msgid "Address"
msgstr "Адрес"
msgid "Admin State Up"
msgstr "Административное состояние UP"
msgid "Allocated Members"
msgstr "Выделенные участники"
msgid "An error occurred. Please try again later."
msgstr "Произошла ошибка. Повторите попытку."
msgid "Associate"
msgstr "Назначить"
msgid "Associate Floating IP"
msgstr "Связать назначаемый IP"
msgid "Associate Floating IP Address"
msgstr "Привязать назначаемый IP адрес"
msgid "Associating floating IP with load balancer."
msgstr "Связывание назначаемого IP с балансировщиком нагрузки."
msgid "Available Instances"
msgstr "Доступные инстансы"
msgid "Cancel"
msgstr "Отмена"
msgid "Certificate Name"
msgstr "Имя сертификата"
msgid "Confirm Delete Health Monitor"
msgstr "Подтвердите Удаление Монитора Работоспособности"
msgid "Confirm Delete Listeners"
msgstr "Подтвердите удаление получателей"
msgid "Confirm Delete Load Balancers"
msgstr "Подтвердите Удаление Балансировщиков Нагрузки"
msgid "Confirm Delete Pool"
msgstr "Подтвердите удаление пула"
msgid "Confirm Disassociate Floating IP Address"
msgstr "Подтвердите отвязку назначаемых IP адресов"
msgid "Connection Limit"
msgstr "Лимит соединений"
msgid "Create Health Monitor"
msgstr "Создать Монитор Работоспособности."
msgid "Create Listener"
msgstr "Создать Получателя"
msgid "Create Load Balancer"
msgstr "Создать Балансировщик Нагрузки"
msgid "Create Pool"
msgstr "Создать Пул"
msgid "Default Pool ID"
msgstr "ИД Пула по умолчанию"
msgid "Degraded"
msgstr "Деградировавший"
msgid "Delay"
msgstr "Задержка"
msgid "Delete Health Monitor"
msgstr "Удалить Монитор Работоспособности"
msgid "Delete Listener"
msgstr "Удалить получателя"
msgid "Delete Listeners"
msgstr "Удалить Получателей"
msgid "Delete Load Balancer"
msgstr "Удалить Балансировщик Нагрузки"
msgid "Delete Load Balancers"
msgstr "Удалить Балансировщики Нагрузки"
msgid "Delete Pool"
msgstr "Удалить пул"
#, python-format
msgid "Deleted health monitor: %s."
msgstr "Удаленный монитор работоспособности: %s."
#, python-format
msgid "Deleted listeners: %s."
msgstr "Удаленные получатели: %s."
#, python-format
msgid "Deleted load balancers: %s."
msgstr "Удаленные балансировщики нагрузки: %s."
#, python-format
msgid "Deleted pool: %s."
msgstr "Удален пул: %s."
msgid "Description"
msgstr "Описание"
msgid "Disassociate"
msgstr "Снять назначение"
msgid "Disassociate Floating IP"
msgstr "Отвязать Назначаемый IP"
msgid "Edit"
msgstr "Редактировать"
msgid "Edit Pool"
msgstr "Редактировать пул"
msgid "Error"
msgstr "Ошибка"
msgid "Expected Codes"
msgstr "Ожидаемые коды"
msgid "Expected status codes"
msgstr "Ожидаемые статус-коды"
msgid "Expiration Date"
msgstr "Дата окончания действия"
msgid "Floating IP Address"
msgstr "Нефиксированный IP Адресс"
msgid "Floating IP addresses"
msgstr "Назначаемые IP-адреса"
msgid "Floating IP pools"
msgstr "Пул назначаемых IP адресов"
msgid "HTTP Method"
msgstr "Метод HTTP"
msgid "HTTP method"
msgstr "Метод HTTP"
msgid "Health Monitor ID"
msgstr "ИД Монитора Работоспособности"
msgid "ID"
msgstr "ID"
msgid "IP Address"
msgstr "IP адрес"
#, python-format
msgid "IP Addresses (%(count)s)"
msgstr "IP адрес (%(count)s)"
msgid "IP address"
msgstr "IP адрес"
msgid ""
"If the listener uses the TERMINATED_HTTPS protocol, then one or more SSL "
"certificates must\n"
" be selected. The first certificate will be the default."
msgstr ""
"Один или более SSL сертификат должны быть выбраны если слушатель использует "
"TERMINATED_HTTPS протокол. Первый сертификат будет использоваться по "
"умолчанию."
msgid "Least Connections"
msgstr "Меньше соединений"
#, python-format
msgid "Listener %(index)s"
msgstr "Слушатель %(index)s"
msgid "Listener 1"
msgstr "Слушатель 1"
msgid "Listener Details"
msgstr "Информация о слушателе"
msgid "Listener ID"
msgstr "ИД получателя"
msgid "Listeners"
msgstr "Получатели"
#, python-format
msgid "Load Balancer %(index)s"
msgstr "Балансировщика нагрузки %(index)s"
msgid "Load Balancer Algorithm"
msgstr "Алгоритм балансировки"
msgid "Load Balancer Details"
msgstr "Информация о балансировщике нагрузки"
msgid "Load Balancer ID"
msgstr "ИД балансировщика нагрузки"
msgid "Load Balancers"
msgstr "Балансировщики нагрузки"
msgid "Loading"
msgstr "Загрузка"
msgid "Max Retries"
msgstr "Максимальное количество повторных попыток"
msgid "Member ID"
msgstr "ИД Участника"
msgid "Members"
msgstr "Участники"
msgid ""
"Members are the actual IP addresses that will receive traffic from the load "
"balancer. Each\n"
" member must have a unique combination of IP address and port."
msgstr ""
"Участники - IP адреса, принимающие трафик от балансировщика нагрузки. IP "
"адрес и порт каждого участника должны быть уникальны."
msgid "Monitor Details"
msgstr "Детали Монитора"
msgid "Monitor ID"
msgstr "ИД монитора"
msgid "Name"
msgstr "Имя"
msgid "No available certificates"
msgstr "Нет доступных сертификатов"
msgid "No available instances"
msgstr "Нет доступных инстансов"
msgid "No items to display."
msgstr "Нет элементов для отображения."
msgid "No members have been allocated"
msgstr "Участники не были выбраны"
msgid "None"
msgstr "Нет"
msgid "Offline"
msgstr "Вне сети"
msgid "Online"
msgstr "В сети"
msgid "Operating Status"
msgstr "Рабочий Статус"
msgid "Overview"
msgstr "Обзор"
msgid "Pending Create"
msgstr "Ожидает создание"
msgid "Pending Delete"
msgstr "Ожидает удаления"
msgid "Pending Update"
msgstr "Ожидает обновления"
msgid "Pool 1"
msgstr "Пул 1"
msgid "Pool Details"
msgstr "Информация о пуле"
msgid "Pool ID"
msgstr "ИД пула"
msgid "Pool Members"
msgstr "Участники пула"
msgid "Pool member weight has been updated."
msgstr "Весь элемента пула был изменен."
msgid "Port"
msgstr "Порт"
msgid "Port ID"
msgstr "ID порта"
msgid "Protocol"
msgstr "Протокол"
msgid "Protocol Port"
msgstr "Порт протокола"
msgid "Provide the details for the health monitor."
msgstr "Предоставить детали для монитора состояния."
msgid "Provide the details for the listener."
msgstr "Предоставить детали для слушателя."
msgid "Provide the details for the load balancer."
msgstr "Предоставить детали для балансировщика нагрузки."
msgid "Provide the details for the pool."
msgstr "Предоставить детали для пула."
msgid "Provider"
msgstr "Провайдер"
msgid "Provisioning Status"
msgstr "Статус развертывания"
msgid "Remove"
msgstr "Удалить"
msgid "Round Robin"
msgstr "Циклический"
msgid "SSL Certificates"
msgstr "SSL сертификаты"
msgid ""
"Select a floating IP address to associate with the load balancer or a "
"floating IP pool in which to allocate a new floating IP address."
msgstr ""
"Выберите назначаемый IP адрес для балансировщика нагрузки или пул "
"назначаемых IP адресов для выделения нового назначаемого IP адреса."
msgid "Select certificates from the available certificates below"
msgstr "Выберите сертификаты из числа доступных указанных ниже"
msgid "Select one or more SSL certificates for the listener."
msgstr "Выберите один или более SSL сертификатов для службы отчётов."
msgid "Session Persistence"
msgstr "Постоянство сессии"
msgid "Source IP"
msgstr "IP-адрес источника"
msgid "Subnet ID"
msgstr "ID подсети"
msgid "Tenant ID"
msgstr "ИД арендатора"
msgid "The IP address is not valid."
msgstr "IP адрес не действителен."
msgid "The URL path is not valid."
msgstr "URL не является действительным."
msgid "The expected status code is not valid."
msgstr "Ожидаемый код состояния невалиден."
#, python-format
msgid "The following health monitor could not be deleted: %s."
msgstr "Следующий монитор работоспособности не может быть удален: %s."
#, python-format
msgid ""
"The following listeners could not be deleted, possibly due to existing "
"pools: %s."
msgstr ""
"Следующие получатели не могут быть удалены, возможно из за существующих "
"пулов: %s."
#, python-format
msgid "The following listeners will not be deleted due to existing pools: %s."
msgstr "Следующие получатели не будут удалены из за существующих пулов: %s."
#, python-format
msgid "The following load balancers are pending and cannot be deleted: %s."
msgstr ""
"Следующие балансировщики нагрузки в состоянии ожидания и не могут быть "
"удалены: %s."
#, python-format
msgid ""
"The following load balancers could not be deleted, possibly due to existing "
"listeners: %s."
msgstr ""
"Следующие балансировщики нагрузки не могут быть удалены, возможно из за "
"существующих получателей: %s."
#, python-format
msgid "The following pool could not be deleted: %s."
msgstr "Данный пул не может быть удален: %s."
msgid "The health check interval must be greater than or equal to the timeout."
msgstr ""
"Интервал проверки работоспособности должен быть не меньше времени ожидания."
msgid "The health monitor has been updated."
msgstr "Монитор работоспособности был обновлен."
msgid "The listener has been updated."
msgstr "Получатель был обновлен."
msgid "The load balancer has been updated."
msgstr "Балансировщик нагрузки был обновлен."
msgid ""
"The load balancer occupies a neutron network port and has an IP address "
"assigned from a subnet."
msgstr ""
"Балансировщик нагрузки занимает порт в сети Neutron и имеет IP адрес, "
"выделенный из подсети"
msgid "The max retry count must be a number between 1 and 10."
msgstr "Количество попыток должно быть в диапазон между 1 и 10."
msgid "The pool has been updated."
msgstr "Пул был обновлен."
msgid "The pool members have been updated."
msgstr "Элементы пула были изменены."
msgid "The port must be a number between 1 and 65535."
msgstr "Значение для порта должно быть в диапозоне между 1 и 65535."
msgid ""
"The port must be unique among all listeners attached to this load balancer."
msgstr ""
"Порт должен быть уникален среди приемников, присоединенных к балансировщику "
"нагрузки."
msgid "The timeout must be a number greater than or equal to 0."
msgstr "Значение таймаута должно быть больше или рано 0."
msgid "The weight must be a number between 1 and 256."
msgstr "Значение веса должно быть в диапозоне между 1 и 256."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared to the other members of the pool."
msgstr ""
"Вес участника определяет долю обслуживаемых запросов или соединений по "
"отношению к другим участникам пула."
msgid "Timeout"
msgstr "Таймаут"
msgid "Type"
msgstr "Тип"
msgid "URL Path"
msgstr "Путь URL"
msgid "URL path"
msgstr "Путь URL"
msgid "Unable to create health monitor."
msgstr "Не удалось создать монитор работоспособности."
msgid "Unable to create listener."
msgstr "Не удалось создать получателя."
msgid "Unable to create load balancer."
msgstr "Не удалось создать балансировщик нагрузки."
msgid "Unable to create pool."
msgstr "Не удалось создать пул."
msgid "Unable to delete health monitor."
msgstr "Не удалось удалить монитор работоспособности."
msgid "Unable to delete listener."
msgstr "Не удалось удалить получателя."
msgid "Unable to delete load balancer."
msgstr "Не удалось удалить балансировщик нагрузки."
msgid "Unable to delete pool."
msgstr "Не удалось удалить пул."
#, python-format
msgid "Unable to disassociate floating IP address from load balancer: %s."
msgstr ""
"Не удаётся отвязать назначаемый IP адрес от балансировщика нагрузки: %s."
msgid "Unable to retrieve SSL certificates."
msgstr "Не удалось получить SSL сертификаты."
msgid "Unable to retrieve health monitor."
msgstr "Не удалось получить монитор работоспособности."
msgid "Unable to retrieve listener."
msgstr "Не удалось получить получателя."
msgid "Unable to retrieve listeners."
msgstr "Не удалось получить получателей."
msgid "Unable to retrieve load balancer."
msgstr "Не удалось получить данные балансировщика нагрузки."
msgid "Unable to retrieve load balancers."
msgstr "Не удалось получить список балансировщиков нагрузки."
msgid "Unable to retrieve member."
msgstr "Не удалось получить участника."
msgid "Unable to retrieve members."
msgstr "Не удалось получить участников."
msgid "Unable to retrieve pool."
msgstr "Не удалось получить пул."
msgid "Unable to retrieve secrets."
msgstr "Невозможно получить секретные ключи."
msgid "Unable to update health monitor."
msgstr "Не удалось обновить монитор работоспособности."
msgid "Unable to update listener."
msgstr "Не удалось обновить получателя."
msgid "Unable to update load balancer."
msgstr "Не удалось обновить балансировщик нагрузки."
msgid "Unable to update member list."
msgstr "Не удалось обновить список участников."
msgid "Unable to update member."
msgstr "Не удалось обновить участника."
msgid "Unable to update pool."
msgstr "Не удалось обновить пул."
msgid "Update"
msgstr "Обновить"
msgid "Update Health Monitor"
msgstr "Обновить Монитор Работоспособности"
msgid "Update Listener"
msgstr "Обновить получатель"
msgid "Update Load Balancer"
msgstr "Обновить Балансировщик Нагрузки"
msgid "Update Member Weight"
msgstr "Обновить весь участника"
msgid "Update Pool"
msgstr "Обновить пул"
msgid "Update Weight"
msgstr "Обновить вес"
msgid "Weight"
msgstr "Вес"
#, python-format
msgid ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
msgstr ""
"Вы собираетесь отвязать назначаемые IP адреса от балансировщика нагрузки \"%s"
"\". Пожалуйста подтвердите."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
msgstr ""
"Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление монитора "
"работоспособности необратимо."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted listeners "
"are not recoverable."
msgstr ""
"Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление получателей "
"необратимо."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
msgstr ""
"Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление "
"балансировщиков нагрузки необратимо."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."
msgstr ""
"Вы выбрали \"%s\". Пожалуйста подтвердите ваш выбор. Удаление пулов "
"необратимо."

View File

@ -1,695 +0,0 @@
# işbaran akçayır <isbaran@gmail.com>, 2017. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-03-29 00:48+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2017-05-23 12:37+0000\n"
"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\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: 1495542946.000000\n"
#, python-format
msgid "%(ip)s..."
msgstr "%(ip)s..."
msgid "A new health monitor is being created."
msgstr "Yeni bir sağlık izleyici oluşturuluyor."
msgid "A new listener is being created."
msgstr "Yeni bir dinleyici oluşturuluyor."
msgid "A new load balancer is being created."
msgstr "Yeni bir yük dengeleyici oluşturuluyor."
msgid "A new pool is being created."
msgstr "Yeni bir havuz oluşturuluyor."
msgid ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgstr "Havuz yük dengelemenin uygulanacağı bir grup üyeyi temsil eder."
msgid "Actions"
msgstr "Eylemler"
msgid "Active"
msgstr "Etkin"
msgid "Add"
msgstr "Ekle"
msgid "Add external member"
msgstr "Harici üye ekle"
msgid "Add members to the load balancer pool."
msgstr "Üyeleri yük dengeleyici havuzuna ekle."
msgid "Add/Remove Pool Members"
msgstr "Havuz Üyeleri Ekle/Çıkar"
msgid "Address"
msgstr "Adres"
msgid "Admin State Up"
msgstr "Yönetici Durumu Açık"
msgid "Allocated Members"
msgstr "Ayrılmış Üyeler"
msgid "An error occurred. Please try again later."
msgstr "Bir hata oluştu. Lütfen daha sonra tekrar deneyin."
msgid "Associate"
msgstr "İlişkilendir"
msgid "Associate Floating IP"
msgstr "Değişken IP Ata"
msgid "Associate Floating IP Address"
msgstr "Değişken IP Adresleri ile İlişkilendir"
msgid "Associating floating IP with load balancer."
msgstr "Yük dengeleyiciye değişken IP ilişkilendirme."
msgid "Available Instances"
msgstr "Kullanılabilir Sunucular"
msgid "Cancel"
msgstr "İptal"
msgid "Certificate Name"
msgstr "Sertifika İsmi"
msgid "Confirm Delete Health Monitor"
msgstr "Sağlık İzleyici Silmeyi Onayla"
msgid "Confirm Delete Listeners"
msgstr "Dinleyici Silmeyi Onayla"
msgid "Confirm Delete Load Balancers"
msgstr "Yük Dengeleyicileri Silmeyi Onayla"
msgid "Confirm Delete Pool"
msgstr "Havuzu Silmeyi Onayla"
msgid "Confirm Disassociate Floating IP Address"
msgstr "Değişken IP Adresi İlişkisini Kaldırmayı Onaylayın"
msgid "Connection Limit"
msgstr "Bağlantı Sınırı"
msgid "Create Health Monitor"
msgstr "Sağlık İzleyici Oluştur"
msgid "Create Listener"
msgstr "Dinleyici Oluştur"
msgid "Create Load Balancer"
msgstr "Yük Dengeleyici Oluştur"
msgid "Create Pool"
msgstr "Havuz Oluştur"
msgid "Default Pool ID"
msgstr "Öntanımlı Havuz Kimliği"
msgid "Degraded"
msgstr "Alçaltılmış"
msgid "Delay"
msgstr "Gecikme"
msgid "Delete Health Monitor"
msgstr "Sağlık İzleyiciyi Sil"
msgid "Delete Listener"
msgstr "Dinleyiciyi Sil"
msgid "Delete Listeners"
msgstr "Dinleyicileri Sil"
msgid "Delete Load Balancer"
msgstr "Yük Dengeleyiciyi Sil"
msgid "Delete Load Balancers"
msgstr "Yük Dengeleyicileri Sil"
msgid "Delete Pool"
msgstr "Havuzu Sil"
#, python-format
msgid "Deleted health monitor: %s."
msgstr "Sağlık izleyici silindi: %s."
#, python-format
msgid "Deleted listeners: %s."
msgstr "Dinleyiciler silindi: %s."
#, python-format
msgid "Deleted load balancers: %s."
msgstr "Yük dengeleyici silindi: %s."
#, python-format
msgid "Deleted pool: %s."
msgstr "Havuz silindi: %s."
msgid "Description"
msgstr "Tanım"
msgid "Disassociate"
msgstr "İlişkiyi Kaldır"
msgid "Disassociate Floating IP"
msgstr "Değişken IP İlişiğini Kes"
#, python-format
msgid "Disassociated floating IP address from load balancer: %s."
msgstr "Değişken IP adresi yük dengeleyiciden ayrılıyor: %s."
msgid ""
"Each port that listens for traffic on a particular load balancer is "
"configured separately and\n"
" tied to the load balancer. Multiple listeners can be associated with the "
"same load balancer but\n"
" each must use a unique port."
msgstr ""
"Bir yük dengeleyici üzerinde trafik dinleyen her bağlantı noktası ayrıca "
"yapılandırılır ve\n"
" yük dengeleyiciye bağlanır. Birden çok dinleyici aynı yük dengeleyici ile "
"ilişkilendirilebilir ama\n"
" her biri benzersiz bir bağlantı noktası kullanmalıdır."
msgid "Edit"
msgstr "Düzenle"
msgid "Edit Pool"
msgstr "Havuzu Düzenle"
msgid "Error"
msgstr "Hata"
msgid "Expected Codes"
msgstr "Beklenen Kodlar"
msgid "Expected status codes"
msgstr "Beklenen durum kodları"
msgid "Expiration Date"
msgstr "Son Kullanma Tarihi"
msgid "Floating IP Address"
msgstr "Değişken IP Adresi"
msgid "Floating IP addresses"
msgstr "Değişken IP adresleri"
msgid "Floating IP pools"
msgstr "Değişken IP havuzları"
msgid "HTTP Method"
msgstr "HTTP Yöntemi"
msgid "HTTP method"
msgstr "HTTP yöntemi"
msgid "Health Monitor ID"
msgstr "Sağlık İzleyici Kimliği"
msgid "ID"
msgstr "Kimlik"
msgid "IP Address"
msgstr "IP Adresi"
#, python-format
msgid "IP Addresses (%(count)s)"
msgstr "IP Adresleri (%(count)s)"
msgid "IP address"
msgstr "IP adresi"
msgid ""
"If the listener uses the TERMINATED_HTTPS protocol, then one or more SSL "
"certificates must\n"
" be selected. The first certificate will be the default."
msgstr ""
"Dinleyici TERMINATED_HTTPS iletişim kuralını kullanıyorsa, bir ya da fazla "
"SSL sertifikası seçilmelidir.\n"
" İlk sertifika ön tanımlı olur."
msgid "Least Connections"
msgstr "En Az Bağlantı"
#, python-format
msgid "Listener %(index)s"
msgstr "Dinleyici %(index)s"
msgid "Listener 1"
msgstr "Dinleyici 1"
msgid "Listener Details"
msgstr "Dinleyici Ayrıntıları"
msgid "Listener ID"
msgstr "Dinleyici Kimliği"
msgid "Listeners"
msgstr "Dinleyiciler"
#, python-format
msgid "Load Balancer %(index)s"
msgstr "Yük Dengeleyici %(index)s"
msgid "Load Balancer Algorithm"
msgstr "Yük Dengeleme Algoritması"
msgid "Load Balancer Details"
msgstr "Yük Dengeleyici Ayrıntıları"
msgid "Load Balancer ID"
msgstr "Yük Dengeleyici Kimliği"
msgid "Load Balancers"
msgstr "Yük Dengeleyiciler"
msgid "Loading"
msgstr "Yükleniyor"
msgid "Max Retries"
msgstr "Azami Deneme"
msgid "Member ID"
msgstr "Üye Kimliği"
msgid "Members"
msgstr "Üyeler"
msgid ""
"Members are the actual IP addresses that will receive traffic from the load "
"balancer. Each\n"
" member must have a unique combination of IP address and port."
msgstr ""
"Üyeler yük dengeleyiciden trafiği alacak asıl IP adresleridir. Her üyenin "
"benzersiz bir\n"
" IP adresi ve bağlantı noktası bileşimi olmalıdır."
msgid "Monitor Details"
msgstr "İzleyici Ayrıntıları"
msgid "Monitor ID"
msgstr "İzleyici Kimliği"
msgid "Name"
msgstr "İsim"
msgid "No available certificates"
msgstr "Kullanılabilir sertifika yok"
msgid "No available instances"
msgstr "Kullanılabilir sunucu yok"
msgid "No items to display."
msgstr "Gösterilecek öge yok."
msgid "No members have been allocated"
msgstr "Hiçbir üye ayrılmamış"
msgid "None"
msgstr "Hiçbiri"
msgid "Offline"
msgstr "Çevrimdışı"
msgid "Online"
msgstr "Çevirmiçi"
msgid "Operating Status"
msgstr "İşletim Durumu"
msgid "Overview"
msgstr "Genel Görünüm"
msgid "Pending Create"
msgstr "Oluşturma Bekleniyor"
msgid "Pending Delete"
msgstr "Silme Bekleniyor"
msgid "Pending Update"
msgstr "Güncelleme Bekleniyor"
msgid "Pool 1"
msgstr "Havuz 1"
msgid "Pool Details"
msgstr "Havuz Ayrıntıları"
msgid "Pool ID"
msgstr "Havuz Kimliği"
msgid "Pool Members"
msgstr "Havuz Üyeleri"
msgid "Pool member weight has been updated."
msgstr "Havuz üye ağırlığı güncellendi."
msgid "Port"
msgstr "Bağlantı Noktası"
msgid "Port ID"
msgstr "Bağlantı Noktası Kimliği"
msgid "Protocol"
msgstr "İletişim Kuralı"
msgid "Protocol Port"
msgstr "İletişim Bağlantı Noktası"
msgid "Provide the details for the health monitor."
msgstr "Sağlık izleyici ile ilgili ayrıntıları girin."
msgid "Provide the details for the listener."
msgstr "Dinleyici ayrıntılarını girin."
msgid "Provide the details for the load balancer."
msgstr "Yük dengeleyici için ayrıntıları girin."
msgid "Provide the details for the pool."
msgstr "Havuz ayrıntılarını girin."
msgid "Provider"
msgstr "Sağlayıcı"
msgid "Provisioning Status"
msgstr "Hazırlama Durumu"
msgid "Remove"
msgstr "Kaldır"
msgid "Round Robin"
msgstr "Hepsini Sırayla"
msgid "SSL Certificates"
msgstr "SSL Sertifikaları"
msgid ""
"Select a floating IP address to associate with the load balancer or a "
"floating IP pool in which to allocate a new floating IP address."
msgstr ""
"Yük dengeleyici ile ilişkilendirmek ve yeni bir değişken IP adresi ayırmak "
"için bir değişken IP veya değişken IP havuzu seçin."
msgid "Select certificates from the available certificates below"
msgstr "Aşağıdaki kullanılabilir sertifikalar içinden sertifikaları seçin"
msgid "Select one or more SSL certificates for the listener."
msgstr "Dinleyici için bir ya da fazla SSL sertifikası seçin."
msgid "Session Persistence"
msgstr "Oturum Kalıcılığı"
msgid "Source IP"
msgstr "Kaynak IP"
msgid "Subnet ID"
msgstr "Alt Ağ Kimliği"
msgid "Tenant ID"
msgstr "Kiracı Kimliği"
msgid ""
"The Available Instances table contains existing compute instances that can "
"be added as members\n"
" of the pool. Use the \"Add external member\" button to add a member not "
"found in the Available\n"
" Instances table."
msgstr ""
"Kullanılabilir sunucular tablosu havuzun üyeleri olarak eklenebilecek mevcut "
"hesaplama sunucularını içerir\n"
" Kullanılabilir Sunucular tablosunda bulunmayan bir üye eklemek için "
"\"Harici üye ekle\" düğmesini kullanın."
msgid "The IP address is not valid."
msgstr "IP adresi geçerli değil."
msgid "The URL path is not valid."
msgstr "URL yolu geçerli değil."
msgid "The expected status code is not valid."
msgstr "Beklenen durum kodu geçerli değil."
#, python-format
msgid "The following health monitor could not be deleted: %s."
msgstr "Şu sağlık izleyici silinemedi: %s."
#, python-format
msgid ""
"The following listeners could not be deleted, possibly due to existing "
"pools: %s."
msgstr "Şu dinleyiciler silinemedi, muhtemelen mevcut havuzlar sebebiyle: %s."
#, python-format
msgid "The following listeners will not be deleted due to existing pools: %s."
msgstr "Şu dinleyiciler mevcut havuzlar nedeniyle silinmeyecek: %s."
#, python-format
msgid "The following load balancers are pending and cannot be deleted: %s."
msgstr "Bu yük dengeleyiciler bekleme aşamasında ev silinemezler: %s."
#, python-format
msgid ""
"The following load balancers could not be deleted, possibly due to existing "
"listeners: %s."
msgstr ""
"Bu yük dengeleyiciler silinemedi, muhtemelen mevcut dinleyiciler yüzünden: "
"%s."
#, python-format
msgid "The following pool could not be deleted: %s."
msgstr "Bu havuz silinemedi: %s."
msgid "The health check interval must be greater than or equal to the timeout."
msgstr ""
"Sağlık kontrolü aralığı zaman aşımına eşit ya da zaman aşımından yüksek "
"olmalı."
msgid "The health monitor has been updated."
msgstr "Sağlık izleyici güncellendi."
msgid ""
"The health monitor is used to determine the health of your pool members. "
"Health checks\n"
" routinely run against each member within the pool and the result of the "
"health check is used\n"
" to determine if the member receives new connections. Each pool can only "
"have one health\n"
" monitor."
msgstr ""
"Sağlık izleyici havuz üyelerinizin sağlığına karar vermede kullanılır. "
"Sağlık kontrolleri havuzun her\n"
" üyesine aralıklarla yapılır ve sağlık kontrolü sonucuna göre üyenin yeni "
"bağlantı alıp almayacağına\n"
" karar verilir. Her havuzun sadece bir sağlık izleyicisi olabilir."
msgid "The listener has been updated."
msgstr "Dinleyici güncellendi."
msgid "The load balancer has been updated."
msgstr "Yük dengeleyici güncellendi."
msgid ""
"The load balancer occupies a neutron network port and has an IP address "
"assigned from a subnet."
msgstr ""
"Yük dengeleyici bir neutron ağ bağlantı noktası alır ve alt ağdan bir IP "
"adresi atanır."
msgid "The max retry count must be a number between 1 and 10."
msgstr "Azami yeniden deneme sayısı 1 ve 10 arasında bir sayı olmalı."
msgid "The pool has been updated."
msgstr "Havuz güncellendi."
msgid "The pool members have been updated."
msgstr "Havuz üyeleri güncellendi."
msgid "The port must be a number between 1 and 65535."
msgstr "Bağlantı noktası 1 ve 65535 arasında bir sayı olmalı."
msgid ""
"The port must be unique among all listeners attached to this load balancer."
msgstr ""
"Bağlantı noktası bu yük dengeleyiciye atanmış tüm dinleyiciler arasında "
"benzersiz olmalı."
msgid "The timeout must be a number greater than or equal to 0."
msgstr "Zaman aşımı 0 ya da 0'dan büyük olmalı."
msgid "The weight must be a number between 1 and 256."
msgstr "Ağırlık 1 ve 256 arasında bir sayı olmalı."
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared to the other members of the pool."
msgstr ""
"Bir üyenin ağırlığı havuzun diğer üyelerine göre servis vereceği istek veya "
"bağlantı oranını gösterir."
msgid "Timeout"
msgstr "Zaman aşımı"
msgid "Type"
msgstr "Tür"
msgid "URL Path"
msgstr "URL Yolu"
msgid "URL path"
msgstr "URL yolu"
msgid "Unable to create health monitor."
msgstr "Sağlık izleyici oluşturulamadı."
msgid "Unable to create listener."
msgstr "Dinleyici oluşturulamıyor."
msgid "Unable to create load balancer."
msgstr "Yük dengeleyici oluşturulamıyor."
msgid "Unable to create pool."
msgstr "Havuz oluşturulamıyor."
msgid "Unable to delete health monitor."
msgstr "Sağlık izleyici silinemedi."
msgid "Unable to delete listener."
msgstr "Dinleyici silinemiyor."
msgid "Unable to delete load balancer."
msgstr "Yük dengeleyici silinemiyor."
msgid "Unable to delete pool."
msgstr "Havuz silinemiyor."
#, python-format
msgid "Unable to disassociate floating IP address from load balancer: %s."
msgstr "Değişken IP adresi yük dengeleyiciden ayırılamıyor: %s."
msgid "Unable to retrieve SSL certificates."
msgstr "SSL Sertifikaları alınamıyor."
msgid "Unable to retrieve health monitor."
msgstr "Sağlık izleyici alınamadı."
msgid "Unable to retrieve listener."
msgstr "Dinleyici alınamıyor."
msgid "Unable to retrieve listeners."
msgstr "Dinleyiciler alınamıyor."
msgid "Unable to retrieve load balancer."
msgstr "Yük dengeleyici alınamıyor."
msgid "Unable to retrieve load balancers."
msgstr "Yük dengeleyiciler alınamıyor."
msgid "Unable to retrieve member."
msgstr "Üye alınamıyor."
msgid "Unable to retrieve members."
msgstr "Üyeler alınamıyor."
msgid "Unable to retrieve pool."
msgstr "Havuz alınamıyor."
msgid "Unable to retrieve secrets."
msgstr "Gizler alınamıyor."
msgid "Unable to update health monitor."
msgstr "Sağlık izleyici güncellenemedi."
msgid "Unable to update listener."
msgstr "Dinleyici güncellenemiyor."
msgid "Unable to update load balancer."
msgstr "Yük dengeleyici güncellenemiyor."
msgid "Unable to update member list."
msgstr "Üye listesi güncellenemiyor."
msgid "Unable to update member."
msgstr "Üye güncellenemiyor."
msgid "Unable to update pool."
msgstr "Havuz güncellenemiyor."
msgid "Update"
msgstr "Güncelle"
msgid "Update Health Monitor"
msgstr "Sağlık İzleyiciyi Güncelle"
msgid "Update Listener"
msgstr "Dinleyiciyi Güncelle"
msgid "Update Load Balancer"
msgstr "Yük Dengeleyiciyi Güncelle"
msgid "Update Member Weight"
msgstr "Üye Ağırlığını Güncelle"
msgid "Update Pool"
msgstr "Havuzu Güncelle"
msgid "Update Weight"
msgstr "Ağırlığı Güncelle"
msgid "Weight"
msgstr "Ağırlık"
#, python-format
msgid ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
msgstr ""
"Değişken IP adresini \"%s\" yük dengeleyicisinden ayırmak üzeresiniz. Lütfen "
"onaylayın."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
msgstr ""
"\"%s\" seçtiniz. Lütfen seçiminizi onaylayın. Silinen sağlık izleyiciler "
"geri getirilemez."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted listeners "
"are not recoverable."
msgstr ""
"\"%s\" seçtiniz. Lütfen seçiminizi onaylayın. Silinen dinleyiciler geri "
"getirilemez."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
msgstr ""
"\"%s\" seçtiniz. Lütfen seçiminizi onaylayın. Silinen yük dengeleyiciler "
"geri getirilemezler."
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."
msgstr ""
"\"%s\" seçtiniz. Lütfen seçiminizi onaylayın. Silinen havuzlar geri "
"getirilemez."

View File

@ -1,18 +0,0 @@
# liuyanfu <lyf219@163.com>, 2016. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-02-05 21:38+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2016-10-21 12:54+0000\n"
"Last-Translator: liuyanfu <lyf219@163.com>\n"
"Language-Team: Chinese (China)\n"
"Language: zh_CN\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
msgid "Load Balancers"
msgstr "负载均衡"

View File

@ -1,676 +0,0 @@
# BillXiang <m13250816269@163.com>, 2016. #zanata
# Bin <liubin@glab.cn>, 2017. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-lbaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2018-03-29 00:48+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2017-07-28 02:53+0000\n"
"Last-Translator: Bin <liubin@glab.cn>\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 "%(ip)s..."
msgstr "%(ip)s..."
msgid "A new health monitor is being created."
msgstr "一个新的健康监控器正在创建。"
msgid "A new listener is being created."
msgstr "一个新的监听器正在创建。"
msgid "A new load balancer is being created."
msgstr "一个新的负载均衡器正在创建。"
msgid "A new pool is being created."
msgstr "一个新的资源池正在创建。"
msgid ""
"A pool represents a group of members over which the load balancing will be "
"applied."
msgstr "资源池代表负载均衡器提供的一组成员。"
msgid "Actions"
msgstr "行为"
msgid "Active"
msgstr "运行中"
msgid "Add"
msgstr "添加"
msgid "Add external member"
msgstr "添加外部成员"
msgid "Add members to the load balancer pool."
msgstr "为负载均衡池添加成员。"
msgid "Add/Remove Pool Members"
msgstr "添加/移除负载均衡池成员"
msgid "Address"
msgstr "地址"
msgid "Admin State Up"
msgstr "管理状态:启动"
msgid "Allocated Members"
msgstr "分配成员"
msgid "An error occurred. Please try again later."
msgstr "发生错误,请稍后重试。"
msgid "Associate"
msgstr "关联"
msgid "Associate Floating IP"
msgstr "关联浮动IP"
msgid "Associate Floating IP Address"
msgstr "关联浮动IP地址"
msgid "Associating floating IP with load balancer."
msgstr "为负载均衡器关联浮动IP。"
msgid "Available Instances"
msgstr "可用实例"
msgid "Back"
msgstr "后退"
msgid "Cancel"
msgstr "取消"
msgid "Certificate Name"
msgstr "证书名称"
msgid "Confirm Delete Health Monitor"
msgstr "确认删除健康监控器。"
msgid "Confirm Delete Listeners"
msgstr "确认删除监听器。"
msgid "Confirm Delete Load Balancers"
msgstr "确认删除负载均衡器"
msgid "Confirm Delete Pool"
msgstr "确认删除池"
msgid "Confirm Disassociate Floating IP Address"
msgstr "确认解除关联浮动IP地址。"
msgid "Connection Limit"
msgstr "连接限制"
msgid "Create Health Monitor"
msgstr "创建健康监控器。"
msgid "Create Listener"
msgstr "创建监听器"
msgid "Create Load Balancer"
msgstr "创建负载均衡器"
msgid "Create Pool"
msgstr "创建资源池"
msgid "Default Pool ID"
msgstr "默认资源池ID"
msgid "Degraded"
msgstr "衰退"
msgid "Delay"
msgstr "延迟"
msgid "Delete Health Monitor"
msgstr "删除健康监控"
msgid "Delete Listener"
msgstr "删除监听器"
msgid "Delete Listeners"
msgstr "删除监听器"
msgid "Delete Load Balancer"
msgstr "删除负载均衡器"
msgid "Delete Load Balancers"
msgstr "删除负载均衡器"
msgid "Delete Pool"
msgstr "删除资源池"
#, python-format
msgid "Deleted health monitor: %s."
msgstr "删除健康监控器:%s。"
#, python-format
msgid "Deleted listeners: %s."
msgstr "删除监听器:%s。"
#, python-format
msgid "Deleted load balancers: %s."
msgstr "删除负载均衡器:%s。"
#, python-format
msgid "Deleted pool: %s."
msgstr "删除池:%s。"
msgid "Description"
msgstr "描述"
msgid "Disassociate"
msgstr "取消关联"
msgid "Disassociate Floating IP"
msgstr "解除浮动IP关联"
#, python-format
msgid "Disassociated floating IP address from load balancer: %s."
msgstr "从负载均衡器取解除浮动IP关联%s。"
msgid ""
"Each port that listens for traffic on a particular load balancer is "
"configured separately and\n"
" tied to the load balancer. Multiple listeners can be associated with the "
"same load balancer but\n"
" each must use a unique port."
msgstr ""
"负载均衡器中的每一个监听的端口独立地配置并与负载均衡器关联。\n"
"多个监听器关联到同一个负载均衡器上,\n"
"但每个都必须使用唯一的端口。"
msgid "Edit"
msgstr "编辑"
msgid "Edit Pool"
msgstr "编辑资源池"
msgid "Error"
msgstr "错误"
msgid "Expected Codes"
msgstr "预期的编码"
msgid "Expected status codes"
msgstr "期望的状态码"
msgid "Expiration Date"
msgstr "截止日期"
msgid "Floating IP Address"
msgstr "浮动IP地址"
msgid "Floating IP addresses"
msgstr "浮动IP地址"
msgid "Floating IP pools"
msgstr "浮动IP池"
msgid "HTTP Method"
msgstr "HTTP方法"
msgid "HTTP method"
msgstr "HTTP方法"
msgid "Health Monitor ID"
msgstr "健康监听器ID"
msgid "ID"
msgstr "ID"
msgid "IP Address"
msgstr "IP地址"
#, python-format
msgid "IP Addresses (%(count)s)"
msgstr "IP地址(%(count)s)"
msgid "IP address"
msgstr "IP地址"
msgid ""
"If the listener uses the TERMINATED_HTTPS protocol, then one or more SSL "
"certificates must\n"
" be selected. The first certificate will be the default."
msgstr ""
"如果监听器使用TERMINATED_HTTPS协议则必须选择一个或多个SSL证书。\n"
"默认选择第一个。"
msgid "Inactive"
msgstr "失效"
msgid "Least Connections"
msgstr "最少连接数"
#, python-format
msgid "Listener %(index)s"
msgstr "监听器%(index)s"
msgid "Listener 1"
msgstr "监听器1"
msgid "Listener Details"
msgstr "监听器详情"
msgid "Listener ID"
msgstr "监听器ID"
msgid "Listeners"
msgstr "监控器"
#, python-format
msgid "Load Balancer %(index)s"
msgstr "负载均衡器%(index)s"
msgid "Load Balancer Algorithm"
msgstr "负载均衡器算法"
msgid "Load Balancer Details"
msgstr "负载均衡器详情"
msgid "Load Balancer ID"
msgstr "负载均衡器ID"
msgid "Load Balancers"
msgstr "负载均衡器"
msgid "Loading"
msgstr "加载中"
msgid "Max Retries"
msgstr "最大尝试次数"
msgid "Member ID"
msgstr "成员ID"
msgid "Members"
msgstr "成员"
msgid ""
"Members are the actual IP addresses that will receive traffic from the load "
"balancer. Each\n"
" member must have a unique combination of IP address and port."
msgstr ""
"成员是在负载均衡器中通信的实际IP地址。\n"
"每个成员必须有一个唯一关联的IP地址和端口。"
msgid "Monitor Details"
msgstr "监控详情"
msgid "Monitor ID"
msgstr "监控ID"
msgid "Name"
msgstr "名称"
msgid "No available certificates"
msgstr "无可用证书"
msgid "No available instances"
msgstr "无可用实例"
msgid "No items to display."
msgstr "没有要显示的项目。"
msgid "No members have been allocated"
msgstr "没有成员分配"
msgid "None"
msgstr "无"
msgid "Offline"
msgstr "离线"
msgid "Online"
msgstr "在线"
msgid "Operating Status"
msgstr "操作状态"
msgid "Overview"
msgstr "概览"
msgid "Pending Create"
msgstr "暂挂创建"
msgid "Pending Delete"
msgstr "暂挂删除"
msgid "Pending Update"
msgstr "暂挂更新"
msgid "Pool 1"
msgstr "资源池1"
msgid "Pool Details"
msgstr "资源池详情"
msgid "Pool ID"
msgstr "资源池ID"
msgid "Pool Members"
msgstr "资源池成员"
msgid "Pool member weight has been updated."
msgstr "负载均衡池成员权重已经更新。"
msgid "Port"
msgstr "端口"
msgid "Port ID"
msgstr "端口ID"
msgid "Protocol"
msgstr "协议"
msgid "Protocol Port"
msgstr "协议端口"
msgid "Provide the details for the health monitor."
msgstr "为健康监控提供详情。"
msgid "Provide the details for the listener."
msgstr "为监听器提供详情。"
msgid "Provide the details for the load balancer."
msgstr "为负载均衡器提供详情。"
msgid "Provide the details for the pool."
msgstr "为资源池提供详情。"
msgid "Provider"
msgstr "提供者"
msgid "Provisioning Status"
msgstr "配置状态"
msgid "Remove"
msgstr "移除"
msgid "Round Robin"
msgstr "轮询"
msgid "SSL Certificates"
msgstr "SSL证书"
msgid ""
"Select a floating IP address to associate with the load balancer or a "
"floating IP pool in which to allocate a new floating IP address."
msgstr ""
"选择一个浮动IP地址关联一个负载均衡器或为浮动IP池分配一个新的浮动IP地址池。"
msgid "Select certificates from the available certificates below"
msgstr "从下面可选的证书中选择证书"
msgid "Select one or more SSL certificates for the listener."
msgstr "为监听器选择一个或多个SSL证书。"
msgid "Session Persistence"
msgstr "会话持久化"
msgid "Source IP"
msgstr "源IP"
msgid "Subnet ID"
msgstr "子网ID"
msgid "Tenant ID"
msgstr "租户ID"
msgid ""
"The Available Instances table contains existing compute instances that can "
"be added as members\n"
" of the pool. Use the \"Add external member\" button to add a member not "
"found in the Available\n"
" Instances table."
msgstr ""
"可用实例表显示了存在的可以添加为资源池成员的计算实例。\n"
"使用“添加外部成员”按钮可以添加在可用实例表中找不到的成员。"
msgid "The IP address is not valid."
msgstr "IP地址无效。"
msgid "The URL path is not valid."
msgstr "URL路径无效。"
msgid "The expected status code is not valid."
msgstr "期望状态码无效。"
#, python-format
msgid "The following health monitor could not be deleted: %s."
msgstr "以下健康监控器无法删除:%s。"
#, python-format
msgid ""
"The following listeners could not be deleted, possibly due to existing "
"pools: %s."
msgstr "由于存在的资源池,以下的监听器可能无法删除:%s。"
#, python-format
msgid "The following listeners will not be deleted due to existing pools: %s."
msgstr "由于存在资源池,以下的监听器将不能删除:%s。"
#, python-format
msgid "The following load balancers are pending and cannot be deleted: %s."
msgstr "以下的负载均衡器正在挂起不能删除:%s。"
#, python-format
msgid ""
"The following load balancers could not be deleted, possibly due to existing "
"listeners: %s."
msgstr "因为存在监听器,以下的负载均衡器可能无法删除:%s。"
#, python-format
msgid "The following pool could not be deleted: %s."
msgstr "以下资源池无法删除:%s。"
msgid "The health check interval must be greater than or equal to the timeout."
msgstr "健康检查间隔必须大于或等于超时时限。"
msgid "The health monitor has been updated."
msgstr "健康监控器已经更新。"
msgid ""
"The health monitor is used to determine the health of your pool members. "
"Health checks\n"
" routinely run against each member within the pool and the result of the "
"health check is used\n"
" to determine if the member receives new connections. Each pool can only "
"have one health\n"
" monitor."
msgstr ""
"健康监控用来确定你的资源池成员的健康状况。\n"
"健康检查通常在资源池中与每个成员隔离运行,健康检查的结果通过成员接收到新的连"
"接来确定。\n"
"每个资源池只能有一个健康监控。"
msgid "The listener has been updated."
msgstr "监听器已经删除 。"
msgid "The load balancer has been updated."
msgstr "负载均衡器已经更新。"
msgid ""
"The load balancer occupies a neutron network port and has an IP address "
"assigned from a subnet."
msgstr "负载均衡器占用一个neutron网络端口和一个子网分配的IP地址。"
msgid "The max retry count must be a number between 1 and 10."
msgstr "最大重试次数必须为1到10之间的整数。"
msgid "The pool has been updated."
msgstr "资源池已经更新。"
msgid "The pool members have been updated."
msgstr "负载均衡池成员权重已经更新。"
msgid "The port must be a number between 1 and 65535."
msgstr "端口必须为1到65536之间的整数。"
msgid ""
"The port must be unique among all listeners attached to this load balancer."
msgstr "负载均衡器上的所有监听器之间的端口号必须唯一。"
msgid "The timeout must be a number greater than or equal to 0."
msgstr "超时时限必须为一个大于等于0的整数。"
msgid "The weight must be a number between 1 and 256."
msgstr "权重必须为1到256的整数。"
msgid ""
"The weight of a member determines the portion of requests or connections it "
"services compared to the other members of the pool."
msgstr "成员的权重决定了它在服务中与其他池成员的请求和连接的占比。"
msgid "Timeout"
msgstr "超时时限"
msgid "Type"
msgstr "类型"
msgid "URL Path"
msgstr "URL路径"
msgid "URL path"
msgstr "URL路径"
msgid "Unable to create health monitor."
msgstr "无法创建健康监控。"
msgid "Unable to create listener."
msgstr "无法创建监听器。"
msgid "Unable to create load balancer."
msgstr "无法创建负载均衡器。"
msgid "Unable to create pool."
msgstr "无法创建资源池。"
msgid "Unable to delete health monitor."
msgstr "无法删除健康监控。"
msgid "Unable to delete listener."
msgstr "无法删除监听器。"
msgid "Unable to delete load balancer."
msgstr "无法删除负载均衡器。"
msgid "Unable to delete pool."
msgstr "无法删除资源池。"
#, python-format
msgid "Unable to disassociate floating IP address from load balancer: %s."
msgstr "无法从负载均衡器解除浮动IP地址关联%s。"
msgid "Unable to retrieve SSL certificates."
msgstr "不能获取SSL证书。"
msgid "Unable to retrieve health monitor."
msgstr "无法获取健康监控。"
msgid "Unable to retrieve listener."
msgstr "无法检索监听器。"
msgid "Unable to retrieve listeners."
msgstr "无法检索监听器。"
msgid "Unable to retrieve load balancer status tree."
msgstr "无法检索负载均衡状态树。"
msgid "Unable to retrieve load balancer."
msgstr "无法检索负载均衡器。"
msgid "Unable to retrieve load balancers."
msgstr "无法检索负载均衡器。"
msgid "Unable to retrieve member."
msgstr "无法检索成员。"
msgid "Unable to retrieve members."
msgstr "无法检索成员。"
msgid "Unable to retrieve pool."
msgstr "无法检索资源池。"
msgid "Unable to retrieve secrets."
msgstr "无法获取密匙。"
msgid "Unable to update health monitor."
msgstr "无法更新健康监控。"
msgid "Unable to update listener."
msgstr "无法更新监听器。"
msgid "Unable to update load balancer."
msgstr "无法更新负载均衡器。"
msgid "Unable to update member list."
msgstr "无法更新成员列表。"
msgid "Unable to update member."
msgstr "无法更新成员。"
msgid "Unable to update pool."
msgstr "无法更新资源池。"
msgid "Update"
msgstr "更新"
msgid "Update Health Monitor"
msgstr "更新健康监控器。"
msgid "Update Listener"
msgstr "更新监听器"
msgid "Update Load Balancer"
msgstr "更新负载均衡器"
msgid "Update Member Weight"
msgstr "更新成员权重"
msgid "Update Pool"
msgstr "更新资源池"
msgid "Update Weight"
msgstr "更新权重"
msgid "Weight"
msgstr "权重"
#, python-format
msgid ""
"You are about to disassociate the floating IP address from load balancer \"%s"
"\". Please confirm."
msgstr "你将从负载均衡器解除浮动IP地址关联“%s”请确认。"
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted health "
"monitors are not recoverable."
msgstr "你选择了“%s”。请确认你的选择删除健康监控器无法恢复。"
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted listeners "
"are not recoverable."
msgstr "你选择了“%s”。请确认你的选择删除监听器无法恢复。"
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted load "
"balancers are not recoverable."
msgstr "你选择了“%s”。请确认你的选择删除的负载均衡无法恢复。"
#, python-format
msgid ""
"You have selected \"%s\". Please confirm your selection. Deleted pools are "
"not recoverable."
msgstr "你选择了“%s”。请确认你的选择删除的池无法恢复。"

View File

@ -1,16 +0,0 @@
#!/bin/bash -x
# This script will be executed inside npm postinstall task, see package.json
# pull down the test shim from horizon master because it's not
# included in the installed horizon packages
if [ ! -f test-shim.js ];
then
wget -nv -t 3 https://raw.githubusercontent.com/openstack/horizon/master/test-shim.js
fi
echo "Note: neutron-lbaas-dashboard is now deprecated."
echo "Please see the FAQ: https://wiki.openstack.org/wiki/Neutron/LBaaS/Deprecation"
echo "Creating a tox env which will contain xStatic libraries, horizon, and openstack_dashboard"
tox -epy27 --notest;

View File

@ -1,86 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
angular
.module('horizon.app.core.openstack-service-api')
.factory('horizon.app.core.openstack-service-api.barbican', barbicanAPI);
barbicanAPI.$inject = [
'horizon.framework.util.http.service',
'horizon.framework.widgets.toast.service'
];
/**
* @ngdoc service
* @name horizon.app.core.openstack-service-api.barbican
* @description Provides direct pass through to barbican with NO abstraction.
* @param apiService The horizon core API service.
* @param toastService The horizon toast service.
* @returns The barbican service API.
*/
function barbicanAPI(apiService, toastService) {
var service = {
getCertificates: getCertificates,
getSecrets: getSecrets
};
return service;
///////////////
// SSL Certificate Containers
/**
* @name horizon.app.core.openstack-service-api.barbican.getCertificates
* @description
* Get a list of SSL certificate containers.
*
* @param {boolean} quiet
* The listing result is an object with property "items". Each item is
* a certificate container.
*/
function getCertificates(quiet) {
var promise = apiService.get('/api/barbican/certificates/');
return quiet ? promise : promise.error(function handleError() {
toastService.add('error', gettext('Unable to retrieve SSL certificates.'));
});
}
// Secrets
/**
* @name horizon.app.core.openstack-service-api.barbican.getSecrets
* @description
* Get a list of secrets.
*
* @param {boolean} quiet
* The listing result is an object with property "items". Each item is
* a secret.
*/
function getSecrets(quiet) {
var promise = apiService.get('/api/barbican/secrets/');
return quiet ? promise : promise.error(function handleError() {
toastService.add('error', gettext('Unable to retrieve secrets.'));
});
}
}
}());

View File

@ -1,73 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('Barbican API', function() {
var testCall, service;
var apiService = {};
var toastService = {};
beforeEach(module('horizon.mock.openstack-service-api', function($provide, initServices) {
testCall = initServices($provide, apiService, toastService);
}));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(inject(['horizon.app.core.openstack-service-api.barbican', function(barbicanAPI) {
service = barbicanAPI;
}]));
it('defines the service', function() {
expect(service).toBeDefined();
});
var tests = [
{
func: "getCertificates",
method: "get",
path: "/api/barbican/certificates/",
error: "Unable to retrieve SSL certificates."
},
{
func: "getSecrets",
method: "get",
path: "/api/barbican/secrets/",
error: "Unable to retrieve secrets."
}
];
// Iterate through the defined tests and apply as Jasmine specs.
angular.forEach(tests, function(params) {
it('defines the ' + params.func + ' call properly', function() {
var callParams = [apiService, service, toastService, params];
testCall.apply(this, callParams);
});
});
it('supresses the error if instructed for getCertificates', function() {
spyOn(apiService, 'get').and.returnValue("promise");
expect(service.getCertificates(true)).toBe("promise");
});
it('supresses the error if instructed for getSecrets', function() {
spyOn(apiService, 'get').and.returnValue("promise");
expect(service.getSecrets(true)).toBe("promise");
});
});
})();

View File

@ -1,465 +0,0 @@
/*
* Copyright 2015 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
angular
.module('horizon.app.core.openstack-service-api')
.factory('horizon.app.core.openstack-service-api.nlbaasv2', lbaasv2API);
lbaasv2API.$inject = [
'horizon.framework.util.http.service',
'horizon.framework.widgets.toast.service'
];
/**
* @ngdoc service
* @name horizon.app.core.openstack-service-api.loadbalancers
* @description Provides direct pass through to neutron LBaaS v2 with NO abstraction.
* @param apiService The horizon core API service.
* @param toastService The horizon toast service.
* @returns The LBaaS V2 service API.
*/
function lbaasv2API(apiService, toastService) {
var service = {
getLoadBalancers: getLoadBalancers,
getLoadBalancer: getLoadBalancer,
deleteLoadBalancer: deleteLoadBalancer,
createLoadBalancer: createLoadBalancer,
editLoadBalancer: editLoadBalancer,
getLoadBalancerStatusTree: getLoadBalancerStatusTree,
getListeners: getListeners,
getListener: getListener,
createListener: createListener,
editListener: editListener,
deleteListener: deleteListener,
getPool: getPool,
createPool: createPool,
editPool: editPool,
deletePool: deletePool,
getMembers: getMembers,
getMember: getMember,
editMember: editMember,
getHealthMonitor: getHealthMonitor,
deleteHealthMonitor: deleteHealthMonitor,
createHealthMonitor: createHealthMonitor,
editHealthMonitor: editHealthMonitor,
updateMemberList: updateMemberList
};
return service;
///////////////
// Load Balancers
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.getLoadBalancers
* @description
* Get a list of load balancers.
* @param {boolean} full
* The listing result is an object with property "items". Each item is
* a load balancer.
*/
function getLoadBalancers(full) {
var params = { full: full };
return apiService.get('/api/nlbaas/loadbalancers/', { params: params })
.error(function () {
toastService.add('error', gettext('Unable to retrieve load balancers.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.getLoadBalancer
* @description
* Get a single load balancer by ID
* @param {string} id
* @param {boolean} full
* Specifies the id of the load balancer to request.
*/
function getLoadBalancer(id, full) {
var params = { full: full };
return apiService.get('/api/nlbaas/loadbalancers/' + id + '/', { params: params })
.error(function () {
toastService.add('error', gettext('Unable to retrieve load balancer.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.deleteLoadBalancer
* @description
* Delete a single load balancer by ID
* @param {string} id
* @param {boolean} quiet
* Specifies the id of the load balancer to delete.
*/
function deleteLoadBalancer(id, quiet) {
var promise = apiService.delete('/api/nlbaas/loadbalancers/' + id + '/');
return quiet ? promise : promise.error(function () {
toastService.add('error', gettext('Unable to delete load balancer.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.createLoadBalancer
* @description
* Create a new load balancer
* @param {object} spec
* Specifies the data used to create the new load balancer.
*/
function createLoadBalancer(spec) {
return apiService.post('/api/nlbaas/loadbalancers/', spec)
.error(function () {
toastService.add('error', gettext('Unable to create load balancer.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.editLoadBalancer
* @description
* Edit a load balancer
* @param {string} id
* @param {object} spec
* Specifies the data used to update the load balancer.
*/
function editLoadBalancer(id, spec) {
return apiService.put('/api/nlbaas/loadbalancers/' + id + '/', spec)
.error(function () {
toastService.add('error', gettext('Unable to update load balancer.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.getLoadBalancerStatusTree
* @description
* Get the status tree for a load balancer
* @param {string} id
* Specifies the id of the load balancer to request the status tree for.
*/
function getLoadBalancerStatusTree(id) {
return apiService.get('/api/nlbaas/loadbalancers/' + id + '/statuses/')
.error(function () {
toastService.add('error', gettext('Unable to retrieve load balancer status tree.'));
});
}
// Listeners
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.getListeners
* @description
* Get the list of listeners.
* If a loadbalancer ID is passed as a parameter, the returning list of
* listeners will be filtered to include only those listeners under the
* specified loadbalancer.
* @param {string} id
* Specifies the id of the loadbalancer to request listeners for.
*
* The listing result is an object with property "items". Each item is
* a listener.
*/
function getListeners(id) {
var params = id ? {params: {loadbalancerId: id}} : {};
return apiService.get('/api/nlbaas/listeners/', params)
.error(function () {
toastService.add('error', gettext('Unable to retrieve listeners.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.getListener
* @description
* Get a single listener by ID.
* @param {string} id
* Specifies the id of the listener to request.
* @param {boolean} includeChildResources
* If truthy, all child resources below the listener will be included in the response.
*/
function getListener(id, includeChildResources) {
var params = includeChildResources
? {params: {includeChildResources: includeChildResources}}
: {};
return apiService.get('/api/nlbaas/listeners/' + id + '/', params)
.error(function () {
toastService.add('error', gettext('Unable to retrieve listener.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.createListener
* @description
* Create a new listener
* @param {object} spec
* Specifies the data used to create the new listener.
*/
function createListener(spec) {
return apiService.post('/api/nlbaas/listeners/', spec)
.error(function () {
toastService.add('error', gettext('Unable to create listener.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.editListener
* @description
* Edit a listener
* @param {string} id
* Specifies the id of the listener to update.
* @param {object} spec
* Specifies the data used to update the listener.
*/
function editListener(id, spec) {
return apiService.put('/api/nlbaas/listeners/' + id + '/', spec)
.error(function () {
toastService.add('error', gettext('Unable to update listener.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.deleteListener
* @description
* Delete a single listener by ID
* @param {string} id
* @param {boolean} quiet
* Specifies the id of the listener to delete.
*/
function deleteListener(id, quiet) {
var promise = apiService.delete('/api/nlbaas/listeners/' + id + '/');
return quiet ? promise : promise.error(function () {
toastService.add('error', gettext('Unable to delete listener.'));
});
}
// Pools
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.getPool
* @description
* Get a single Pool by ID.
* @param {string} id
* Specifies the id of the pool to request.
* @param {boolean} includeChildResources
* If truthy, all child resources below the pool will be included in the response.
*/
function getPool(id, includeChildResources) {
var params = includeChildResources
? {params: {includeChildResources: includeChildResources}}
: {};
return apiService.get('/api/nlbaas/pools/' + id + '/', params)
.error(function () {
toastService.add('error', gettext('Unable to retrieve pool.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.createPool
* @description
* Create a new pool
* @param {object} spec
* Specifies the data used to create the new pool.
*/
function createPool(spec) {
return apiService.post('/api/nlbaas/pools/', spec)
.error(function () {
toastService.add('error', gettext('Unable to create pool.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.editPool
* @description
* Edit a pool
* @param {string} id
* Specifies the id of the pool to update.
* @param {object} spec
* Specifies the data used to update the pool.
*/
function editPool(id, spec) {
return apiService.put('/api/nlbaas/pools/' + id + '/', spec)
.error(function () {
toastService.add('error', gettext('Unable to update pool.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.deletePool
* @description
* Delete a single pool by ID
* @param {string} id
* @param {boolean} quiet
* Specifies the id of the pool to delete.
*/
function deletePool(id, quiet) {
var promise = apiService.delete('/api/nlbaas/pools/' + id + '/');
return quiet ? promise : promise.error(function () {
toastService.add('error', gettext('Unable to delete pool.'));
});
}
// Members
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.getMembers
* @description
* Get a list of members.
* @param {string} poolId
* Specifies the id of the pool the members belong to.
*
* The listing result is an object with property "items". Each item is
* a member.
*/
function getMembers(poolId) {
return apiService.get('/api/nlbaas/pools/' + poolId + '/members/')
.error(function () {
toastService.add('error', gettext('Unable to retrieve members.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.getMember
* @description
* Get a single pool Member by ID.
* @param {string} poolId
* Specifies the id of the pool the member belongs to.
* @param {string} memberId
* Specifies the id of the member to request.
*/
function getMember(poolId, memberId) {
return apiService.get('/api/nlbaas/pools/' + poolId + '/members/' + memberId + '/')
.error(function () {
toastService.add('error', gettext('Unable to retrieve member.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.editMember
* @description
* Edit a pool member.
* @param {string} id
* Specifies the id of the member to update.
* @param {object} spec
* Specifies the data used to update the member.
*/
function editMember(poolId, memberId, spec) {
return apiService.put('/api/nlbaas/pools/' + poolId + '/members/' + memberId + '/', spec)
.error(function () {
toastService.add('error', gettext('Unable to update member.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.updateMemberList
* @description
* Update the list of pool members by adding or removing the necessary members.
* @param {string} poolId
* Specifies the id of the pool the members belong to.
* @param {object} spec
* Specifies the data used to update the member list.
*/
function updateMemberList(poolId, spec) {
return apiService.put('/api/nlbaas/pools/' + poolId + '/members/', spec)
.error(function () {
toastService.add('error', gettext('Unable to update member list.'));
});
}
// Health Monitors
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.getHealthMonitor
* @description
* Get a single pool health monitor by ID.
* @param {string} monitorId
* Specifies the id of the health monitor.
*/
function getHealthMonitor(monitorId) {
return apiService.get('/api/nlbaas/healthmonitors/' + monitorId + '/')
.error(function () {
toastService.add('error', gettext('Unable to retrieve health monitor.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.editHealthMonitor
* @description
* Edit a health monitor
* @param {string} id
* Specifies the id of the health monitor to update.
* @param {object} spec
* Specifies the data used to update the health monitor.
*/
function editHealthMonitor(id, spec) {
return apiService.put('/api/nlbaas/healthmonitors/' + id + '/', spec)
.error(function () {
toastService.add('error', gettext('Unable to update health monitor.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.deleteHealthMonitor
* @description
* Delete a single health monitor by ID
* @param {string} id
* @param {boolean} quiet
* Specifies the id of the health monitor to delete.
*/
function deleteHealthMonitor(id, quiet) {
var promise = apiService.delete('/api/nlbaas/healthmonitors/' + id + '/');
return quiet ? promise : promise.error(function () {
toastService.add('error', gettext('Unable to delete health monitor.'));
});
}
/**
* @name horizon.app.core.openstack-service-api.nlbaasv2.createHealthMonitor
* @description
* Create a new health monitor
* @param {object} spec
* Specifies the data used to create the new health monitor.
*/
function createHealthMonitor(spec) {
return apiService.post('/api/nlbaas/healthmonitors/', spec)
.error(function () {
toastService.add('error', gettext('Unable to create health monitor.'));
});
}
}
}());

View File

@ -1,270 +0,0 @@
/*
* Copyright 2015 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 API', function() {
var testCall, service;
var apiService = {};
var toastService = {};
beforeEach(module('horizon.mock.openstack-service-api', function($provide, initServices) {
testCall = initServices($provide, apiService, toastService);
}));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(inject(['horizon.app.core.openstack-service-api.nlbaasv2', function(lbaasv2API) {
service = lbaasv2API;
}]));
it('defines the service', function() {
expect(service).toBeDefined();
});
var tests = [
{
func: 'getLoadBalancers',
method: 'get',
path: '/api/nlbaas/loadbalancers/',
error: 'Unable to retrieve load balancers.',
testInput: [ true ],
data: { params: { full: true } }
},
{
func: 'getLoadBalancer',
method: 'get',
path: '/api/nlbaas/loadbalancers/1234/',
error: 'Unable to retrieve load balancer.',
testInput: [ '1234', true ],
data: { params: { full: true } }
},
{
func: 'deleteLoadBalancer',
method: 'delete',
path: '/api/nlbaas/loadbalancers/1234/',
error: 'Unable to delete load balancer.',
testInput: [ '1234' ]
},
{
func: 'getLoadBalancerStatusTree',
method: 'get',
path: '/api/nlbaas/loadbalancers/1234/statuses/',
error: 'Unable to retrieve load balancer status tree.',
testInput: [ '1234' ]
},
{
func: 'getListeners',
method: 'get',
path: '/api/nlbaas/listeners/',
error: 'Unable to retrieve listeners.',
testInput: [ '1234' ],
data: { params: { loadbalancerId: '1234' } }
},
{
func: 'getListeners',
method: 'get',
path: '/api/nlbaas/listeners/',
data: {},
error: 'Unable to retrieve listeners.'
},
{
func: 'getListener',
method: 'get',
path: '/api/nlbaas/listeners/1234/',
data: { params: { includeChildResources: true } },
error: 'Unable to retrieve listener.',
testInput: [ '1234', true ]
},
{
func: 'getListener',
method: 'get',
path: '/api/nlbaas/listeners/1234/',
data: {},
error: 'Unable to retrieve listener.',
testInput: [ '1234', false ]
},
{
func: 'getPool',
method: 'get',
path: '/api/nlbaas/pools/1234/',
data: { params: { includeChildResources: true } },
error: 'Unable to retrieve pool.',
testInput: [ '1234', true ]
},
{
func: 'getPool',
method: 'get',
path: '/api/nlbaas/pools/1234/',
data: {},
error: 'Unable to retrieve pool.',
testInput: [ '1234', false ]
},
{
func: 'deletePool',
method: 'delete',
path: '/api/nlbaas/pools/1234/',
error: 'Unable to delete pool.',
testInput: [ '1234' ]
},
{
func: 'getMembers',
method: 'get',
path: '/api/nlbaas/pools/1234/members/',
error: 'Unable to retrieve members.',
testInput: [ '1234' ]
},
{
func: 'getMember',
method: 'get',
path: '/api/nlbaas/pools/1234/members/5678/',
error: 'Unable to retrieve member.',
testInput: [ '1234', '5678' ]
},
{
func: 'editMember',
method: 'put',
path: '/api/nlbaas/pools/1234/members/5678/',
error: 'Unable to update member.',
data: { weight: 2 },
testInput: [ '1234', '5678', { weight: 2 } ]
},
{
func: 'getHealthMonitor',
method: 'get',
path: '/api/nlbaas/healthmonitors/1234/',
error: 'Unable to retrieve health monitor.',
testInput: [ '1234' ]
},
{
func: 'editHealthMonitor',
method: 'put',
path: '/api/nlbaas/healthmonitors/1234/',
error: 'Unable to update health monitor.',
data: { name: 'healthmonitor-1' },
testInput: [ '1234', { name: 'healthmonitor-1' } ]
},
{
func: 'deleteHealthMonitor',
method: 'delete',
path: '/api/nlbaas/healthmonitors/1234/',
error: 'Unable to delete health monitor.',
testInput: [ '1234' ]
},
{
func: 'createLoadBalancer',
method: 'post',
path: '/api/nlbaas/loadbalancers/',
error: 'Unable to create load balancer.',
data: { name: 'loadbalancer-1' },
testInput: [ { name: 'loadbalancer-1' } ]
},
{
func: 'editLoadBalancer',
method: 'put',
path: '/api/nlbaas/loadbalancers/1234/',
error: 'Unable to update load balancer.',
data: { name: 'loadbalancer-1' },
testInput: [ '1234', { name: 'loadbalancer-1' } ]
},
{
func: 'createListener',
method: 'post',
path: '/api/nlbaas/listeners/',
error: 'Unable to create listener.',
data: { name: 'listener-1' },
testInput: [ { name: 'listener-1' } ]
},
{
func: 'editListener',
method: 'put',
path: '/api/nlbaas/listeners/1234/',
error: 'Unable to update listener.',
data: { name: 'listener-1' },
testInput: [ '1234', { name: 'listener-1' } ]
},
{
func: 'deleteListener',
method: 'delete',
path: '/api/nlbaas/listeners/1234/',
error: 'Unable to delete listener.',
testInput: [ '1234' ]
},
{
func: 'createPool',
method: 'post',
path: '/api/nlbaas/pools/',
error: 'Unable to create pool.',
data: { name: 'pool-1' },
testInput: [ { name: 'pool-1' } ]
},
{
func: 'editPool',
method: 'put',
path: '/api/nlbaas/pools/1234/',
error: 'Unable to update pool.',
data: { name: 'pool-1' },
testInput: [ '1234', { name: 'pool-1' } ]
},
{
func: 'createHealthMonitor',
method: 'post',
path: '/api/nlbaas/healthmonitors/',
error: 'Unable to create health monitor.',
data: { name: 'healthmonitor-1' },
testInput: [ { name: 'healthmonitor-1' } ]
},
{
func: 'updateMemberList',
method: 'put',
path: '/api/nlbaas/pools/1234/members/',
error: 'Unable to update member list.',
data: { name: 'member-1' },
testInput: [ '1234', { name: 'member-1' } ]
}
];
// Iterate through the defined tests and apply as Jasmine specs.
angular.forEach(tests, function(params) {
it('defines the ' + params.func + ' call properly', function() {
var callParams = [apiService, service, toastService, params];
testCall.apply(this, callParams);
});
});
it('supresses the error if instructed for deleteLoadBalancer', function() {
spyOn(apiService, 'delete').and.returnValue("promise");
expect(service.deleteLoadBalancer("whatever", true)).toBe("promise");
});
it('supresses the error if instructed for deleteListener', function() {
spyOn(apiService, 'delete').and.returnValue("promise");
expect(service.deleteListener("whatever", true)).toBe("promise");
});
it('supresses the error if instructed for deletePool', function() {
spyOn(apiService, 'delete').and.returnValue("promise");
expect(service.deletePool("whatever", true)).toBe("promise");
});
it('supresses the error if instructed for deleteHealthMonitor', function() {
spyOn(apiService, 'delete').and.returnValue("promise");
expect(service.deleteHealthMonitor("whatever", true)).toBe("promise");
});
});
})();

View File

@ -1,88 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.healthmonitors')
.factory('horizon.dashboard.project.nlbaasv2.healthmonitors.actions.create', createService);
createService.$inject = [
'$q',
'$location',
'horizon.dashboard.project.nlbaasv2.workflow.modal',
'horizon.app.core.openstack-service-api.policy',
'horizon.framework.util.i18n.gettext',
'horizon.framework.util.q.extensions'
];
/**
* @ngDoc factory
* @name horizon.dashboard.project.nlbaasv2.healthmonitors.actions.createService
* @description
* Provides the service for creating a health monitor resource.
* @param $q The angular service for promises.
* @param $location The angular $location service.
* @param workflowModal The LBaaS workflow modal service.
* @param policy The horizon policy service.
* @param gettext The horizon gettext function for translation.
* @param qExtensions Horizon extensions to the $q service.
* @returns The health monitor create service.
*/
function createService($q, $location, workflowModal, policy, gettext, qExtensions) {
var loadbalancerId, listenerId, poolId, statePromise;
var create = workflowModal.init({
controller: 'nLBaaSCreateHealthMonitorWizardController',
message: gettext('A new health monitor is being created.'),
handle: onCreate,
allowed: allowed
});
var service = {
init: init,
create: create
};
return service;
//////////////
function init(_loadbalancerId_, _listenerId_, _statePromise_) {
loadbalancerId = _loadbalancerId_;
listenerId = _listenerId_;
statePromise = _statePromise_;
return service;
}
function allowed(pool) {
poolId = pool.id;
return $q.all([
statePromise,
qExtensions.booleanAsPromise(!pool.healthmonitor_id),
policy.ifAllowed({ rules: [['neutron', 'create_health_monitor']] })
]);
}
function onCreate(response) {
var healthMonitorId = response.data.id;
$location.path('project/ngloadbalancersv2/' + loadbalancerId + '/listeners/' +
listenerId + '/pools/' + poolId + '/healthmonitors/' + healthMonitorId);
}
}
})();

View File

@ -1,106 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Create Health Monitor Action Service', function() {
var scope, $q, $location, policy, init, service, loadBalancerState;
function allowed(item) {
spyOn(policy, 'ifAllowed').and.returnValue(true);
var promise = service.create.allowed(item);
var allowed;
promise.then(function() {
allowed = true;
}, function() {
allowed = false;
});
scope.$apply();
expect(policy.ifAllowed).toHaveBeenCalledWith(
{rules: [['neutron', 'create_health_monitor']]});
return allowed;
}
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function($provide) {
$provide.value('$uibModal', {
open: function() {
return {
result: {
then: function(func) {
func({ data: { id: 'healthmonitor1' } });
}
}
};
}
});
}));
beforeEach(inject(function ($injector) {
scope = $injector.get('$rootScope').$new();
$q = $injector.get('$q');
policy = $injector.get('horizon.app.core.openstack-service-api.policy');
$location = $injector.get('$location');
service = $injector.get('horizon.dashboard.project.nlbaasv2.healthmonitors.actions.create');
init = service.init;
loadBalancerState = $q.defer();
}));
it('should define the correct service properties', function() {
expect(service.init).toBeDefined();
expect(service.create).toBeDefined();
});
it('should have the "allowed" and "perform" functions', function() {
expect(service.create.allowed).toBeDefined();
expect(service.create.perform).toBeDefined();
});
it('should allow creating a health monitor under an ACTIVE load balancer', function() {
loadBalancerState.resolve();
init('active', '1', loadBalancerState.promise);
expect(allowed({})).toBe(true);
});
it('should not allow creating a health monitor under a NON-ACTIVE load balancer', function() {
loadBalancerState.reject();
init('non-active', '1', loadBalancerState.promise);
expect(allowed({})).toBe(false);
});
it('should not allow creating a health monitor if one already exists', function() {
loadBalancerState.resolve();
init('active', '1', loadBalancerState.promise);
expect(allowed({ healthmonitor_id: '1234' })).toBe(false);
});
it('should redirect after create', function() {
loadBalancerState.resolve();
spyOn($location, 'path').and.callThrough();
init('loadbalancer1', 'listener1', loadBalancerState.promise).create.allowed({id: 'pool1'});
service.create.perform();
expect($location.path).toHaveBeenCalledWith(
'project/ngloadbalancersv2/loadbalancer1/listeners/listener1/pools/pool1/' +
'healthmonitors/healthmonitor1');
});
});
})();

View File

@ -1,46 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.healthmonitors')
.controller('nLBaaSCreateHealthMonitorWizardController', CreateHealthMonitorWizardController);
CreateHealthMonitorWizardController.$inject = [
'$scope',
'$routeParams',
'horizon.dashboard.project.nlbaasv2.workflow.model',
'horizon.dashboard.project.nlbaasv2.workflow.workflow',
'horizon.framework.util.i18n.gettext'
];
function CreateHealthMonitorWizardController(
$scope, $routeParams, model, workflowService, gettext
) {
var loadbalancerId = $routeParams.loadbalancerId;
var scope = $scope;
scope.model = model;
scope.submit = scope.model.submit;
scope.workflow = workflowService(
gettext('Create Health Monitor'),
'fa fa-cloud-download',
['monitor']
);
scope.model.initialize('monitor', false, loadbalancerId, scope.launchContext.id);
}
})();

View File

@ -1,63 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
describe('LBaaS v2 Create Health Monitor Wizard Controller', function() {
var ctrl;
var model = {
submit: function() {
return 'created';
},
initialize: angular.noop
};
var workflow = function() {
return 'foo';
};
var scope = {
launchContext: {id: 'pool1'}
};
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function ($provide) {
$provide.value('horizon.dashboard.project.nlbaasv2.workflow.model', model);
$provide.value('horizon.dashboard.project.nlbaasv2.workflow.workflow', workflow);
}));
beforeEach(inject(function ($controller) {
spyOn(model, 'initialize');
ctrl = $controller('nLBaaSCreateHealthMonitorWizardController', { $scope: scope });
}));
it('defines the controller', function() {
expect(ctrl).toBeDefined();
});
it('calls initialize on the given model', function() {
expect(model.initialize).toHaveBeenCalled();
});
it('sets scope.workflow to the given workflow', function() {
expect(scope.workflow).toBe('foo');
});
it('defines scope.submit', function() {
expect(scope.submit).toBeDefined();
expect(scope.submit()).toBe('created');
});
});
})();

View File

@ -1,117 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.healthmonitors')
.factory('horizon.dashboard.project.nlbaasv2.healthmonitors.actions.delete', deleteService);
deleteService.$inject = [
'$q',
'$location',
'$route',
'horizon.framework.widgets.modal.deleteModalService',
'horizon.app.core.openstack-service-api.nlbaasv2',
'horizon.app.core.openstack-service-api.policy',
'horizon.framework.util.i18n.gettext'
];
/**
* @ngDoc factory
* @name horizon.dashboard.project.nlbaasv2.healthmonitors.actions.deleteService
* @description
* Brings up the delete health monitor confirmation modal dialog.
* On submit, deletes selected health monitor.
* On cancel, does nothing.
* @param $q The angular service for promises.
* @param $location The angular $location service.
* @param $route The angular $route service.
* @param deleteModal The horizon delete modal service.
* @param api The LBaaS v2 API service.
* @param policy The horizon policy service.
* @param gettext The horizon gettext function for translation.
* @returns The health monitor delete service.
*/
function deleteService(
$q, $location, $route, deleteModal, api, policy, gettext
) {
var loadbalancerId, listenerId, poolId, statePromise;
var context = {
labels: {
title: gettext('Confirm Delete Health Monitor'),
message: gettext('You have selected "%s". Please confirm your selection. Deleted health ' +
'monitors are not recoverable.'),
submit: gettext('Delete Health Monitor'),
success: gettext('Deleted health monitor: %s.'),
error: gettext('The following health monitor could not be deleted: %s.')
},
deleteEntity: deleteItem,
successEvent: 'success',
failedEvent: 'error'
};
var service = {
perform: perform,
allowed: allowed,
init: init
};
return service;
//////////////
function init(_loadbalancerId_, _listenerId_, _poolId_, _statePromise_) {
loadbalancerId = _loadbalancerId_;
listenerId = _listenerId_;
poolId = _poolId_;
statePromise = _statePromise_;
return service;
}
function perform(item) {
deleteModal.open({ $emit: actionComplete }, [item], context);
}
function allowed(/*item*/) {
return $q.all([
statePromise,
// This rule is made up and should therefore always pass. I assume at some point there
// will be a valid rule similar to this that we will want to use.
policy.ifAllowed({ rules: [['neutron', 'delete_health_monitor']] })
]);
}
function deleteItem(id) {
return api.deleteHealthMonitor(id, true);
}
function actionComplete(eventType) {
if (eventType === context.failedEvent) {
// Error, reload page
$route.reload();
} else {
// Success, go back to pool details page
var path = 'project/ngloadbalancersv2/' + loadbalancerId +
'/listeners/' + listenerId +
'/pools/' + poolId;
$location.path(path);
}
}
}
})();

View File

@ -1,156 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Health Monitor Delete Service', function() {
var service, policy, modal, lbaasv2Api, $scope, $location, $q, toast, monitor;
function allowed(item) {
spyOn(policy, 'ifAllowed').and.returnValue(makePromise());
var promise = service.allowed(item);
var allowed;
promise.then(function() {
allowed = true;
}, function() {
allowed = false;
});
$scope.$apply();
expect(policy.ifAllowed)
.toHaveBeenCalledWith({rules: [['neutron', 'delete_health_monitor']]});
return allowed;
}
function makePromise(reject) {
var def = $q.defer();
def[reject ? 'reject' : 'resolve']();
return def.promise;
}
function isActionable(id) {
if (id === 'active') {
return $q.when();
} else {
return $q.reject();
}
}
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(function() {
monitor = { id: '1', name: 'HealthMonitor1' };
});
beforeEach(module(function($provide) {
$provide.value('$uibModal', {
open: function() {
return {
result: makePromise()
};
}
});
$provide.value('horizon.app.core.openstack-service-api.nlbaasv2', {
deleteHealthMonitor: function() {
return makePromise();
}
});
$provide.value('$location', {
path: function() {
return '';
}
});
}));
beforeEach(inject(function ($injector) {
policy = $injector.get('horizon.app.core.openstack-service-api.policy');
lbaasv2Api = $injector.get('horizon.app.core.openstack-service-api.nlbaasv2');
modal = $injector.get('horizon.framework.widgets.modal.deleteModalService');
$scope = $injector.get('$rootScope').$new();
$location = $injector.get('$location');
$q = $injector.get('$q');
toast = $injector.get('horizon.framework.widgets.toast.service');
service = $injector.get('horizon.dashboard.project.nlbaasv2.healthmonitors.actions.delete');
service.init('1', '2', '3', isActionable('active'));
$scope.$apply();
}));
it('should have the "allowed" and "perform" functions', function() {
expect(service.allowed).toBeDefined();
expect(service.perform).toBeDefined();
});
it('should allow deleting health monitor from load balancer in ACTIVE state', function() {
expect(allowed()).toBe(true);
});
it('should not allow deleting health monitor from load balancer in PENDING state', function() {
service.init('1', '2', '3', isActionable('pending'));
expect(allowed()).toBe(false);
});
it('should open the delete modal', function() {
spyOn(modal, 'open');
service.perform(monitor);
$scope.$apply();
expect(modal.open.calls.count()).toBe(1);
var args = modal.open.calls.argsFor(0);
expect(args.length).toBe(3);
expect(args[0]).toEqual({ $emit: jasmine.any(Function) });
expect(args[1]).toEqual([monitor]);
expect(args[2]).toEqual(jasmine.objectContaining({
labels: jasmine.any(Object),
deleteEntity: jasmine.any(Function)
}));
expect(args[2].labels.title).toBe('Confirm Delete Health Monitor');
});
it('should pass function to modal that deletes the health monitor', function() {
spyOn(modal, 'open').and.callThrough();
spyOn(lbaasv2Api, 'deleteHealthMonitor').and.callThrough();
service.perform(monitor);
$scope.$apply();
expect(lbaasv2Api.deleteHealthMonitor.calls.count()).toBe(1);
expect(lbaasv2Api.deleteHealthMonitor).toHaveBeenCalledWith('1', true);
});
it('should show message if any items fail to be deleted', function() {
spyOn(modal, 'open').and.callThrough();
spyOn(lbaasv2Api, 'deleteHealthMonitor').and.returnValue(makePromise(true));
spyOn(toast, 'add');
service.perform(monitor);
$scope.$apply();
expect(modal.open).toHaveBeenCalled();
expect(lbaasv2Api.deleteHealthMonitor.calls.count()).toBe(1);
expect(toast.add).toHaveBeenCalledWith('error', 'The following health monitor could not ' +
'be deleted: HealthMonitor1.');
});
it('should return to pool details after delete', function() {
var path = 'project/ngloadbalancersv2/1/listeners/2/pools/3';
spyOn($location, 'path');
spyOn(toast, 'add');
service.perform(monitor);
$scope.$apply();
expect($location.path).toHaveBeenCalledWith(path);
expect(toast.add).toHaveBeenCalledWith('success', 'Deleted health monitor: HealthMonitor1.');
});
});
})();

View File

@ -1,80 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.healthmonitors')
.factory('horizon.dashboard.project.nlbaasv2.healthmonitors.actions.edit', editService);
editService.$inject = [
'$q',
'$route',
'horizon.dashboard.project.nlbaasv2.workflow.modal',
'horizon.app.core.openstack-service-api.policy',
'horizon.framework.util.i18n.gettext'
];
/**
* @ngDoc factory
* @name horizon.dashboard.project.nlbaasv2.healthmonitors.actions.editService
* @description
* Provides the service for editing a health monitor resource.
* @param $q The angular service for promises.
* @param $route The angular $route service.
* @param workflowModal The LBaaS workflow modal service.
* @param policy The horizon policy service.
* @param gettext The horizon gettext function for translation.
* @returns The health monitor edit service.
*/
function editService($q, $route, workflowModal, policy, gettext) {
var statePromise;
var edit = workflowModal.init({
controller: 'nLBaaSEditHealthMonitorWizardController',
message: gettext('The health monitor has been updated.'),
handle: handle,
allowed: allowed
});
var service = {
init: init,
edit: edit
};
return service;
//////////////
function init(_statePromise_) {
statePromise = _statePromise_;
return service;
}
function allowed(/*healthmonitor*/) {
return $q.all([
statePromise,
policy.ifAllowed({ rules: [['neutron', 'update_health_monitor']] })
]);
}
function handle(/*response*/) {
$route.reload();
}
}
})();

View File

@ -1,98 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Edit Health Monitor Action Service', function() {
var scope, $q, $route, policy, init, service, loadBalancerState;
function allowed(item) {
spyOn(policy, 'ifAllowed').and.returnValue(true);
var promise = service.edit.allowed(item);
var allowed;
promise.then(function() {
allowed = true;
}, function() {
allowed = false;
});
scope.$apply();
expect(policy.ifAllowed).toHaveBeenCalledWith(
{rules: [['neutron', 'update_health_monitor']]});
return allowed;
}
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function($provide) {
$provide.value('$uibModal', {
open: function() {
return {
result: {
then: function(func) {
func({ data: { id: 'healthmonitor1' } });
}
}
};
}
});
}));
beforeEach(inject(function ($injector) {
scope = $injector.get('$rootScope').$new();
$q = $injector.get('$q');
policy = $injector.get('horizon.app.core.openstack-service-api.policy');
$route = $injector.get('$route');
service = $injector.get('horizon.dashboard.project.nlbaasv2.healthmonitors.actions.edit');
init = service.init;
loadBalancerState = $q.defer();
}));
it('should define the correct service properties', function() {
expect(service.init).toBeDefined();
expect(service.edit).toBeDefined();
});
it('should have the "allowed" and "perform" functions', function() {
expect(service.edit.allowed).toBeDefined();
expect(service.edit.perform).toBeDefined();
});
it('should allow edit a health monitor under an ACTIVE load balancer', function() {
loadBalancerState.resolve();
init(loadBalancerState.promise);
expect(allowed({})).toBe(true);
});
it('should not allow editing a health monitor under a NON-ACTIVE load balancer', function() {
loadBalancerState.reject();
init(loadBalancerState.promise);
expect(allowed({})).toBe(false);
});
it('should reload page after edit', function() {
loadBalancerState.resolve();
spyOn($route, 'reload');
init(loadBalancerState.promise).edit.allowed({});
service.edit.perform();
expect($route.reload).toHaveBeenCalled();
});
});
})();

View File

@ -1,42 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.healthmonitors')
.controller('nLBaaSEditHealthMonitorWizardController', EditHealthMonitorWizardController);
EditHealthMonitorWizardController.$inject = [
'$scope',
'horizon.dashboard.project.nlbaasv2.workflow.model',
'horizon.dashboard.project.nlbaasv2.workflow.workflow',
'horizon.framework.util.i18n.gettext'
];
function EditHealthMonitorWizardController($scope, model, workflowService, gettext) {
var scope = $scope;
scope.model = model;
scope.submit = scope.model.submit;
scope.workflow = workflowService(
gettext('Update Health Monitor'),
'fa fa-cloud-download',
['monitor']
);
scope.model.initialize('monitor', scope.launchContext.id);
}
})();

View File

@ -1,63 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
describe('LBaaS v2 Edit Health Monitor Wizard Controller', function() {
var ctrl;
var model = {
submit: function() {
return 'updated';
},
initialize: angular.noop
};
var workflow = function() {
return 'foo';
};
var scope = {
launchContext: {id: 'healthmonitor1'}
};
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function ($provide) {
$provide.value('horizon.dashboard.project.nlbaasv2.workflow.model', model);
$provide.value('horizon.dashboard.project.nlbaasv2.workflow.workflow', workflow);
}));
beforeEach(inject(function ($controller) {
spyOn(model, 'initialize');
ctrl = $controller('nLBaaSEditHealthMonitorWizardController', { $scope: scope });
}));
it('defines the controller', function() {
expect(ctrl).toBeDefined();
});
it('calls initialize on the given model', function() {
expect(model.initialize).toHaveBeenCalled();
});
it('sets scope.workflow to the given workflow', function() {
expect(scope.workflow).toBe('foo');
});
it('defines scope.submit', function() {
expect(scope.submit).toBeDefined();
expect(scope.submit()).toBe('updated');
});
});
})();

View File

@ -1,81 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.healthmonitors')
.factory('horizon.dashboard.project.nlbaasv2.healthmonitors.actions.rowActions',
rowActions);
rowActions.$inject = [
'horizon.framework.util.i18n.gettext',
'horizon.dashboard.project.nlbaasv2.loadbalancers.service',
'horizon.dashboard.project.nlbaasv2.healthmonitors.actions.edit',
'horizon.dashboard.project.nlbaasv2.healthmonitors.actions.delete'
];
/**
* @ngdoc service
* @ngname horizon.dashboard.project.nlbaasv2.healthmonitors.actions.rowActions
*
* @description
* Provides the service for the health monitor row actions.
*
* @param gettext The horizon gettext function for translation.
* @param loadBalancersService The LBaaS v2 load balancers service.
* @param editService The LBaaS v2 health monitor edit service.
* @param deleteService The LBaaS v2 health monitor delete service.
* @returns Health monitor row actions service object.
*/
function rowActions(gettext, loadBalancersService, editService, deleteService) {
var loadBalancerIsActionable, loadbalancerId, listenerId, poolId;
var service = {
actions: actions,
init: init
};
return service;
///////////////
function init(_loadbalancerId_, _listenerId_, _poolId_) {
loadbalancerId = _loadbalancerId_;
listenerId = _listenerId_;
poolId = _poolId_;
loadBalancerIsActionable = loadBalancersService.isActionable(loadbalancerId);
return service;
}
function actions() {
return [{
service: editService.init(loadBalancerIsActionable).edit,
template: {
text: gettext('Edit')
}
},{
service: deleteService.init(loadbalancerId, listenerId, poolId, loadBalancerIsActionable),
template: {
text: gettext('Delete Health Monitor'),
type: 'delete'
}
}];
}
}
})();

View File

@ -1,51 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Health Monitor Row Actions Service', function() {
var actions;
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(inject(function ($injector) {
var rowActionsService = $injector.get(
'horizon.dashboard.project.nlbaasv2.healthmonitors.actions.rowActions');
actions = rowActionsService.init('1', '2', '3').actions();
var loadbalancerService = $injector.get(
'horizon.dashboard.project.nlbaasv2.loadbalancers.service');
spyOn(loadbalancerService, 'isActionable').and.returnValue(true);
}));
it('should define correct table row actions', function() {
expect(actions.length).toBe(2);
expect(actions[0].template.text).toBe('Edit');
expect(actions[1].template.text).toBe('Delete Health Monitor');
});
it('should have the "allowed" and "perform" functions', function() {
actions.forEach(function(action) {
expect(action.service.allowed).toBeDefined();
expect(action.service.perform).toBeDefined();
});
});
});
})();

View File

@ -1,100 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.healthmonitors')
.controller('nLBaaSHealthMonitorDetailController', HealthMonitorDetailController);
HealthMonitorDetailController.$inject = [
'horizon.app.core.openstack-service-api.nlbaasv2',
'horizon.dashboard.project.nlbaasv2.healthmonitors.actions.rowActions',
'$routeParams',
'$q'
];
/**
* @ngdoc controller
* @name HealthMonitorDetailController
*
* @description
* Controller for the LBaaS v2 health monitor detail page.
*
* @param api The LBaaS v2 API service.
* @param rowActions The LBaaS v2 health monitor row actions service.
* @param $routeParams The angular $routeParams service.
* @param $q The angular service for promises.
* @returns undefined
*/
function HealthMonitorDetailController(api, rowActions, $routeParams, $q) {
var ctrl = this;
ctrl.loading = true;
ctrl.error = false;
ctrl.actions = rowActions.init($routeParams.loadbalancerId,
$routeParams.listenerId,
$routeParams.poolId).actions;
init();
////////////////////////////////
function init() {
ctrl.healthmonitor = null;
ctrl.pool = null;
ctrl.listener = null;
ctrl.loadbalancer = null;
ctrl.loading = true;
ctrl.error = false;
$q.all([
api.getHealthMonitor($routeParams.healthmonitorId)
.then(success('healthmonitor'), fail('healthmonitor')),
api.getPool($routeParams.poolId)
.then(success('pool'), fail('pool')),
api.getListener($routeParams.listenerId)
.then(success('listener'), fail('listener')),
api.getLoadBalancer($routeParams.loadbalancerId)
.then(success('loadbalancer'), fail('loadbalancer'))
]).then(postInit, initError);
}
function success(property) {
return angular.bind(null, function setProp(property, response) {
ctrl[property] = response.data;
}, property);
}
function fail(property) {
return angular.bind(null, function setProp(property, error) {
ctrl[property] = null;
throw error;
}, property);
}
function postInit() {
ctrl.loading = false;
}
function initError() {
ctrl.loading = false;
ctrl.error = true;
}
}
})();

View File

@ -1,111 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Healthmonitor Detail Controller', function() {
var lbaasv2API, $controller, apiFail, qAllFail;
function fakePromise(data, reject) {
return {
then: function(success, fail) {
if (reject) {
fail();
} else {
success({ data: data });
}
return fakePromise();
}
};
}
function fakeAPI() {
return fakePromise('foo', apiFail);
}
function loadbalancerAPI() {
return fakePromise({ provisioning_status: 'ACTIVE' });
}
function qAll() {
return fakePromise(null, qAllFail);
}
function createController() {
return $controller('nLBaaSHealthMonitorDetailController', {
$routeParams: {
loadbalancerId: 'loadbalancerId',
listenerId: 'listenerId',
poolId: 'poolId',
healthmonitorId: 'healthmonitorId'
}
});
}
///////////////////////
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function($provide) {
apiFail = false;
qAllFail = false;
$provide.value('$q', { all: qAll });
}));
beforeEach(inject(function($injector) {
lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.nlbaasv2');
spyOn(lbaasv2API, 'getHealthMonitor').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getPool').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getListener').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(loadbalancerAPI);
$controller = $injector.get('$controller');
}));
it('should invoke nlbaasv2 apis', function() {
var ctrl = createController();
expect(lbaasv2API.getHealthMonitor).toHaveBeenCalledWith('healthmonitorId');
expect(lbaasv2API.getPool).toHaveBeenCalledWith('poolId');
expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId');
expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('loadbalancerId');
expect(ctrl.loadbalancer).toEqual({ provisioning_status: 'ACTIVE' });
expect(ctrl.listener).toBe('foo');
expect(ctrl.pool).toBe('foo');
expect(ctrl.healthmonitor).toBe('foo');
});
it('should throw error on API fail', function() {
apiFail = true;
var init = function() {
createController();
};
expect(init).toThrow();
});
it('should set error state if any APIs fail', function() {
qAllFail = true;
var ctrl = createController();
expect(ctrl.loading).toBe(false);
expect(ctrl.error).toBe(true);
});
});
})();

View File

@ -1,42 +0,0 @@
<div ng-controller="nLBaaSHealthMonitorDetailController as ctrl">
<nlbaas-detail-status loading="ctrl.loading" error="ctrl.error"></nlbaas-detail-status>
<div ng-if="!ctrl.loading && !ctrl.error">
<div class="page-header">
<ol class="breadcrumb">
<li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li>
<li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li>
<li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</a></li>
<li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}/pools/{$ ::ctrl.pool.id $}">{$ ::(ctrl.pool.name || ctrl.pool.id) $}</a></li>
<li class="active">{$ ::(ctrl.healthmonitor.name || ctrl.healthmonitor.id) $}</li>
<actions allowed="ctrl.actions" type="row" item="ctrl.healthmonitor"
ng-if="ctrl.healthmonitor" class="actions_column pull-right"></actions>
</ol>
</div>
<div class="row">
<div class="col-md-6 detail">
<dl class="dl-horizontal">
<dt translate>Type</dt>
<dd>{$ ::ctrl.healthmonitor.type $}</dd>
<dt translate>Delay</dt>
<dd>{$ ::ctrl.healthmonitor.delay $}</dd>
<dt translate>Max Retries</dt>
<dd>{$ ::ctrl.healthmonitor.max_retries $}</dd>
<dt translate>Timeout</dt>
<dd>{$ ::ctrl.healthmonitor.timeout $}</dd>
<dt translate ng-if="::ctrl.healthmonitor.http_method">HTTP Method</dt>
<dd ng-if="::ctrl.healthmonitor.http_method">{$ ::ctrl.healthmonitor.http_method $}</dd>
<dt translate ng-if="::ctrl.healthmonitor.expected_codes">Expected Codes</dt>
<dd ng-if="::ctrl.healthmonitor.expected_codes">{$ ::ctrl.healthmonitor.expected_codes $}</dd>
<dt translate ng-if="::ctrl.healthmonitor.url_path">URL Path</dt>
<dd ng-if="::ctrl.healthmonitor.url_path">{$ ::ctrl.healthmonitor.url_path $}</dd>
<dt translate>Admin State Up</dt>
<dd>{$ ctrl.healthmonitor.admin_state_up | yesno $}</dd>
<dt translate>Monitor ID</dt>
<dd>{$ ::ctrl.healthmonitor.id $}</dd>
<dt translate>Tenant ID</dt>
<dd>{$ ::ctrl.healthmonitor.tenant_id $}</dd>
</dl>
</div>
</div>
</div>
</div>

View File

@ -1,31 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
/**
* @ngdoc overview
* @ngname horizon.dashboard.project.nlbaasv2.healthmonitors
*
* @description
* Provides the services and widgets required to support and display the project healthmonitors
* for the load balancers v2 panel.
*/
angular
.module('horizon.dashboard.project.nlbaasv2.healthmonitors', []);
})();

View File

@ -1,25 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Healthmonitors Module', function() {
it('should exist', function() {
expect(angular.module('horizon.dashboard.project.nlbaasv2.healthmonitors')).toBeDefined();
});
});
})();

View File

@ -1,107 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.listeners')
.factory('horizon.dashboard.project.nlbaasv2.listeners.actions.batchActions',
tableBatchActions);
tableBatchActions.$inject = [
'$q',
'$location',
'horizon.dashboard.project.nlbaasv2.workflow.modal',
'horizon.app.core.openstack-service-api.policy',
'horizon.framework.util.i18n.gettext',
'horizon.dashboard.project.nlbaasv2.loadbalancers.service',
'horizon.dashboard.project.nlbaasv2.listeners.actions.delete'
];
/**
* @ngdoc service
* @ngname horizon.dashboard.project.nlbaasv2.listeners.actions.batchActions
*
* @description
* Provides the service for the Listeners table batch actions.
*
* @param $q The angular service for promises.
* @param $location The angular $location service.
* @param workflowModal The LBaaS workflow modal service.
* @param policy The horizon policy service.
* @param gettext The horizon gettext function for translation.
* @param loadBalancersService The LBaaS v2 load balancers service.
* @param deleteService The LBaaS v2 listeners delete service.
* @returns Listeners table batch actions service object.
*/
function tableBatchActions(
$q, $location, workflowModal, policy, gettext, loadBalancersService, deleteService
) {
var loadBalancerIsActionable, loadBalancerId;
var create = workflowModal.init({
controller: 'nLBaaSCreateListenerWizardController',
message: gettext('A new listener is being created.'),
handle: onCreate,
allowed: canCreate
});
var service = {
actions: actions,
init: init
};
return service;
///////////////
function init(_loadBalancerId_) {
loadBalancerId = _loadBalancerId_;
loadBalancerIsActionable = loadBalancersService.isActionable(loadBalancerId);
return service;
}
function actions() {
return [{
service: create,
template: {
type: 'create',
text: gettext('Create Listener')
}
},{
service: deleteService.init(loadBalancerId, loadBalancerIsActionable),
template: {
text: gettext('Delete Listeners'),
type: 'delete-selected'
}
}];
}
function canCreate() {
return $q.all([
loadBalancerIsActionable,
policy.ifAllowed({ rules: [['neutron', 'create_listener']] })
]);
}
function onCreate(response) {
var id = response.data.id;
$location.path('project/ngloadbalancersv2/' + loadBalancerId + '/listeners/' + id);
}
}
})();

View File

@ -1,105 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Listeners Table Batch Actions Service', function() {
var $location, actions, policy, $scope, $q;
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function($provide) {
var response = {
data: {
id: '5678'
}
};
var modal = {
open: function() {
return {
result: {
then: function(func) {
func(response);
}
}
};
}
};
$provide.value('$uibModal', modal);
$provide.value('horizon.dashboard.project.nlbaasv2.loadbalancers.service', {
isActionable: function() {
return $q.when();
}
});
$provide.value('horizon.app.core.openstack-service-api.policy', {
ifAllowed: function() {
return $q.when();
}
});
}));
beforeEach(inject(function ($injector) {
$location = $injector.get('$location');
$scope = $injector.get('$rootScope').$new();
$q = $injector.get('$q');
policy = $injector.get('horizon.app.core.openstack-service-api.policy');
var batchActionsService = $injector.get(
'horizon.dashboard.project.nlbaasv2.listeners.actions.batchActions');
actions = batchActionsService.init('1234').actions();
$scope.$apply();
}));
it('should define correct table batch actions', function() {
expect(actions.length).toBe(2);
expect(actions[0].template.text).toBe('Create Listener');
expect(actions[1].template.text).toBe('Delete Listeners');
});
it('should have the "allowed" and "perform" functions', function() {
actions.forEach(function(action) {
expect(action.service.allowed).toBeDefined();
expect(action.service.perform).toBeDefined();
});
});
it('should check policy to allow creating a listener', function() {
spyOn(policy, 'ifAllowed').and.callThrough();
var promise = actions[0].service.allowed();
var allowed;
promise.then(function() {
allowed = true;
}, function() {
allowed = false;
});
$scope.$apply();
expect(allowed).toBe(true);
expect(policy.ifAllowed).toHaveBeenCalledWith({rules: [['neutron', 'create_listener']]});
});
it('should redirect after create', function() {
spyOn($location, 'path').and.callThrough();
actions[0].service.perform();
expect($location.path).toHaveBeenCalledWith('project/ngloadbalancersv2/1234/listeners/5678');
});
});
})();

View File

@ -1,44 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.listeners')
.controller('nLBaaSCreateListenerWizardController', CreateListenerWizardController);
CreateListenerWizardController.$inject = [
'$scope',
'$routeParams',
'horizon.dashboard.project.nlbaasv2.workflow.model',
'horizon.dashboard.project.nlbaasv2.workflow.workflow',
'horizon.framework.util.i18n.gettext'
];
function CreateListenerWizardController($scope, $routeParams, model, workflowService, gettext) {
var loadbalancerId = $routeParams.loadbalancerId;
var scope = $scope;
scope.model = model;
scope.submit = scope.model.submit;
scope.workflow = workflowService(
gettext('Create Listener'),
'fa fa-cloud-download',
['listener', 'pool', 'members', 'monitor']
);
scope.model.initialize('listener', false, loadbalancerId);
}
})();

View File

@ -1,61 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
describe('LBaaS v2 Create Listener Wizard Controller', function() {
var ctrl;
var model = {
submit: function() {
return 'created';
},
initialize: angular.noop
};
var workflow = function() {
return 'foo';
};
var scope = {};
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function ($provide) {
$provide.value('horizon.dashboard.project.nlbaasv2.workflow.model', model);
$provide.value('horizon.dashboard.project.nlbaasv2.workflow.workflow', workflow);
}));
beforeEach(inject(function ($controller) {
spyOn(model, 'initialize');
ctrl = $controller('nLBaaSCreateListenerWizardController', { $scope: scope });
}));
it('defines the controller', function() {
expect(ctrl).toBeDefined();
});
it('calls initialize on the given model', function() {
expect(model.initialize).toHaveBeenCalled();
});
it('sets scope.workflow to the given workflow', function() {
expect(scope.workflow).toBe('foo');
});
it('defines scope.submit', function() {
expect(scope.submit).toBeDefined();
expect(scope.submit()).toBe('created');
});
});
})();

View File

@ -1,157 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.listeners')
.factory('horizon.dashboard.project.nlbaasv2.listeners.actions.delete', deleteService);
deleteService.$inject = [
'$q',
'$location',
'$route',
'horizon.framework.widgets.modal.deleteModalService',
'horizon.app.core.openstack-service-api.nlbaasv2',
'horizon.app.core.openstack-service-api.policy',
'horizon.framework.widgets.toast.service',
'horizon.framework.util.q.extensions',
'horizon.framework.util.i18n.gettext'
];
/**
* @ngDoc factory
* @name horizon.dashboard.project.nlbaasv2.listeners.actions.deleteService
* @description
* Brings up the delete listeners confirmation modal dialog.
* On submit, deletes selected listeners.
* On cancel, does nothing.
* @param $q The angular service for promises.
* @param $location The angular $location service.
* @param $route The angular $route service.
* @param deleteModal The horizon delete modal service.
* @param api The LBaaS v2 API service.
* @param policy The horizon policy service.
* @param toast The horizon message service.
* @param qExtensions Horizon extensions to the $q service.
* @param gettext The horizon gettext function for translation.
* @returns The listeners table delete service.
*/
function deleteService(
$q, $location, $route, deleteModal, api, policy, toast, qExtensions, gettext
) {
var loadbalancerId, statePromise;
var notAllowedMessage = gettext('The following listeners will not be deleted ' +
'due to existing pools: %s.');
var context = {
labels: {
title: gettext('Confirm Delete Listeners'),
message: gettext('You have selected "%s". Please confirm your selection. Deleted ' +
'listeners are not recoverable.'),
submit: gettext('Delete Listeners'),
success: gettext('Deleted listeners: %s.'),
error: gettext('The following listeners could not be deleted, possibly due to ' +
'existing pools: %s.')
},
deleteEntity: deleteItem,
successEvent: 'success',
failedEvent: 'error'
};
var service = {
perform: perform,
allowed: allowed,
init: init
};
return service;
//////////////
function init(_loadbalancerId_, _statePromise_) {
loadbalancerId = _loadbalancerId_;
statePromise = _statePromise_;
return service;
}
function perform(items) {
if (angular.isArray(items)) {
qExtensions.allSettled(items.map(checkPermission)).then(afterCheck);
} else {
deleteModal.open({ $emit: actionComplete }, [items], context);
}
}
function allowed(item) {
var promises = [policy.ifAllowed({ rules: [['neutron', 'delete_listener']] }), statePromise];
if (item) {
promises.push(qExtensions.booleanAsPromise(!item.default_pool_id));
}
return $q.all(promises);
}
function deleteItem(id) {
return api.deleteListener(id, true);
}
function actionComplete(eventType) {
if (eventType === context.failedEvent) {
// Action failed, reload the page
$route.reload();
} else {
// If the user is on the listeners table then just reload the page, otherwise they
// are on the details page and we return to the table.
var regex = new RegExp('project\/ngloadbalancersv2\/' + loadbalancerId + '(\/)?$');
if (regex.test($location.path())) {
$route.reload();
} else {
$location.path('project/ngloadbalancersv2/' + loadbalancerId);
}
}
}
function checkPermission(item) {
return { promise: canBeDeleted(item), context: item };
}
function afterCheck(result) {
if (result.fail.length > 0) {
toast.add('error', getMessage(notAllowedMessage, result.fail));
}
if (result.pass.length > 0) {
deleteModal.open({ $emit: actionComplete }, result.pass.map(getEntity), context);
}
}
function canBeDeleted(item) {
return qExtensions.booleanAsPromise(!item.default_pool_id);
}
function getMessage(message, entities) {
return interpolate(message, [entities.map(getName).join(", ")]);
}
function getName(result) {
return getEntity(result).name;
}
function getEntity(result) {
return result.context;
}
}
})();

View File

@ -1,178 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Listeners Delete Service', function() {
var service, policy, modal, lbaasv2Api, $scope, $route, $location, $q, toast, items, path;
function allowed(item) {
spyOn(policy, 'ifAllowed').and.returnValue(makePromise());
var promise = service.allowed(item);
var allowed;
promise.then(function() {
allowed = true;
}, function() {
allowed = false;
});
$scope.$apply();
expect(policy.ifAllowed).toHaveBeenCalledWith({rules: [['neutron', 'delete_listener']]});
return allowed;
}
function makePromise(reject) {
var def = $q.defer();
def[reject ? 'reject' : 'resolve']();
return def.promise;
}
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(function() {
items = [{ id: '1', name: 'First' },
{ id: '2', name: 'Second' }];
});
beforeEach(module(function($provide) {
$provide.value('$uibModal', {
open: function() {
return {
result: makePromise()
};
}
});
$provide.value('horizon.app.core.openstack-service-api.nlbaasv2', {
deleteListener: function() {
return makePromise();
}
});
$provide.value('$location', {
path: function() {
return path;
}
});
}));
beforeEach(inject(function ($injector) {
policy = $injector.get('horizon.app.core.openstack-service-api.policy');
lbaasv2Api = $injector.get('horizon.app.core.openstack-service-api.nlbaasv2');
modal = $injector.get('horizon.framework.widgets.modal.deleteModalService');
$scope = $injector.get('$rootScope').$new();
$route = $injector.get('$route');
$location = $injector.get('$location');
$q = $injector.get('$q');
toast = $injector.get('horizon.framework.widgets.toast.service');
service = $injector.get('horizon.dashboard.project.nlbaasv2.listeners.actions.delete');
service.init('1', makePromise());
}));
it('should have the "allowed" and "perform" functions', function() {
expect(service.allowed).toBeDefined();
expect(service.perform).toBeDefined();
});
it('should check policy to allow deleting a listener (single)', function() {
expect(allowed(items[0])).toBe(true);
});
it('should check policy to allow deleting a listener (batch)', function() {
expect(allowed()).toBe(true);
});
it('should not allow deleting a listener from load balancer in a PENDING state', function() {
service.init('1', makePromise(true));
expect(allowed()).toBe(false);
});
it('should not allow deleting a listener that has a default pool', function() {
expect(allowed({default_pool_id: 'pool1'})).toBe(false);
});
it('should open the delete modal', function() {
spyOn(modal, 'open');
service.perform(items[0]);
$scope.$apply();
expect(modal.open.calls.count()).toBe(1);
var args = modal.open.calls.argsFor(0);
expect(args.length).toBe(3);
expect(args[0]).toEqual({ $emit: jasmine.any(Function) });
expect(args[1]).toEqual([jasmine.objectContaining({ id: '1' })]);
expect(args[2]).toEqual(jasmine.objectContaining({
labels: jasmine.any(Object),
deleteEntity: jasmine.any(Function)
}));
expect(args[2].labels.title).toBe('Confirm Delete Listeners');
});
it('should pass function to modal that deletes listeners', function() {
spyOn(modal, 'open').and.callThrough();
spyOn(lbaasv2Api, 'deleteListener').and.callThrough();
service.perform(items[0]);
$scope.$apply();
expect(lbaasv2Api.deleteListener.calls.count()).toBe(1);
expect(lbaasv2Api.deleteListener).toHaveBeenCalledWith('1', true);
});
it('should show message if any items fail to be deleted', function() {
spyOn(modal, 'open').and.callThrough();
spyOn(lbaasv2Api, 'deleteListener').and.returnValue(makePromise(true));
spyOn(toast, 'add');
items.splice(1, 1);
service.perform(items);
$scope.$apply();
expect(modal.open).toHaveBeenCalled();
expect(lbaasv2Api.deleteListener.calls.count()).toBe(1);
expect(toast.add).toHaveBeenCalledWith('error', 'The following listeners could not ' +
'be deleted, possibly due to existing pools: First.');
});
it('should reload table after delete', function() {
path = 'project/ngloadbalancersv2/1';
spyOn($route, 'reload');
service.perform(items);
$scope.$apply();
expect($route.reload).toHaveBeenCalled();
});
it('should return to table after delete if on detail page', function() {
path = 'project/ngloadbalancersv2/1/listeners/2';
spyOn($location, 'path');
spyOn(toast, 'add');
service.perform(items[0]);
$scope.$apply();
expect($location.path).toHaveBeenCalledWith('project/ngloadbalancersv2/1');
expect(toast.add).toHaveBeenCalledWith('success', 'Deleted listeners: First.');
});
it('should show message if any selected items do not allow for delete (batch)', function() {
spyOn(modal, 'open');
spyOn(toast, 'add');
items[0].default_pool_id = 'pool1';
items[1].default_pool_id = 'pool2';
service.perform(items);
$scope.$apply();
expect(modal.open).not.toHaveBeenCalled();
expect(toast.add).toHaveBeenCalledWith('error',
'The following listeners will not be deleted ' +
'due to existing pools: First, Second.');
});
});
})();

View File

@ -1,84 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.loadbalancers')
.controller('nLBaaSEditListenerWizardController', EditListenerWizardController);
EditListenerWizardController.$inject = [
'$scope',
'$q',
'horizon.dashboard.project.nlbaasv2.workflow.model',
'horizon.dashboard.project.nlbaasv2.workflow.workflow',
'horizon.framework.util.i18n.gettext'
];
/**
* @ngdoc controller
* @name EditListenerWizardController
*
* @description
* Controller for the LBaaS v2 edit listener wizard.
*
* @param $scope The angular scope object.
* @param $q The angular service for promises.
* @param model The LBaaS V2 workflow model service.
* @param workflowService The LBaaS V2 workflow service.
* @param gettext The horizon gettext function for translation.
* @returns undefined
*/
function EditListenerWizardController($scope, $q, model, workflowService, gettext) {
var scope = $scope;
var defer = $q.defer();
scope.model = model;
scope.submit = scope.model.submit;
scope.workflow = workflowService(
gettext('Update Listener'),
'fa fa-pencil', ['listener'],
defer.promise);
var allSteps = scope.workflow.allSteps.concat([scope.workflow.certificatesStep]);
scope.model.initialize('listener', scope.launchContext.id).then(addSteps).then(ready);
function addSteps() {
var steps = scope.model.visibleResources;
steps.map(getStep).forEach(function addStep(step) {
if (!stepExists(step.id)) {
scope.workflow.append(step);
}
});
}
function getStep(id) {
return allSteps.filter(function findStep(step) {
return step.id === id;
})[0];
}
function stepExists(id) {
return scope.workflow.steps.some(function exists(step) {
return step.id === id;
});
}
function ready() {
defer.resolve();
}
}
})();

View File

@ -1,85 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
describe('LBaaS v2 Edit Listener Wizard Controller', function() {
var ctrl, workflowSpy, $q, scope;
var model = {
submit: function() {
return 'updated';
},
initialize: function() {
var defer = $q.defer();
defer.resolve();
return defer.promise;
}
};
var workflow = {
steps: [{id: 'listener'}],
allSteps: [{id: 'listener'}, {id: 'pool'}, {id: 'monitor'}],
certificatesStep: {id: 'certificates'},
append: angular.noop
};
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function ($provide) {
workflowSpy = jasmine.createSpy('workflow').and.returnValue(workflow);
$provide.value('horizon.dashboard.project.nlbaasv2.workflow.model', model);
$provide.value('horizon.dashboard.project.nlbaasv2.workflow.workflow', workflowSpy);
}));
beforeEach(inject(function ($controller, $injector) {
$q = $injector.get('$q');
scope = $injector.get('$rootScope').$new();
scope.launchContext = { id: '1234' };
spyOn(model, 'initialize').and.callThrough();
ctrl = $controller('nLBaaSEditListenerWizardController', { $scope: scope });
}));
it('defines the controller', function() {
expect(ctrl).toBeDefined();
});
it('calls initialize on the given model', function() {
expect(model.initialize).toHaveBeenCalledWith('listener', '1234');
});
it('sets scope.workflow to the given workflow', function() {
expect(scope.workflow).toBe(workflow);
});
it('initializes workflow with correct properties', function() {
expect(workflowSpy).toHaveBeenCalledWith('Update Listener',
'fa fa-pencil', ['listener'], jasmine.any(Object));
});
it('defines scope.submit', function() {
expect(scope.submit).toBe(model.submit);
expect(scope.submit()).toBe('updated');
});
it('adds necessary steps after initializing', function() {
model.visibleResources = ['listener', 'pool', 'monitor'];
spyOn(workflow, 'append');
scope.$apply();
expect(workflow.append).toHaveBeenCalledWith({id: 'pool'});
expect(workflow.append).toHaveBeenCalledWith({id: 'monitor'});
});
});
})();

View File

@ -1,113 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.listeners')
.factory('horizon.dashboard.project.nlbaasv2.listeners.actions.rowActions',
tableRowActions);
tableRowActions.$inject = [
'$q',
'$route',
'horizon.dashboard.project.nlbaasv2.workflow.modal',
'horizon.app.core.openstack-service-api.policy',
'horizon.framework.util.i18n.gettext',
'horizon.dashboard.project.nlbaasv2.loadbalancers.service',
'horizon.dashboard.project.nlbaasv2.listeners.actions.delete',
'horizon.dashboard.project.nlbaasv2.pools.actions.create'
];
/**
* @ngdoc service
* @ngname horizon.dashboard.project.nlbaasv2.listeners.actions.rowActions
*
* @description
* Provides the service for the Listener table row actions.
*
* @param $q The angular service for promises.
* @param $route The angular $route service.
* @param workflowModal The LBaaS workflow modal service.
* @param policy The horizon policy service.
* @param gettext The horizon gettext function for translation.
* @param loadBalancersService The LBaaS v2 load balancers service.
* @param deleteService The LBaaS v2 listeners delete service.
* @param createPoolService The LBaaS v2 pools create service.
* @returns Listeners row actions service object.
*/
function tableRowActions(
$q, $route, workflowModal, policy, gettext, loadBalancersService, deleteService,
createPoolService
) {
var loadbalancerId, loadBalancerIsActionable;
var edit = workflowModal.init({
controller: 'nLBaaSEditListenerWizardController',
message: gettext('The listener has been updated.'),
handle: onEdit,
allowed: canEdit
});
var service = {
actions: actions,
init: init
};
return service;
///////////////
function init(_loadbalancerId_) {
loadbalancerId = _loadbalancerId_;
loadBalancerIsActionable = loadBalancersService.isActionable(loadbalancerId);
return service;
}
function actions() {
return [{
service: edit,
template: {
text: gettext('Edit')
}
},{
service: createPoolService.init(loadbalancerId, loadBalancerIsActionable).create,
template: {
text: gettext('Create Pool')
}
},{
service: deleteService.init(loadbalancerId, loadBalancerIsActionable),
template: {
text: gettext('Delete Listener'),
type: 'delete'
}
}];
}
function canEdit(/*item*/) {
return $q.all([
loadBalancerIsActionable,
policy.ifAllowed({ rules: [['neutron', 'update_listener']] })
]);
}
function onEdit(/*response*/) {
$route.reload();
}
}
})();

View File

@ -1,115 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Listeners Table Row Actions Service', function() {
var scope, $route, $q, actions, policy, init;
function canEdit(item) {
spyOn(policy, 'ifAllowed').and.returnValue(true);
var promise = actions[0].service.allowed(item);
var allowed;
promise.then(function() {
allowed = true;
}, function() {
allowed = false;
});
scope.$apply();
expect(policy.ifAllowed).toHaveBeenCalledWith({rules: [['neutron', 'update_listener']]});
return allowed;
}
function isActionableMock(id) {
if (id === 'active') {
return $q.when();
} else {
return $q.reject();
}
}
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function($provide) {
var response = {
data: {
id: '1'
}
};
var modal = {
open: function() {
return {
result: {
then: function(func) {
func(response);
}
}
};
}
};
$provide.value('$uibModal', modal);
}));
beforeEach(inject(function ($injector) {
scope = $injector.get('$rootScope').$new();
$q = $injector.get('$q');
$route = $injector.get('$route');
policy = $injector.get('horizon.app.core.openstack-service-api.policy');
var rowActionsService = $injector.get(
'horizon.dashboard.project.nlbaasv2.listeners.actions.rowActions');
actions = rowActionsService.actions();
init = rowActionsService.init;
var loadbalancerService = $injector.get(
'horizon.dashboard.project.nlbaasv2.loadbalancers.service');
spyOn(loadbalancerService, 'isActionable').and.callFake(isActionableMock);
}));
it('should define correct table row actions', function() {
expect(actions.length).toBe(3);
expect(actions[0].template.text).toBe('Edit');
expect(actions[1].template.text).toBe('Create Pool');
expect(actions[2].template.text).toBe('Delete Listener');
});
it('should allow editing a listener of an ACTIVE load balancer', function() {
init('active');
expect(canEdit({listenerId: '1234'})).toBe(true);
});
it('should not allow editing a listener of a non-ACTIVE load balancer', function() {
init('non-active');
expect(canEdit({listenerId: '1234'})).toBe(false);
});
it('should have the "allowed" and "perform" functions', function() {
actions.forEach(function(action) {
expect(action.service.allowed).toBeDefined();
expect(action.service.perform).toBeDefined();
});
});
it('should reload table after edit', function() {
spyOn($route, 'reload').and.callThrough();
actions[0].service.perform();
expect($route.reload).toHaveBeenCalled();
});
});
})();

View File

@ -1,92 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.listeners')
.controller('nLBaaSListenerDetailController', ListenerDetailController);
ListenerDetailController.$inject = [
'horizon.app.core.openstack-service-api.nlbaasv2',
'horizon.dashboard.project.nlbaasv2.listeners.actions.rowActions',
'$routeParams',
'$q'
];
/**
* @ngdoc controller
* @name ListenerDetailController
*
* @description
* Controller for the LBaaS v2 listener detail page.
*
* @param api The LBaaS v2 API service.
* @param rowActions The listener row actions service.
* @param $routeParams The angular $routeParams service.
* @param $q The angular service for promises.
* @returns undefined
*/
function ListenerDetailController(api, rowActions, $routeParams, $q) {
var ctrl = this;
ctrl.loading = true;
ctrl.error = false;
ctrl.actions = rowActions.init($routeParams.loadbalancerId).actions;
init();
////////////////////////////////
function init() {
ctrl.listener = null;
ctrl.loadbalancer = null;
ctrl.loading = true;
ctrl.error = false;
$q.all([
api.getListener($routeParams.listenerId)
.then(success('listener'), fail('listener')),
api.getLoadBalancer($routeParams.loadbalancerId)
.then(success('loadbalancer'), fail('loadbalancer'))
]).then(postInit, initError);
}
function success(property) {
return angular.bind(null, function setProp(property, response) {
ctrl[property] = response.data;
}, property);
}
function fail(property) {
return angular.bind(null, function setProp(property, error) {
ctrl[property] = null;
throw error;
}, property);
}
function postInit() {
ctrl.loading = false;
}
function initError() {
ctrl.loading = false;
ctrl.error = true;
}
}
})();

View File

@ -1,104 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Listener Detail Controller', function() {
var lbaasv2API, $controller, apiFail, qAllFail;
function fakePromise(data, reject) {
return {
then: function(success, fail) {
if (reject) {
fail();
} else {
success({ data: data });
}
return fakePromise();
}
};
}
function fakeAPI() {
return fakePromise('foo', apiFail);
}
function loadbalancerAPI() {
return fakePromise({ provisioning_status: 'ACTIVE' });
}
function qAll() {
return fakePromise(null, qAllFail);
}
function createController() {
return $controller('nLBaaSListenerDetailController', {
$routeParams: {
loadbalancerId: 'loadbalancerId',
listenerId: 'listenerId'
}
});
}
///////////////////////
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function($provide) {
apiFail = false;
qAllFail = false;
$provide.value('$q', { all: qAll });
$provide.value('$uibModal', {});
}));
beforeEach(inject(function($injector) {
lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.nlbaasv2');
spyOn(lbaasv2API, 'getListener').and.callFake(fakeAPI);
spyOn(lbaasv2API, 'getLoadBalancer').and.callFake(loadbalancerAPI);
$controller = $injector.get('$controller');
}));
it('should invoke nlbaasv2 apis', function() {
var ctrl = createController();
expect(lbaasv2API.getListener).toHaveBeenCalledWith('listenerId');
expect(lbaasv2API.getLoadBalancer).toHaveBeenCalledWith('loadbalancerId');
expect(ctrl.loadbalancer).toEqual({ provisioning_status: 'ACTIVE' });
expect(ctrl.listener).toBe('foo');
});
it('should throw error on API fail', function() {
apiFail = true;
var init = function() {
createController();
};
expect(init).toThrow();
});
it('should set error state if any APIs fail', function() {
qAllFail = true;
var ctrl = createController();
expect(ctrl.loading).toBe(false);
expect(ctrl.error).toBe(true);
});
});
})();

View File

@ -1,42 +0,0 @@
<div ng-controller="nLBaaSListenerDetailController as ctrl">
<nlbaas-detail-status loading="ctrl.loading" error="ctrl.error"></nlbaas-detail-status>
<div ng-if="!ctrl.loading && !ctrl.error">
<div class="page-header">
<ol class="breadcrumb">
<li><a href="project/ngloadbalancersv2/"><translate>Load Balancers</translate></a></li>
<li><a href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}">{$ ::(ctrl.loadbalancer.name || ctrl.loadbalancer.id) $}</a></li>
<li class="active">{$ ::(ctrl.listener.name || ctrl.listener.id) $}</li>
<actions allowed="ctrl.actions" type="row" item="ctrl.listener" ng-if="ctrl.listener"
class="actions_column pull-right"></actions>
</ol>
<p ng-if="::ctrl.listener.description">{$ ::ctrl.listener.description $}</p>
</div>
<div class="row">
<div class="col-md-6 detail">
<dl class="dl-horizontal">
<dt translate>Protocol</dt>
<dd>{$ ::ctrl.listener.protocol $}</dd>
<dt translate>Protocol Port</dt>
<dd>{$ ::ctrl.listener.protocol_port $}</dd>
<dt translate>Connection Limit</dt>
<dd>{$ ctrl.listener.connection_limit | limit $}</dd>
<dt translate>Admin State Up</dt>
<dd>{$ ctrl.listener.admin_state_up | yesno $}</dd>
<dt translate>Default Pool ID</dt>
<dd>
<a ng-href="project/ngloadbalancersv2/{$ ::ctrl.loadbalancer.id $}/listeners/{$ ::ctrl.listener.id $}/pools/{$ ::ctrl.listener.default_pool_id $}" ng-if="ctrl.listener.default_pool_id">
{$ ::ctrl.listener.default_pool_id $}
</a>
<span ng-if="!ctrl.listener.default_pool_id">
{$ 'None' | translate $}
</span>
</dd>
<dt translate>Listener ID</dt>
<dd>{$ ::ctrl.listener.id $}</dd>
<dt translate>Tenant ID</dt>
<dd>{$ ::ctrl.listener.tenant_id $}</dd>
</dl>
</div>
</div>
</div>
</div>

View File

@ -1,31 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
/**
* @ngdoc overview
* @ngname horizon.dashboard.project.nlbaasv2.listeners
*
* @description
* Provides the services and widgets required to support and display the project listeners
* for the load balancers v2 panel.
*/
angular
.module('horizon.dashboard.project.nlbaasv2.listeners', []);
})();

View File

@ -1,25 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Listeners Module', function() {
it('should exist', function() {
expect(angular.module('horizon.dashboard.project.nlbaasv2.listeners')).toBeDefined();
});
});
})();

View File

@ -1,80 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.listeners')
.controller('nLBaaSListenersTableController', ListenersTableController);
ListenersTableController.$inject = [
'horizon.app.core.openstack-service-api.nlbaasv2',
'$routeParams',
'horizon.dashboard.project.nlbaasv2.listeners.actions.rowActions',
'horizon.dashboard.project.nlbaasv2.listeners.actions.batchActions'
];
/**
* @ngdoc controller
* @name ListenersTableController
*
* @description
* Controller for the LBaaS v2 listeners table. Serves as the focal point for table actions.
*
* @param api The LBaaS V2 service API.
* @param $routeParams The angular $routeParams service.
* @param rowActions The listener row actions service.
* @param batchActions The listener batch actions service.
* @returns undefined
*/
function ListenersTableController(api, $routeParams, rowActions, batchActions) {
var ctrl = this;
ctrl.items = [];
ctrl.src = [];
ctrl.loading = true;
ctrl.error = false;
ctrl.checked = {};
ctrl.loadbalancerId = $routeParams.loadbalancerId;
ctrl.batchActions = batchActions.init(ctrl.loadbalancerId);
ctrl.rowActions = rowActions.init(ctrl.loadbalancerId);
init();
////////////////////////////////
function init() {
ctrl.src = [];
ctrl.loading = true;
ctrl.error = false;
api.getListeners(ctrl.loadbalancerId).then(success, fail);
}
function success(response) {
ctrl.src = response.data.items;
ctrl.loading = false;
}
function fail(/*response*/) {
ctrl.src = [];
ctrl.loading = false;
ctrl.error = true;
}
}
})();

View File

@ -1,97 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function() {
'use strict';
describe('LBaaS v2 Listeners Table Controller', function() {
var controller, lbaasv2API, rowActions, batchActions;
var items = [{ foo: 'bar' }];
var apiFail = false;
function fakeAPI() {
return {
then: function(success, fail) {
if (apiFail && fail) {
fail();
} else {
success({ data: { items: items } });
}
}
};
}
function initMock() {
return rowActions;
}
///////////////////////
beforeEach(module('horizon.framework.widgets'));
beforeEach(module('horizon.framework.conf'));
beforeEach(module('horizon.framework.util'));
beforeEach(module('horizon.app.core.openstack-service-api'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(module(function($provide) {
$provide.value('$uibModal', {});
}));
beforeEach(inject(function($injector) {
lbaasv2API = $injector.get('horizon.app.core.openstack-service-api.nlbaasv2');
controller = $injector.get('$controller');
rowActions = $injector.get('horizon.dashboard.project.nlbaasv2.listeners.actions.rowActions');
batchActions = $injector.get(
'horizon.dashboard.project.nlbaasv2.listeners.actions.batchActions');
spyOn(rowActions, 'init').and.callFake(initMock);
spyOn(lbaasv2API, 'getListeners').and.callFake(fakeAPI);
}));
function createController() {
return controller('nLBaaSListenersTableController', {
$routeParams: { loadbalancerId: '1234' }
});
}
it('should initialize correctly', function() {
var ctrl = createController();
expect(ctrl.items).toEqual([]);
expect(ctrl.src).toEqual(items);
expect(ctrl.loading).toBe(false);
expect(ctrl.error).toBe(false);
expect(ctrl.checked).toEqual({});
expect(ctrl.loadbalancerId).toEqual('1234');
expect(rowActions.init).toHaveBeenCalledWith(ctrl.loadbalancerId);
expect(ctrl.rowActions).toBeDefined();
expect(ctrl.rowActions).toEqual(rowActions);
expect(ctrl.batchActions).toBeDefined();
expect(ctrl.batchActions).toEqual(batchActions);
});
it('should invoke nlbaasv2 apis', function() {
var ctrl = createController();
expect(lbaasv2API.getListeners).toHaveBeenCalled();
expect(ctrl.src.length).toBe(1);
});
it('should show error if loading fails', function() {
apiFail = true;
var ctrl = createController();
expect(ctrl.src.length).toBe(0);
expect(ctrl.error).toBe(true);
});
});
})();

View File

@ -1,124 +0,0 @@
<table ng-controller="nLBaaSListenersTableController as table"
hz-table ng-cloak
st-table="table.items"
st-safe-src="table.src"
default-sort="name"
default-sort-reverse="false"
class="table table-striped table-rsp table-detail">
<!--
TODO(jpomero): This table pattern does not allow for extensibility and should be revisited
once horizon implements a better one.
-->
<thead>
<tr>
<!--
Table-batch-actions:
This is where batch actions like searching, creating, and deleting.
-->
<th colspan="7" class="search-header">
<hz-search-bar icon-classes="fa-search">
<actions allowed="table.batchActions.actions" type="batch"></actions>
</hz-search-bar>
</th>
</tr>
<tr>
<!--
Table-column-headers:
This is where we declaratively define the table column headers.
Include select-col if you want to select all.
Include expander if you want to inline details.
Include action-col if you want to perform actions.
-->
<th class="multi_select_column">
<input type="checkbox" hz-select-all="table.items">
</th>
<th class="expander"></th>
<th class="rsp-p1" st-sort="name" st-sort-default="name" translate>Name</th>
<th class="rsp-p1" st-sort="description" translate>Description</th>
<th class="rsp-p1" st-sort="protocol" translate>Protocol</th>
<th class="rsp-p1" st-sort="port" translate>Port</th>
<th class="actions_column" translate>Actions</th>
</tr>
</thead>
<tbody>
<!--
Table-rows:
This is where we declaratively define the table columns.
Include select-col if you want to select all.
Include expander if you want to inline details.
Include action-col if you want to perform actions.
rsp-p1 rsp-p2 are responsive priority as user resizes window.
-->
<tr ng-repeat-start="item in table.items track by item.id"
ng-class="{'st-selected': checked[item.id]}">
<td class="multi_select_column">
<input type="checkbox"
ng-model="tCtrl.selections[item.id].checked"
hz-select="item">
</td>
<td class="expander">
<span class="fa fa-chevron-right"
hz-expand-detail
duration="200">
</span>
</td>
<td class="rsp-p1"><a ng-href="project/ngloadbalancersv2/{$ ::table.loadbalancerId $}/listeners/{$ ::item.id $}">{$ ::(item.name || item.id) $}</a></td>
<td class="rsp-p1">{$ ::item.description | noValue $}</td>
<td class="rsp-p1">{$ ::item.protocol$}</td>
<td class="rsp-p1">{$ ::item.protocol_port$}</td>
<td class="actions_column">
<!--
Table-row-action-column:
Actions taken here apply to a single item/row.
-->
<actions allowed="table.rowActions.actions" type="row" item="item"></actions>
</td>
</tr>
<tr ng-repeat-end class="detail-row">
<!--
Detail-row:
Contains detailed information on this item.
Can be toggled using the chevron button.
Ensure colspan is greater or equal to number of column-headers.
-->
<td class="detail" colspan="7">
<div class="row">
<dl class="col-sm-2">
<dt translate>ID</dt>
<dd>{$ ::item.id $}</dd>
</dl>
<dl class="col-sm-2">
<dt translate>Admin State Up</dt>
<dd>{$ ::item.admin_state_up | yesno $}</dd>
</dl>
<dl class="col-sm-2">
<dt translate>Connection Limit</dt>
<dd>{$ ::item.connection_limit | limit $}</dd>
</dl>
<dl class="col-sm-2">
<dt translate>Default Pool ID</dt>
<dd>{$ ::item.default_pool_id | noValue $}</dd>
</dl>
</div>
</td>
</tr>
<tr nlbaas-table-status table="table" column-count="7"></tr>
</tbody>
<!--
Table-footer:
This is where we display number of items and pagination controls.
-->
<tfoot hz-table-footer items="table.items"></tfoot>
</table>

View File

@ -1,119 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
angular
.module('horizon.dashboard.project.nlbaasv2.loadbalancers')
.controller('nLBaaSAssociateFloatingIpModalController', AssociateFloatingIpModalController);
AssociateFloatingIpModalController.$inject = [
'$uibModalInstance',
'horizon.app.core.openstack-service-api.network',
'horizon.framework.util.i18n.gettext',
// Dependencies injected with resolve by $uibModal.open
'loadbalancer',
'floatingIps',
'floatingIpPools'
];
/**
* @ngdoc controller
* @name AssociateFloatingIpModalController
* @description
* Controller used by the modal service for associating a floating IP address to a
* load balancer.
*
* @param $uibModalInstance The angular bootstrap $uibModalInstance service.
* @param api The horizon network API service.
* @param gettext The horizon gettext function for translation.
* @param loadbalancer The load balancer to associate the floating IP with.
* @param floatingIps List of available floating IP addresses.
* @param floatingIpPools List of available floating IP pools.
*
* @returns The Associate Floating IP modal controller.
*/
function AssociateFloatingIpModalController(
$uibModalInstance, api, gettext, loadbalancer, floatingIps, floatingIpPools
) {
var ctrl = this;
var port = loadbalancer.vip_port_id + '_' + loadbalancer.vip_address;
ctrl.cancel = cancel;
ctrl.save = save;
ctrl.saving = false;
ctrl.options = initOptions();
ctrl.selected = ctrl.options.length === 1 ? ctrl.options[0] : null;
function save() {
ctrl.saving = true;
if (ctrl.selected.type === 'pool') {
allocateIpAddress(ctrl.selected.id);
} else {
associateIpAddress(ctrl.selected.id);
}
}
function cancel() {
$uibModalInstance.dismiss('cancel');
}
function onSuccess() {
$uibModalInstance.close();
}
function onFailure() {
ctrl.saving = false;
}
function initOptions() {
var options = [];
floatingIps.forEach(function addFloatingIp(ip) {
// Only show floating IPs that are not already associated with a fixed IP
if (!ip.fixed_ip) {
options.push({
id: ip.id,
name: ip.ip || ip.id,
type: 'ip',
group: gettext('Floating IP addresses')
});
}
});
floatingIpPools.forEach(function addFloatingIpPool(pool) {
options.push({
id: pool.id,
name: pool.name || pool.id,
type: 'pool',
group: gettext('Floating IP pools')
});
});
return options;
}
function allocateIpAddress(poolId) {
return api.allocateFloatingIp(poolId).then(getId).then(associateIpAddress);
}
function associateIpAddress(addressId) {
return api.associateFloatingIp(addressId, port).then(onSuccess, onFailure);
}
function getId(response) {
return response.data.id;
}
}
})();

View File

@ -1,149 +0,0 @@
/*
* Copyright 2016 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an 'AS IS' BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function () {
'use strict';
describe('LBaaS v2 Load Balancers Table Associate IP Controller', function() {
var ctrl, network, floatingIps, floatingIpPools, $controller, $uibModalInstance;
var associateFail = false;
beforeEach(module('horizon.framework.util.i18n'));
beforeEach(module('horizon.dashboard.project.nlbaasv2'));
beforeEach(function() {
floatingIps = [{ id: 'ip1', ip: '1', fixed_ip: '1' },
{ id: 'ip2', ip: '2' }];
floatingIpPools = [{ id: 'pool1', name: 'pool' }];
});
beforeEach(module(function($provide) {
var fakePromise = function(response, returnPromise) {
return {
then: function(success, fail) {
if (fail && associateFail) {
return fail();
}
var res = success(response);
return returnPromise ? fakePromise(res) : res;
}
};
};
$provide.value('$uibModalInstance', {
close: angular.noop,
dismiss: angular.noop
});
$provide.value('loadbalancer', {
vip_port_id: 'port',
vip_address: 'address'
});
$provide.value('floatingIps', floatingIps);
$provide.value('floatingIpPools', floatingIpPools);
$provide.value('horizon.app.core.openstack-service-api.network', {
allocateFloatingIp: function() {
return fakePromise({ data: { id: 'foo' } }, true);
},
associateFloatingIp: function() {
return fakePromise();
}
});
}));
beforeEach(inject(function ($injector) {
network = $injector.get('horizon.app.core.openstack-service-api.network');
$controller = $injector.get('$controller');
$uibModalInstance = $injector.get('$uibModalInstance');
}));
it('should define controller properties', function() {
ctrl = $controller('nLBaaSAssociateFloatingIpModalController');
expect(ctrl.cancel).toBeDefined();
expect(ctrl.save).toBeDefined();
expect(ctrl.saving).toBe(false);
});
it('should initialize options', function() {
ctrl = $controller('nLBaaSAssociateFloatingIpModalController');
expect(ctrl.options.length).toBe(2);
expect(ctrl.options[0].id).toBe('ip2');
expect(ctrl.options[1].id).toBe('pool1');
});
it('should use ids instead of ip or name if not provided', function() {
delete floatingIps[1].ip;
delete floatingIpPools[0].name;
ctrl = $controller('nLBaaSAssociateFloatingIpModalController');
expect(ctrl.options.length).toBe(2);
expect(ctrl.options[0].name).toBe('ip2');
expect(ctrl.options[1].name).toBe('pool1');
});
it('should initialize selected option when only one option', function() {
floatingIps[1].fixed_ip = '2';
ctrl = $controller('nLBaaSAssociateFloatingIpModalController');
expect(ctrl.options.length).toBe(1);
expect(ctrl.selected).toBe(ctrl.options[0]);
});
it('should not initialize selected option when more than one option', function() {
ctrl = $controller('nLBaaSAssociateFloatingIpModalController');
expect(ctrl.options.length).toBe(2);
expect(ctrl.selected).toBeNull();
});
it('should associate floating IP if floating IP selected', function() {
ctrl = $controller('nLBaaSAssociateFloatingIpModalController');
ctrl.selected = ctrl.options[0];
spyOn(network, 'associateFloatingIp').and.callThrough();
spyOn($uibModalInstance, 'close');
ctrl.save();
expect(ctrl.saving).toBe(true);
expect(network.associateFloatingIp).toHaveBeenCalledWith('ip2', 'port_address');
expect($uibModalInstance.close).toHaveBeenCalled();
});
it('should allocate floating IP if floating IP pool selected', function() {
ctrl = $controller('nLBaaSAssociateFloatingIpModalController');
ctrl.selected = ctrl.options[1];
spyOn(network, 'allocateFloatingIp').and.callThrough();
spyOn(network, 'associateFloatingIp').and.callThrough();
spyOn($uibModalInstance, 'close');
ctrl.save();
expect(ctrl.saving).toBe(true);
expect(network.allocateFloatingIp).toHaveBeenCalledWith('pool1');
expect(network.associateFloatingIp).toHaveBeenCalledWith('foo', 'port_address');
expect($uibModalInstance.close).toHaveBeenCalled();
});
it('should dismiss modal if cancel clicked', function() {
ctrl = $controller('nLBaaSAssociateFloatingIpModalController');
spyOn($uibModalInstance, 'dismiss');
ctrl.cancel();
expect($uibModalInstance.dismiss).toHaveBeenCalledWith('cancel');
});
it('should not dismiss modal if save fails', function() {
ctrl = $controller('nLBaaSAssociateFloatingIpModalController');
ctrl.selected = ctrl.options[0];
associateFail = true;
spyOn($uibModalInstance, 'dismiss');
ctrl.save();
expect($uibModalInstance.dismiss).not.toHaveBeenCalled();
expect(ctrl.saving).toBe(false);
});
});
})();

Some files were not shown because too many files have changed in this diff Show More