Retire neutron-fwaas-dashboard project

Governance change is proposed at [1] and project config patch is
proposed at [2]

[1] https://review.opendev.org/735828
[2] https://review.opendev.org/#/c/735812/

Change-Id: Ib78ff301076c0295aad9b1bf49eed0f1a7adb7c2
This commit is contained in:
Slawek Kaplonski 2020-06-16 11:27:37 +02:00
parent 6451d3dbff
commit 4a0f1a3ae5
127 changed files with 8 additions and 12844 deletions

14
.gitignore vendored
View File

@ -1,14 +0,0 @@
*.pyc
*.swp
*.egg*/
.coverage
.tox/
build/
cover/
dist/
AUTHORS
ChangeLog
# Translation catalogs
*.mo
*.pot

View File

@ -1,35 +0,0 @@
- job:
name: neutron-fwaas-dashboard-integration-tests
parent: horizon-integration-tests
required-projects:
- name: openstack/horizon
- name: openstack/neutron-fwaas
- name: openstack/neutron-fwaas-dashboard
roles:
- zuul: openstack-infra/devstack
- zuul: openstack/horizon
irrelevant-files:
- ^.*\.rst$
- ^doc/.*$
- ^releasenotes/.*$
vars:
devstack_plugins:
neutron-fwaas: https://git.openstack.org/openstack/neutron-fwaas
neutron-fwaas-dashboard: https://git.openstack.org/openstack/neutron-fwaas-dashboard
devstack_services:
horizon: true
tox_envlist: integration
- project:
templates:
- check-requirements
- horizon-non-primary-django-jobs
- openstack-cover-jobs-horizon
- openstack-lower-constraints-jobs-horizon
- openstack-python3-victoria-jobs-horizon
- publish-openstack-docs-pti
- release-notes-jobs-python3
check:
jobs:
- neutron-fwaas-dashboard-integration-tests:
voting: false

View File

@ -1,17 +0,0 @@
If you would like to contribute to the development of OpenStack, you must
follow the steps in this page:
https://docs.openstack.org/infra/manual/developers.html
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:
https://docs.openstack.org/infra/manual/developers.html#development-workflow
Pull requests submitted through GitHub will be ignored.
Bugs should be filed on Launchpad, not GitHub:
https://bugs.launchpad.net/neutron-fwaas-dashboard

View File

@ -1,13 +0,0 @@
==========================================
Neutron FWaaS Dashboard Style Commandments
==========================================
Read the OpenStack Style Commandments
https://docs.openstack.org/hacking/latest/user/hacking.html
Project Specific Commandments
-----------------------------
- Read the Horizon contributing documentation at
https://docs.openstack.org/horizon/latest/contributor/contributing.html
- [M322] Method's default argument shouldn't be mutable.

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.

View File

@ -1,18 +1,10 @@
=======================
Neutron FWaaS Dashboard
=======================
This project is no longer maintained.
.. warning::
Due to lack of maintainers this project is now deprecated in the Neutron
stadium and will be removed from stadium in ``W`` cycle.
If You want to step in and be maintainer of this project to keep it in the
Neutron stadium, please contact the ``neutron team`` via
openstack-discuss@lists.openstack.org or IRC channel #openstack-neutron
@freenode.
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".
OpenStack Dashboard panels for Neutron FWaaS
* Documentation: https://docs.openstack.org/neutron-fwaas-dashboard/latest/
* Source: https://opendev.org/openstack/neutron-fwaas-dashboard
* Bugs: https://bugs.launchpad.net/neutron-fwaas-dashboard
* Release Notes: https://docs.openstack.org/releasenotes/neutron-fwaas-dashboard/
For any further questions, please email
openstack-discuss@lists.openstack.org or join #openstack-dev on
Freenode.

View File

@ -1,2 +0,0 @@
[python: **.py]
[django: **/templates/**.html]

View File

@ -1,2 +0,0 @@
[javascript: **.js]
[angular: **/static/**.html]

View File

@ -1,5 +0,0 @@
# selenium tests
firefox [selenium]
xvfb [selenium platform:dpkg]
# already part of xorg-x11-server on openSUSE
xorg-x11-server-Xvfb [selenium platform:redhat]

View File

@ -1,25 +0,0 @@
===========================================
DevStack plugin for neutron-fwaas-dashboard
===========================================
This is setup as a DevStack plugin.
For more information on DevStack plugins,
see the `DevStack Plugins documentation
<https://docs.openstack.org/developer/devstack/plugins.html>`__.
If neutron-fwaas-dashboard DevStack plugin is enabled,
Neutron FWaaS dashboard is automatically enabled and
the appropriate version of FWaaS panel is displayed based on
the FWaaS version enabled in your neutron server.
You do not need to specify FWaaS API version in the DevStack plugin
configuration.
To enable FWaaS dashboard, add the following to the localrc section
of your local.conf.
.. code-block:: none
[[local|localrc]]
enable_plugin neutron-fwaas https://opendev.org/openstack/neutron-fwaas master
enable_service q-fwaas-v2
enable_plugin neutron-fwaas-dashboard https://opendev.org/openstack/neutron-fwaas-dashboard master

View File

@ -1,64 +0,0 @@
# plugin.sh - DevStack plugin.sh dispatch script neutron-fwaas-dashboard
FWAAS_DASHBOARD_DIR=$(cd $(dirname $BASH_SOURCE)/.. && pwd)
FWAAS_ENABLED_DIR=$FWAAS_DASHBOARD_DIR/neutron_fwaas_dashboard/enabled
OPENSTACK_DASHBOARD_DIR=$DEST/horizon/openstack_dashboard
HORIZON_ENABLED_DIR=$OPENSTACK_DASHBOARD_DIR/local/enabled
function install_neutron_fwaas_dashboard {
setup_develop $FWAAS_DASHBOARD_DIR
}
function configure_neutron_fwaas_dashboard {
cp -a $FWAAS_ENABLED_DIR/_[0-9]*.py $HORIZON_ENABLED_DIR
# NOTE: If locale directory does not exist, compilemessages will fail,
# so check for an existence of locale directory is required.
if [ -d $FWAAS_DASHBOARD_DIR/neutron_fwaas_dashboard/locale ]; then
(cd $FWAAS_DASHBOARD_DIR/neutron_fwaas_dashboard; \
DJANGO_SETTINGS_MODULE=openstack_dashboard.settings $PYTHON ../manage.py compilemessages)
fi
# Add policy file for FWaaS
cp $FWAAS_DASHBOARD_DIR/etc/neutron-fwaas-policy.json $OPENSTACK_DASHBOARD_DIR/conf/
cp $FWAAS_DASHBOARD_DIR/neutron_fwaas_dashboard/local_settings.d/_7000_neutron_fwaas.py \
$OPENSTACK_DASHBOARD_DIR/local/local_settings.d/
}
# check for service enabled
if is_service_enabled neutron-fwaas-dashboard; then
if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then
# Set up system services
# no-op
:
elif [[ "$1" == "stack" && "$2" == "install" ]]; then
# Perform installation of service source
echo_summary "Installing Neutron FWaaS Dashboard"
install_neutron_fwaas_dashboard
elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then
# Configure after the other layer 1 and 2 services have been configured
echo_summary "Configurng Neutron FWaaS Dashboard"
configure_neutron_fwaas_dashboard
elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
# no-op
:
fi
if [[ "$1" == "unstack" ]]; then
# Remove enabled file(s)
for _enabled_file in $FWAAS_ENABLED_DIR/_[0-9]*.py; do
_enabled_basename=$(basename $_enabled_file .py)
rm -f $HORIZON_ENABLED_DIR/${_enabled_basename}.py*
rm -f $HORIZON_ENABLED_DIR/__pycache__/${_enabled_basename}.*pyc
done
fi
if [[ "$1" == "clean" ]]; then
# Remove state and transient data
# Remember clean.sh first calls unstack.sh
rm -f $OPENSTACK_DASHBOARD_DIR/local/local_settings.d/_7000_neutron_fwaas.py*
rm -f $OPENSTACK_DASHBOARD_DIR/conf/neutron-fwaas-policy.json
fi
fi

View File

@ -1,2 +0,0 @@
# settings file for neutron-fwaas-dashboard plugin
enable_service neutron-fwaas-dashboard

View File

@ -1,215 +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.
#
# Horizon documentation build configuration file, created by
# sphinx-quickstart on Thu Oct 27 11:38:59 2011.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import os
import sys
import django
PROJECT = 'neutron-fwaas-dashboard'
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT = os.path.abspath(os.path.join(BASE_DIR, "..", ".."))
sys.path.insert(0, ROOT)
# This is required for ReadTheDocs.org, but isn't a bad idea anyway.
os.environ.setdefault('DJANGO_SETTINGS_MODULE',
'neutron_fwaas_dashboard.test.settings')
django.setup()
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings.
# They can be extensions coming with Sphinx (named 'sphinx.ext.*')
# or your custom ones.
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.todo',
'sphinx.ext.coverage',
'sphinx.ext.viewcode',
'reno.sphinxext',
'openstackdocstheme',
]
# openstackdocstheme options
openstackdocs_repo_name = 'openstack/neutron-fwaas-dashboard'
openstackdocs_pdf_link = True
openstackdocs_auto_name = False
openstackdocs_bug_project = 'neutron-fwaas-dashboard'
openstackdocs_bug_tag = 'doc'
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
# source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Neutron FWaaS Dashboard'
copyright = u'2017, OpenStack Foundation'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
# language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
# today = ''
# Else, today_fmt is used as the format for a strftime call.
# today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['**/#*', '**~', '**/#*#']
# The reST default role (used for this markup: `text`)
# to use for all documents.
# default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
# add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
# add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'native'
# A list of ignored prefixes for module index sorting.
modindex_common_prefix = ['neutron_fwaas_dashboard.']
primary_domain = 'py'
nitpicky = False
# -- Options for HTML output --------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
# html_theme_path = ['.']
html_theme = 'openstackdocs'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
html_theme_options = {
"nosidebar": "false"
}
# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
# html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
# html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
# html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
# html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
# html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
# html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
# html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
# html_additional_pages = {}
# If false, no module index is generated.
# html_domain_indices = True
# If false, no index is generated.
# html_use_index = True
# If true, the index is split into individual pages for each letter.
# html_split_index = False
# If true, links to the reST sources are added to the pages.
# html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
# html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
# html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
# html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'neutronfwaasdashboarddoc'
# -- Options for LaTeX output ------------------------------------------------
latex_documents = [
('index', 'doc-neutron-fwaas-dashboard.tex',
u'Neutron FWaaS Dashboard Documentation',
u'Neutron Contributors', 'howto'),
]

View File

@ -1,28 +0,0 @@
..
Copyright 2017 OpenStack Foundation
All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain
a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
=============
Configuration
=============
Neutron FWaaS dashboard has no configuration option.
It checks if Neutron FWaaS service is enabled in your neutron server
and the FWaaS panel is displayed if enabled.
For more configurations, see
`Settings Reference
<https://docs.openstack.org/horizon/latest/configuration/settings.html>`__
in the Horizon documentation.

View File

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

View File

@ -1,32 +0,0 @@
..
Copyright 2017 OpenStack Foundation
All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain
a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
=================
Contributor Guide
=================
There is no topic specific to neutron-fwaas-dashboard now.
See `Horizon Contributor Documentation
<https://docs.openstack.org/horizon/latest/contributor/>`__
for general topic on developing a dashboard on horizon.
----
.. toctree::
:maxdepth: 1
DevStack plugin <devstack-plugin>

View File

@ -1,37 +0,0 @@
..
Copyright 2017 OpenStack Foundation
All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain
a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
================================
Neutron FWaaS Dashboard Project
================================
.. warning::
Due to lack of maintainers this project is now deprecated in the Neutron
stadium and will be removed from stadium in ``W`` cycle.
If You want to step in and be maintainer of this project to keep it in the
Neutron stadium, please contact the ``neutron team`` via
openstack-discuss@lists.openstack.org or IRC channel #openstack-neutron
@freenode.
Neutron FWaaS Dashboard is a horizon plugin for Neutron FWaaS.
.. toctree::
:maxdepth: 1
install/index
configuration/index
contributor/index
Release Notes <https://docs.openstack.org/releasenotes/neutron-fwaas-dashboard/>

View File

@ -1,99 +0,0 @@
..
Copyright 2017 OpenStack Foundation
All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License. You may obtain
a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
============
Installation
============
Manual Installation
-------------------
Before installing neutron-fwaas-dashboard,
you first need to install horizon in your environment.
Fetch the source code from git and run pip install.
Make sure to install neutron-fwaas-dashboard into the same python environment
where horizon is installed.
.. code-block:: console
$ git clone https://opendev.org/openstack/neutron-fwaas-dashboard
$ cd neutron-fwaas-dashboard
$ sudo pip install .
Enable the horizon plugin.
.. code-block:: console
$ cp neutron_fwaas_dashboard/enabled/_70*_*.py \
/opt/stack/horizon/openstack_dashboard/local/enabled/
.. note::
The directory ``local/enabled`` may be different depending on your
environment or distribution used. For example, for Ubuntu, this is
``/usr/share/openstack-dashboard/openstack_dashboard/local/enabled``.
.. note::
The number of the plugin enabled file determines the order of panels.
If you would like to configure the place of the Neutron FWaaS dashboard,
change the number of the file.
.. note::
For more detail of the horizon plugin settings,
see `Pluggable Settings
<https://docs.openstack.org/horizon/latest/configuration/pluggable_panels.html>`__
in the horizon documentation.
Configure the policy file for Neutron FWaaS dashboard
in OpenStack Dashboard ``local_settings.py``.
``<fwaas-dashboard-config-dir>`` is a directory which contains
configurations for Neutron FWaaS dashboard and the location varies
across distributions or deployments.
.. code-block:: python
POLICY_FILES['neutron-fwaas'] = '<fwaas-dashboard-config-dir>/etc/neutron-fwaas-policy.json'
.. note::
If you do not configure ``POLICY_FILES`` in your ``local_settings.py``,
you also need to define the default ``POLICY_FILES`` in
``local_settings.py``. If you use the example ``local_settings.py`` file
from horizon, what you need is to uncomment ``POLICY_FILES`` (which contains
the default values).
Compile the message catalogs of Neutron FWaaS dashboard.
.. code-block:: console
$ cd neutron-fwaas-dashboard
$ ./manage.py compilemessages
Run the Django update commands (if you use).
.. code-block:: console
$ DJANGO_SETTINGS_MODULE=openstack_dashboard.settings python manage.py collectstatic --noinput
$ DJANGO_SETTINGS_MODULE=openstack_dashboard.settings python manage.py compress --force
Restart Apache:
.. code-block:: console
$ sudo service apache2 restart

View File

@ -1,36 +0,0 @@
{
"context_is_admin": "role:admin",
"owner": "tenant_id:%(tenant_id)s",
"admin_or_owner": "rule:context_is_admin or rule:owner",
"admin_only": "rule:context_is_admin",
"shared_firewalls": "field:firewalls:shared=True",
"shared_firewall_policies": "field:firewall_policies:shared=True",
"default": "rule:admin_or_owner",
"create_firewall": "",
"get_firewall": "rule:admin_or_owner",
"create_firewall:shared": "rule:admin_only",
"get_firewall:shared": "rule:admin_only",
"update_firewall": "rule:admin_or_owner",
"update_firewall:shared": "rule:admin_only",
"delete_firewall": "rule:admin_or_owner",
"create_firewall_policy": "",
"get_firewall_policy": "rule:admin_or_owner or rule:shared_firewall_policies",
"update_firewall_policy": "rule:admin_or_owner",
"delete_firewall_policy": "rule:admin_or_owner",
"create_firewall_policy:shared": "rule:admin_only",
"update_firewall_policy:shared": "rule:admin_only",
"delete_firewall_policy:shared": "rule:admin_only",
"insert_rule": "rule:admin_or_owner",
"remove_rule": "rule:admin_or_owner",
"create_firewall_rule": "",
"get_firewall_rule": "rule:admin_or_owner or rule:shared_firewalls",
"update_firewall_rule": "rule:admin_or_owner",
"delete_firewall_rule": "rule:admin_or_owner",
"create_firewall_rule:shared": "rule:admin_only",
"update_firewall_rule:shared": "rule:admin_only",
"delete_firewall_rule:shared": "rule:admin_only"
}

View File

@ -1,151 +0,0 @@
alabaster==0.7.10
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
debtcollector==1.2.0
decorator==3.4.0
deprecation==1.0
Django==2.2
django-appconf==1.0.2
django-babel==0.6.2
django-compressor==2.0
django-pyscss==2.0.2
docutils==0.11
dogpile.cache==0.6.2
dulwich==0.15.0
eventlet==0.18.2
extras==1.0.0
fasteners==0.7.0
fixtures==3.0.0
flake8==2.5.5
flake8-import-order==0.13
futurist==1.2.0
greenlet==0.4.10
hacking==0.12.0
horizon==17.1.0
idna==2.6
imagesize==0.7.1
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
monotonic==0.6
msgpack-python==0.4.0
munch==2.1.0
netaddr==0.7.18
netifaces==0.10.4
openstackdocstheme==2.2.1
openstacksdk==0.11.2
os-client-config==1.28.0
os-service-types==1.2.0
osc-lib==1.8.0
oslo.concurrency==3.26.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
osprofiler==2.3.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
pycodestyle==2.3.1
pycparser==2.18
pyflakes==0.8.1
Pygments==2.2.0
pyinotify==0.9.6
pymongo==3.0.2
pyOpenSSL==17.1.0
pyparsing==2.1.0
pyperclip==1.5.27
pyScss==1.3.7
python-cinderclient==5.0.0
python-dateutil==2.5.3
python-glanceclient==2.8.0
python-keystoneclient==3.22.0
python-mimeparse==1.6.0
python-neutronclient==6.7.0
python-novaclient==9.1.0
python-swiftclient==3.2.0
pytz==2013.6
PyYAML==3.12
rcssmin==1.0.6
reno==3.1.0
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
snowballstemmer==1.2.1
Sphinx==2.0.0
sphinxcontrib-websupport==1.0.1
statsd==3.2.1
stevedore==1.20.0
tenacity==3.2.1
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",
"neutron_fwaas_dashboard.test.settings")
execute_from_command_line(sys.argv)

View File

@ -1,348 +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 collections
from openstack_dashboard.api import neutron
import openstack_dashboard.api.nova as nova
from openstack_dashboard.contrib.developer.profiler import api as profiler
neutronclient = neutron.neutronclient
class Port(neutron.NeutronAPIDictWrapper):
"""Wrapper for neutron port."""
class Rule(neutron.NeutronAPIDictWrapper):
"""Wrapper for neutron firewall rule."""
class Policy(neutron.NeutronAPIDictWrapper):
"""Wrapper for neutron firewall policy."""
class FirewallGroup(neutron.NeutronAPIDictWrapper):
"""Wrapper for neutron firewall group."""
def rule_create(request, **kwargs):
"""Create a firewall rule
:param request: request context
:param name: name for rule
:param description: description for rule
:param protocol: protocol for rule
:param action: action for rule
:param source_ip_address: source IP address or subnet
:param source_port: integer in [1, 65535] or range in a:b
:param destination_ip_address: destination IP address or subnet
:param destination_port: integer in [1, 65535] or range in a:b
:param shared: boolean (default false)
:param enabled: boolean (default true)
:return: Rule object
"""
body = {'firewall_rule': kwargs}
rule = neutronclient(request).create_fwaas_firewall_rule(
body).get('firewall_rule')
return Rule(rule)
@profiler.trace
def get_network_names(request):
networks = neutronclient(request).list_networks(fields=["name", "id"])\
.get('networks', [])
mapped = {n['id']: neutron.Network(n) for n in networks}
return mapped
@profiler.trace
def get_router_names(request):
routers = neutronclient(request).list_routers(fields=["name", "id"])\
.get('routers', [])
mapped = {r['id']: neutron.Router(r) for r in routers}
return mapped
@profiler.trace
def get_servers(request):
servers = nova.server_list(request)[0]
mapped = {s.id: s for s in servers}
return mapped
@profiler.trace
def rule_list(request, **kwargs):
return _rule_list(request, **kwargs)
@profiler.trace
def port_list(request, tenant_id, **kwargs):
kwargs['tenant_id'] = tenant_id
ports = neutronclient(request).list_ports(**kwargs).get('ports')
return {
p['id']: Port(p) for p in ports if _is_target(p)
}
# Gets ids of all ports assigned to firewall groups
@profiler.trace
def fwg_port_list(request, **kwargs):
fwgs = neutronclient(request).list_fwaas_firewall_groups(
**kwargs).get('firewall_groups')
ports = set()
for fwg in fwgs:
if fwg['ports']:
ports.update(fwg['ports'])
return ports
@profiler.trace
def fwg_port_list_for_tenant(request, tenant_id, **kwargs):
kwargs['tenant_id'] = tenant_id
ports = neutronclient(request).list_ports(**kwargs).get('ports')
# TODO(SarathMekala): Remove ports which are already associated with a FWG
fwgs = neutronclient(request).list_fwaas_firewall_groups(
**kwargs).get('firewall_groups')
fwg_ports = []
for fwg in fwgs:
if not fwg['ports']:
continue
fwg_ports += fwg['ports']
return [Port(p) for p in ports
if _is_target(p) and p['id'] not in fwg_ports]
def _is_target(port):
return (port['device_owner'].startswith('compute:') or
port['device_owner'].startswith('network:router_interface'))
@profiler.trace
def rule_list_for_tenant(request, tenant_id, **kwargs):
"""Return a rule list available for the tenant.
The list contains rules owned by the tenant and shared rules.
This is required because Neutron returns all resources including
all tenants if a user has admin role.
"""
rules = rule_list(request, tenant_id=tenant_id, shared=False, **kwargs)
shared_rules = rule_list(request, shared=True, **kwargs)
return rules + shared_rules
def _rule_list(request, **kwargs):
rules = neutronclient(request).list_fwaas_firewall_rules(
**kwargs).get('firewall_rules')
return [Rule(r) for r in rules]
@profiler.trace
def rule_get(request, rule_id):
return _rule_get(request, rule_id)
def _rule_get(request, rule_id):
rule = neutronclient(request).show_fwaas_firewall_rule(
rule_id).get('firewall_rule')
return Rule(rule)
@profiler.trace
def rule_delete(request, rule_id):
neutronclient(request).delete_fwaas_firewall_rule(rule_id)
@profiler.trace
def rule_update(request, rule_id, **kwargs):
body = {'firewall_rule': kwargs}
rule = neutronclient(request).update_fwaas_firewall_rule(
rule_id, body).get('firewall_rule')
return Rule(rule)
@profiler.trace
def policy_create(request, **kwargs):
"""Create a firewall policy
:param request: request context
:param name: name for policy
:param description: description for policy
:param firewall_rules: ordered list of rules in policy
:param shared: boolean (default false)
:param audited: boolean (default false)
:return: Policy object
"""
body = {'firewall_policy': kwargs}
policy = neutronclient(request).create_fwaas_firewall_policy(
body).get('firewall_policy')
return Policy(policy)
@profiler.trace
def policy_list(request, **kwargs):
return _policy_list(request, expand_rule=True, **kwargs)
@profiler.trace
def policy_list_for_tenant(request, tenant_id, **kwargs):
"""Return a policy list available for the tenant.
The list contains policies owned by the tenant and shared policies.
This is required because Neutron returns all resources including
all tenants if a user has admin role.
"""
policies = policy_list(request, tenant_id=tenant_id,
shared=False, **kwargs)
shared_policies = policy_list(request, shared=True, **kwargs)
return policies + shared_policies
def _policy_list(request, expand_rule, **kwargs):
policies = neutronclient(request).list_fwaas_firewall_policies(
**kwargs).get('firewall_policies')
if expand_rule and policies:
rules = _rule_list(request)
rule_dict = collections.OrderedDict((rule.id, rule) for rule in rules)
for p in policies:
p['rules'] = [rule_dict.get(rule) for rule in p['firewall_rules']]
return [Policy(p) for p in policies]
@profiler.trace
def policy_get(request, policy_id):
return _policy_get(request, policy_id, expand_rule=True)
def _policy_get(request, policy_id, expand_rule):
policy = neutronclient(request).show_fwaas_firewall_policy(
policy_id).get('firewall_policy')
if expand_rule:
policy_rules = policy['firewall_rules']
if policy_rules:
rules = _rule_list(request, firewall_policy_id=policy_id)
rule_dict = collections.OrderedDict((rule.id, rule)
for rule in rules)
policy['rules'] = [rule_dict.get(rule) for rule in policy_rules]
else:
policy['rules'] = []
return Policy(policy)
@profiler.trace
def policy_delete(request, policy_id):
neutronclient(request).delete_fwaas_firewall_policy(policy_id)
@profiler.trace
def policy_update(request, policy_id, **kwargs):
body = {'firewall_policy': kwargs}
policy = neutronclient(request).update_fwaas_firewall_policy(
policy_id, body).get('firewall_policy')
return Policy(policy)
@profiler.trace
def policy_insert_rule(request, policy_id, **kwargs):
policy = neutronclient(request).insert_rule_fwaas_firewall_policy(
policy_id, kwargs)
return Policy(policy)
@profiler.trace
def policy_remove_rule(request, policy_id, **kwargs):
policy = neutronclient(request).remove_rule_fwaas_firewall_policy(
policy_id, kwargs)
return Policy(policy)
@profiler.trace
def firewall_group_create(request, **kwargs):
"""Create a firewall group for specified policy
:param request: request context
:param name: name for firewall group
:param description: description for firewall group
:param firewall_policy_id: policy id used by firewall group
:param shared: boolean (default false)
:param admin_state_up: boolean (default true)
:return: Firewall group object
"""
body = {'firewall_group': kwargs}
firewall_group = neutronclient(request).create_fwaas_firewall_group(body)
return FirewallGroup(firewall_group['firewall_group'])
@profiler.trace
def firewall_group_list(request, **kwargs):
return _firewall_group_list(request, **kwargs)
@profiler.trace
def firewall_group_list_for_tenant(request, tenant_id, **kwargs):
"""Return a firewall group list available for the tenant.
The list contains firewall groups owned by the tenant and shared firewall
groups. This is required because Neutron returns all resources including
all tenants if a user has admin role.
"""
fwg = firewall_group_list(request, tenant_id=tenant_id,
shared=False, **kwargs)
shared_fwg = firewall_group_list(request, shared=True, **kwargs)
return fwg + shared_fwg
# TODO(SarathMekala): Support expand_policy for _firewall_group_list
def _firewall_group_list(request, **kwargs):
firewall_groups = neutronclient(request).list_fwaas_firewall_groups(
**kwargs).get('firewall_groups')
return [FirewallGroup(f) for f in firewall_groups]
@profiler.trace
def firewall_group_get(request, firewallgroup_id):
return _firewall_group_get(request, firewallgroup_id, expand_policy=True)
def _firewall_group_get(request, firewallgroup_id, expand_policy):
firewall_group = neutronclient(request).show_fwaas_firewall_group(
firewallgroup_id).get('firewall_group')
if expand_policy:
ingress_policy_id = firewall_group['ingress_firewall_policy_id']
if ingress_policy_id:
firewall_group['ingress_policy'] = _policy_get(
request, ingress_policy_id, expand_rule=False)
else:
firewall_group['ingress_policy'] = None
egress_policy_id = firewall_group['egress_firewall_policy_id']
if egress_policy_id:
firewall_group['egress_policy'] = _policy_get(
request, egress_policy_id, expand_rule=False)
else:
firewall_group['egress_policy'] = None
return FirewallGroup(firewall_group)
@profiler.trace
def firewall_group_delete(request, firewallgroup_id):
neutronclient(request).delete_fwaas_firewall_group(firewallgroup_id)
@profiler.trace
def firewall_group_update(request, firewallgroup_id, **kwargs):
body = {'firewall_group': kwargs}
firewall_group = neutronclient(request).update_fwaas_firewall_group(
firewallgroup_id, body).get('firewall_group')
return FirewallGroup(firewall_group)

View File

@ -1,449 +0,0 @@
# Copyright 2017, Juniper Networks, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
from operator import attrgetter
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from horizon.utils import validators
from neutron_fwaas_dashboard.api import fwaas_v2 as api_fwaas_v2
from neutron_fwaas_dashboard.dashboards.project.firewalls_v2 import widgets
port_validator = validators.validate_port_or_colon_separated_port_range
LOG = logging.getLogger(__name__)
class UpdateRule(forms.SelfHandlingForm):
name = forms.CharField(max_length=80, label=_("Name"), required=False)
description = forms.CharField(
required=False,
max_length=80, label=_("Description"))
protocol = forms.ThemableChoiceField(
label=_("Protocol"),
choices=[('tcp', _('TCP')), ('udp', _('UDP')), ('icmp', _('ICMP')),
('any', _('ANY'))],
help_text=_('Protocol for the firewall rule'))
action = forms.ThemableChoiceField(
label=_("Action"),
choices=[('allow', _('ALLOW')), ('deny', _('DENY')),
('reject', _('REJECT'))],
help_text=_('Action for the firewall rule'))
source_ip_address = forms.IPField(
label=_("Source IP Address/Subnet"),
version=forms.IPv4 | forms.IPv6,
required=False, mask=True,
help_text=_('Source IP address or subnet'))
destination_ip_address = forms.IPField(
label=_('Destination IP Address/Subnet'),
version=forms.IPv4 | forms.IPv6,
required=False, mask=True,
help_text=_('Destination IP address or subnet'))
source_port = forms.CharField(
max_length=80,
label=_("Source Port/Port Range"),
required=False,
validators=[port_validator],
help_text=_('Source port (integer in [1, 65535] or range in a:b)'))
destination_port = forms.CharField(
max_length=80,
label=_("Destination Port/Port Range"),
required=False,
validators=[port_validator],
help_text=_('Destination port (integer in [1, 65535] or range'
' in a:b)'))
ip_version = forms.ThemableChoiceField(
label=_("IP Version"),
choices=[('4', '4'), ('6', '6')],
help_text=_('IP Version for Firewall Rule'))
shared = forms.BooleanField(label=_("Shared"), required=False)
enabled = forms.BooleanField(label=_("Enabled"), required=False)
failure_url = 'horizon:project:firewalls_v2:index'
def _convert_req_body(self, body):
for key in ['source_port', 'source_ip_address',
'destination_port', 'destination_ip_address']:
if key in body and not body[key]:
body[key] = None
if body.get('protocol') == 'any':
body['protocol'] = None
return body
def handle(self, request, context):
rule_id = self.initial['id']
name_or_id = context.get('name') or rule_id
body = self._convert_req_body(_get_request_body(context, self.initial))
try:
rule = api_fwaas_v2.rule_update(request, rule_id, **body)
msg = _('Rule %s was successfully updated.') % name_or_id
messages.success(request, msg)
return rule
except Exception as e:
msg = (_('Failed to update rule %(name)s: %(reason)s') %
{'name': name_or_id, 'reason': e})
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
class UpdatePolicy(forms.SelfHandlingForm):
name = forms.CharField(max_length=80, label=_("Name"), required=False)
description = forms.CharField(required=False,
max_length=80, label=_("Description"))
shared = forms.BooleanField(label=_("Shared"), required=False)
audited = forms.BooleanField(label=_("Audited"), required=False)
failure_url = 'horizon:project:firewalls_v2:index'
def handle(self, request, context):
policy_id = self.initial['id']
name_or_id = context.get('name') or policy_id
body = _get_request_body(context, self.initial)
try:
policy = api_fwaas_v2.policy_update(request, policy_id, **body)
msg = _('Policy %s was successfully updated.') % name_or_id
messages.success(request, msg)
return policy
except Exception as e:
msg = (_('Failed to update policy %(name)s: %(reason)s') %
{'name': name_or_id, 'reason': e})
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
class UpdateFirewall(forms.SelfHandlingForm):
name = forms.CharField(max_length=80,
label=_("Name"),
required=False)
description = forms.CharField(max_length=80,
label=_("Description"),
required=False)
ingress_firewall_policy_id = forms.ThemableChoiceField(
label=_("Ingress Policy"), required=False)
egress_firewall_policy_id = forms.ThemableChoiceField(
label=_("Egress Policy"), required=False)
admin_state_up = forms.BooleanField(label=_("Admin State"),
required=False)
shared = forms.BooleanField(label=_("Shared"), required=False)
failure_url = 'horizon:project:firewalls_v2:index'
def __init__(self, request, *args, **kwargs):
super(UpdateFirewall, self).__init__(request, *args, **kwargs)
try:
tenant_id = self.request.user.tenant_id
policies = api_fwaas_v2.policy_list_for_tenant(request, tenant_id)
policies = sorted(policies, key=attrgetter('name'))
except Exception:
exceptions.handle(request, _('Unable to retrieve policy list.'))
policies = []
egress_policy_id_choices = []
ingress_policy_id_choices = []
ingress_policy_id = kwargs['initial']['ingress_firewall_policy_id']
if ingress_policy_id:
ingress_policy_name = [
p.name for p in policies if p.id == ingress_policy_id][0]
ingress_policy_id_choices.append(
(ingress_policy_id, ingress_policy_name))
egress_policy_id = kwargs['initial']['egress_firewall_policy_id']
if egress_policy_id:
egress_policy_name = [
p.name for p in policies if p.id == egress_policy_id][0]
egress_policy_id_choices.append((egress_policy_id,
egress_policy_name))
ingress_policy_id_choices.append(('', _('None')))
egress_policy_id_choices.append(('', _('None')))
for p in policies:
if p.id != ingress_policy_id:
ingress_policy_id_choices.append((p.id, p.name_or_id))
if p.id != egress_policy_id:
egress_policy_id_choices.append((p.id, p.name_or_id))
self.fields['ingress_firewall_policy_id'].choices = \
ingress_policy_id_choices
self.fields['egress_firewall_policy_id'].choices = \
egress_policy_id_choices
def _convert_req_body(self, body):
for key in ['ingress_firewall_policy_id', 'egress_firewall_policy_id']:
if key in body and not body[key]:
body[key] = None
return body
def handle(self, request, context):
firewallgroup_id = self.initial['id']
name_or_id = context.get('name') or firewallgroup_id
body = self._convert_req_body(_get_request_body(context, self.initial))
try:
fwg = api_fwaas_v2.firewall_group_update(request,
firewallgroup_id,
**body)
msg = _('Firewall group %s was successfully updated.') % name_or_id
messages.success(request, msg)
return fwg
except Exception as e:
msg = (_('Failed to update firewall group %(name)s: %(reason)s') %
{'name': name_or_id, 'reason': e})
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
class PortSelectionForm(forms.SelfHandlingForm):
port_id = forms.ThemableDynamicChoiceField(
label=_("Ports"),
required=False,
widget=widgets.TableSelectWidget(
columns=['Port', 'Network', 'Owner', 'Device'],
alternate_xs=True
)
)
networks = {}
routers = {}
servers = {}
ports = {}
def __init__(self, request, *args, **kwargs):
super(PortSelectionForm, self).__init__(request, *args, **kwargs)
tenant_id = self.request.user.tenant_id
self.ports = api_fwaas_v2.port_list(request, tenant_id, **kwargs)
self.networks = api_fwaas_v2.get_network_names(request)
self.routers = api_fwaas_v2.get_router_names(request)
self.servers = api_fwaas_v2.get_servers(request)
self.fields['port_id'].widget.build_columns = self._build_col
self.fields['port_id'].choices = self.get_ports(request)
def get_ports(self, request):
return []
def _build_col(self, option):
port = self.ports[option[0]]
columns = self._build_option(port)
return columns
def _build_option(self, port):
network = self.networks.get(port.network_id)
network_label = network.name_or_id if network else port.network_id
owner_label = ''
device_label = ''
if port.device_owner.startswith('network'):
owner_label = 'network'
router = self.routers.get(port.device_id, None)
device_label = router.name_or_id if router else port.device_id
elif port.device_owner.startswith('compute'):
owner_label = 'compute'
server = self.servers.get(port.device_id, None)
device_label = server.name_or_id if server else port.device_id
columns = (port.name_or_id, network_label, owner_label, device_label)
# The return value works off of the original themeable select widget
# This needs to be maintained for the original javascript to work
return columns
class AddPort(PortSelectionForm):
failure_url = 'horizon:project:firewalls_v2:index'
def get_ports(self, request):
used_ports = api_fwaas_v2.fwg_port_list(request)
ports = self.ports.values()
return [(p.id, p.id) for p in ports if p.id not in used_ports]
def handle(self, request, context):
firewallgroup_id = self.initial['id']
name_or_id = context.get('name') or firewallgroup_id
body = _get_request_body(context, self.initial)
add_port = context['port_id']
if add_port:
ports = self.initial['ports']
ports.append(add_port)
body['ports'] = ports
try:
firewallgroup = api_fwaas_v2.firewall_group_update(
request, firewallgroup_id, **body)
msg = (_('Added the port(s) to the firewall group %s '
'successfully.') % name_or_id)
messages.success(request, msg)
return firewallgroup
except Exception as e:
msg = (_('Failed to add the port(s) to the firewall group '
'%(name)s: %(reason)s') %
{'name': name_or_id, 'reason': e})
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
class RemovePort(PortSelectionForm):
failure_url = 'horizon:project:firewalls_v2:index'
def get_ports(self, request):
ports = self.initial['ports']
return [(p, p) for p in ports]
def handle(self, request, context):
firewallgroup_id = self.initial['id']
name_or_id = context.get('name') or firewallgroup_id
body = _get_request_body(context, self.initial)
remove_port = context['port_id']
if remove_port:
ports = self.initial['ports']
ports.remove(remove_port)
body['ports'] = ports
try:
firewallgroup = api_fwaas_v2.firewall_group_update(
request, firewallgroup_id, **body)
msg = _('Removed the port(s) from the firewall group %s '
'successfully.') % name_or_id
messages.success(request, msg)
return firewallgroup
except Exception as e:
msg = (_('Failed to remove the port(s) from the firewall group '
'%(name)s: %(reason)s') %
{'name': name_or_id, 'reason': e})
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
class InsertRuleToPolicy(forms.SelfHandlingForm):
firewall_rule_id = forms.ThemableChoiceField(label=_("Insert Rule"))
insert_before = forms.ThemableChoiceField(label=_("Before"),
required=False)
insert_after = forms.ThemableChoiceField(label=_("After"),
required=False)
failure_url = 'horizon:project:firewalls_v2:index'
def __init__(self, request, *args, **kwargs):
super(InsertRuleToPolicy, self).__init__(request, *args, **kwargs)
try:
tenant_id = self.request.user.tenant_id
all_rules = api_fwaas_v2.rule_list_for_tenant(request, tenant_id)
all_rules = sorted(all_rules, key=attrgetter('name_or_id'))
available_rules = [r for r in all_rules]
current_rules = []
for x in kwargs['initial']['firewall_rules']:
r_obj = [rule for rule in all_rules if x == rule.id][0]
current_rules.append(r_obj)
available_choices = [(r.id, r.name_or_id) for r in available_rules]
current_choices = [(r.id, r.name_or_id) for r in current_rules]
except Exception as e:
msg = _('Failed to retrieve available rules: %s') % e
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
self.fields['firewall_rule_id'].choices = available_choices
self.fields['insert_before'].choices = [('', _('-'))] + current_choices
self.fields['insert_after'].choices = [('', _('-'))] + current_choices
def handle(self, request, context):
policy_id = self.initial['id']
policy_name_or_id = self.initial['name'] or policy_id
try:
insert_rule_id = context['firewall_rule_id']
insert_rule = api_fwaas_v2.rule_get(request, insert_rule_id)
body = {'firewall_rule_id': insert_rule_id,
'insert_before': context['insert_before'],
'insert_after': context['insert_after']}
policy = api_fwaas_v2.policy_insert_rule(request, policy_id,
**body)
msg = (_('Rule %(rule)s was successfully inserted to policy '
'%(policy)s.') %
{'rule': insert_rule.name or insert_rule.id,
'policy': policy_name_or_id})
messages.success(request, msg)
return policy
except Exception as e:
msg = (_('Failed to insert rule to policy %(name)s: %(reason)s') %
{'name': policy_id, 'reason': e})
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
class RemoveRuleFromPolicy(forms.SelfHandlingForm):
firewall_rule_id = forms.ThemableChoiceField(label=_("Remove Rule"))
failure_url = 'horizon:project:firewalls_v2:index'
def __init__(self, request, *args, **kwargs):
super(RemoveRuleFromPolicy, self).__init__(request, *args, **kwargs)
try:
tenant_id = request.user.tenant_id
all_rules = api_fwaas_v2.rule_list_for_tenant(request, tenant_id)
current_rules = []
for r in kwargs['initial']['firewall_rules']:
r_obj = [rule for rule in all_rules if r == rule.id][0]
current_rules.append(r_obj)
current_choices = [(r.id, r.name_or_id) for r in current_rules]
except Exception as e:
msg = (_('Failed to retrieve current rules in policy %(name)s: '
'%(reason)s') %
{'name': self.initial['name'], 'reason': e})
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
self.fields['firewall_rule_id'].choices = current_choices
def handle(self, request, context):
policy_id = self.initial['id']
policy_name_or_id = self.initial['name'] or policy_id
try:
remove_rule_id = context['firewall_rule_id']
remove_rule = api_fwaas_v2.rule_get(request, remove_rule_id)
body = {'firewall_rule_id': remove_rule_id}
policy = api_fwaas_v2.policy_remove_rule(request, policy_id,
**body)
msg = (_('Rule %(rule)s was successfully removed from policy '
'%(policy)s.') %
{'rule': remove_rule.name or remove_rule.id,
'policy': policy_name_or_id})
messages.success(request, msg)
return policy
except Exception as e:
msg = (_('Failed to remove rule from policy %(name)s: %(reason)s')
% {'name': self.initial['name'], 'reason': e})
redirect = reverse(self.failure_url)
exceptions.handle(request, msg, redirect=redirect)
def _get_request_body(context, initial_values):
body = {}
for key, value in context.items():
# TODO(yushiro): Refactor after Q-2.
if key == 'port_id':
continue
if value != initial_values[key]:
body[key] = value
return body

View File

@ -1,43 +0,0 @@
# Copyright 2017, Juniper Networks, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
from django.utils.translation import ugettext_lazy as _
import horizon
from openstack_dashboard.api import neutron
LOG = logging.getLogger(__name__)
class Firewall_V2(horizon.Panel):
name = _("Firewall Groups")
slug = "firewalls_v2"
permissions = ('openstack.services.network',)
def allowed(self, context):
request = context['request']
if not request.user.has_perms(self.permissions):
return False
try:
if not neutron.is_extension_supported(request, 'fwaas_v2'):
return False
except Exception:
LOG.error("Call to list enabled services failed. This is likely "
"due to a problem communicating with the Neutron "
"endpoint. Firewall Groups panel will not be displayed.")
return False
if not super(Firewall_V2, self).allowed(context):
return False
return True

View File

@ -1,425 +0,0 @@
# Copyright 2017, Juniper Networks, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
from django.template import defaultfilters as filters
from django.urls import reverse
from django.utils.translation import pgettext_lazy
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import ungettext_lazy
from horizon import exceptions
from horizon import tables
from openstack_dashboard.dashboards.project.networks.ports \
import tables as port_tables
from openstack_dashboard import policy
from neutron_fwaas_dashboard.api import fwaas_v2 as api_fwaas_v2
LOG = logging.getLogger(__name__)
class AddRuleLink(tables.LinkAction):
name = "addrule"
verbose_name = _("Add Rule")
url = "horizon:project:firewalls_v2:addrule"
classes = ("ajax-modal",)
icon = "plus"
policy_rules = (("neutron-fwaas", "create_fwaas_firewall_rule"),)
class AddPolicyLink(tables.LinkAction):
name = "addpolicy"
verbose_name = _("Add Policy")
url = "horizon:project:firewalls_v2:addpolicy"
classes = ("ajax-modal", "btn-addpolicy",)
icon = "plus"
policy_rules = (("neutron-fwaas", "create_fwaas_firewall_policy"),)
class AddFirewallGroupLink(tables.LinkAction):
name = "addfirewallgroup"
verbose_name = _("Create Firewall Group")
url = "horizon:project:firewalls_v2:addfirewallgroup"
classes = ("ajax-modal",)
icon = "plus"
policy_rules = (("neutron-fwaas", "create_fwaas_firewall_group"),)
class DeleteRuleLink(policy.PolicyTargetMixin, tables.DeleteAction):
name = "deleterule"
policy_rules = (("neutron-fwaas", "delete_fwaas_firewall_rule"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Rule",
u"Delete Rules",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Scheduled deletion of Rule",
u"Scheduled deletion of Rules",
count
)
def allowed(self, request, datum=None):
# TODO(Sarath Mekala): If the rule is associated with a policy then
# return false.
return True
def delete(self, request, obj_id):
try:
api_fwaas_v2.rule_delete(request, obj_id)
except Exception as e:
exceptions.handle(request, _('Unable to delete rule. %s') % e)
class DeletePolicyLink(policy.PolicyTargetMixin, tables.DeleteAction):
name = "deletepolicy"
policy_rules = (("neutron-fwaas", "delete_fwaas_firewall_policy"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Policy",
u"Delete Policies",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Scheduled deletion of Policy",
u"Scheduled deletion of Policies",
count
)
def delete(self, request, obj_id):
try:
api_fwaas_v2.policy_delete(request, obj_id)
except Exception as e:
exceptions.handle(request, _('Unable to delete policy. %s') % e)
class DeleteFirewallGroupLink(policy.PolicyTargetMixin,
tables.DeleteAction):
name = "deletefirewallgroup"
policy_rules = (("neutron-fwaas", "delete_fwaas_firewall_group"),)
@staticmethod
def action_present(count):
return ungettext_lazy(
u"Delete Firewall Group",
u"Delete Firewall Groups",
count
)
@staticmethod
def action_past(count):
return ungettext_lazy(
u"Scheduled deletion of Firewall Group",
u"Scheduled deletion of Firewall Groups",
count
)
def delete(self, request, obj_id):
try:
api_fwaas_v2.firewall_group_delete(request, obj_id)
except Exception as e:
exceptions.handle(request,
_('Unable to delete firewall group. %s') % e)
class UpdateRuleLink(policy.PolicyTargetMixin, tables.LinkAction):
name = "updaterule"
verbose_name = _("Edit Rule")
classes = ("ajax-modal", "btn-update",)
policy_rules = (("neutron-fwaas", "update_fwaas_firewall_rule"),)
def get_link_url(self, rule):
return reverse("horizon:project:firewalls_v2:updaterule",
kwargs={'rule_id': rule.id})
class UpdatePolicyLink(policy.PolicyTargetMixin, tables.LinkAction):
name = "updatepolicy"
verbose_name = _("Edit Policy")
classes = ("ajax-modal", "btn-update",)
policy_rules = (("neutron-fwaas", "update_fwaas_firewall_policy"),)
def get_link_url(self, policy):
return reverse("horizon:project:firewalls_v2:updatepolicy",
kwargs={'policy_id': policy.id})
class UpdateFirewallGroupLink(policy.PolicyTargetMixin, tables.LinkAction):
name = "updatefirewall"
verbose_name = _("Edit Firewall Group")
classes = ("ajax-modal", "btn-update",)
policy_rules = (("neutron-fwaas", "update_firewall"),)
def get_link_url(self, firewallgroup):
return reverse("horizon:project:firewalls_v2:updatefirewall",
kwargs={'firewall_id': firewallgroup.id})
def allowed(self, request, firewallgroup):
return firewallgroup.status not in (
"PENDING_CREATE",
"PENDING_UPDATE",
"PENDING_DELETE")
class InsertRuleToPolicyLink(policy.PolicyTargetMixin,
tables.LinkAction):
name = "insertrule"
verbose_name = _("Insert Rule")
classes = ("ajax-modal", "btn-update",)
policy_rules = (("neutron-fwaas", "show_fwaas_firewall_policy"),
("neutron-fwaas", "insert_rule_fwaas_firewall_policy"),)
def get_link_url(self, policy):
return reverse("horizon:project:firewalls_v2:insertrule",
kwargs={'policy_id': policy.id})
class RemoveRuleFromPolicyLink(policy.PolicyTargetMixin,
tables.LinkAction):
name = "removerule"
verbose_name = _("Remove Rule")
classes = ("ajax-modal",)
policy_rules = (("neutron-fwaas", "show_fwaas_firewall_policy"),
("neutron-fwaas", "firewall_policy_remove_rule"),)
action_type = "danger"
def get_link_url(self, policy):
return reverse("horizon:project:firewalls_v2:removerule",
kwargs={'policy_id': policy.id})
def allowed(self, request, policy):
return bool(policy.rules)
class AddPortToFirewallGroupLink(policy.PolicyTargetMixin,
tables.LinkAction):
name = "addport"
verbose_name = _("Add Port")
classes = ("ajax-modal", "btn-update",)
policy_rules = (("neutron-fwaas", "update_fwaas_firewall_group"),)
def get_link_url(self, firewallgroup):
return reverse("horizon:project:firewalls_v2:addport",
kwargs={'firewallgroup_id': firewallgroup.id})
def allowed(self, request, firewallgroup):
return firewallgroup.status not in (
"PENDING_CREATE",
"PENDING_UPDATE",
"PENDING_DELETE")
class RemovePortFromFirewallGroupLink(policy.PolicyTargetMixin,
tables.LinkAction):
name = "removeport"
verbose_name = _("Remove Port")
classes = ("ajax-modal", "btn-update",)
policy_rules = (("neutron-fwaas", "update_fwaas_firewall_group"),)
def get_link_url(self, firewallgroup):
return reverse("horizon:project:firewalls_v2:removeport",
kwargs={'firewallgroup_id': firewallgroup.id})
def allowed(self, request, firewallgroup):
return firewallgroup.status not in (
"PENDING_CREATE",
"PENDING_UPDATE",
"PENDING_DELETE")
def get_rules_name(datum):
return ', '.join([rule.name_or_id for rule in datum.rules])
def get_ports_name(datum):
return len(datum.ports)
def get_ports_link(datum):
url = reverse("horizon:project:firewalls_v2:firewallgroupdetails",
args=(datum.id,))
return '%s?tab=%s__%s' % (url, 'firewallgrouptabs', 'ports_tab')
def get_ingress_policy_link(datum):
if datum.ingress_firewall_policy_id:
return reverse('horizon:project:firewalls_v2:policydetails',
kwargs={'policy_id': datum.ingress_firewall_policy_id})
def get_egress_policy_link(datum):
if datum.egress_firewall_policy_id:
return reverse('horizon:project:firewalls_v2:policydetails',
kwargs={'policy_id': datum.egress_firewall_policy_id})
def get_ingress_policy_name(datum):
if datum.ingress_firewall_policy_id:
return datum.ingress_policy.name
def get_egress_policy_name(datum):
if datum.egress_firewall_policy_id:
return datum.egress_policy.name
class RulesTable(tables.DataTable):
ACTION_DISPLAY_CHOICES = (
("Allow", pgettext_lazy("Action Name of a Firewall Rule", u"ALLOW")),
("Deny", pgettext_lazy("Action Name of a Firewall Rule", u"DENY")),
("Reject", pgettext_lazy("Action Name of a Firewall Rule", u"REJECT")),
)
name = tables.Column("name_or_id",
verbose_name=_("Name"),
link="horizon:project:firewalls_v2:ruledetails")
description = tables.Column('description', verbose_name=_('Description'))
ip_version = tables.Column('ip_version', verbose_name=('IP Version'))
protocol = tables.Column("protocol",
filters=(lambda v: filters.default(v, _("ANY")),
filters.upper,),
verbose_name=_("Protocol"))
source_ip_address = tables.Column("source_ip_address",
verbose_name=_("Source IP"))
source_port = tables.Column("source_port",
verbose_name=_("Source Port"))
destination_ip_address = tables.Column("destination_ip_address",
verbose_name=_("Destination IP"))
destination_port = tables.Column("destination_port",
verbose_name=_("Destination Port"))
action = tables.Column("action",
display_choices=ACTION_DISPLAY_CHOICES,
verbose_name=_("Action"))
shared = tables.Column("shared",
verbose_name=_("Shared"),
filters=(filters.yesno, filters.capfirst))
enabled = tables.Column("enabled",
verbose_name=_("Enabled"),
filters=(filters.yesno, filters.capfirst))
class Meta(object):
name = "rulestable"
verbose_name = _("Rules")
table_actions = (AddRuleLink,
DeleteRuleLink,
tables.NameFilterAction)
row_actions = (UpdateRuleLink, DeleteRuleLink)
class PoliciesTable(tables.DataTable):
name = tables.Column("name_or_id",
verbose_name=_("Name"),
link="horizon:project:firewalls_v2:policydetails")
description = tables.Column('description', verbose_name=_('Description'))
firewall_rules = tables.Column(get_rules_name,
verbose_name=_("Rules"))
shared = tables.Column("shared",
verbose_name=_("Shared"),
filters=(filters.yesno, filters.capfirst))
audited = tables.Column("audited",
verbose_name=_("Audited"),
filters=(filters.yesno, filters.capfirst))
class Meta(object):
name = "policiestable"
verbose_name = _("Policies")
table_actions = (AddPolicyLink,
DeletePolicyLink,
tables.NameFilterAction)
row_actions = (UpdatePolicyLink, InsertRuleToPolicyLink,
RemoveRuleFromPolicyLink, DeletePolicyLink)
class FirewallGroupsTable(tables.DataTable):
STATUS_DISPLAY_CHOICES = (
("Active", pgettext_lazy("Current status of a Firewall Group",
u"Active")),
("Down", pgettext_lazy("Current status of a Firewall Group",
u"Down")),
("Error", pgettext_lazy("Current status of a Firewall Group",
u"Error")),
("Created", pgettext_lazy("Current status of a Firewall Group",
u"Created")),
("Pending_Create", pgettext_lazy("Current status of a Firewall Group",
u"Pending Create")),
("Pending_Update", pgettext_lazy("Current status of a Firewall Group",
u"Pending Update")),
("Pending_Delete", pgettext_lazy("Current status of a Firewall Group",
u"Pending Delete")),
("Inactive", pgettext_lazy("Current status of a Firewall Group",
u"Inactive")),
)
ADMIN_STATE_DISPLAY_CHOICES = (
("UP", pgettext_lazy("Admin state of a Firewall Group", u"UP")),
("DOWN", pgettext_lazy("Admin state of a Firewall Group", u"DOWN")),
)
name = tables.Column(
"name_or_id",
verbose_name=_("Name"),
link="horizon:project:firewalls_v2:firewallgroupdetails")
description = tables.Column('description', verbose_name=_('Description'))
ingress_firewall_policy_id = tables.Column(
get_ingress_policy_name,
link=get_ingress_policy_link,
verbose_name=_("Ingress Policy"))
egress_firewall_policy_id = tables.Column(get_egress_policy_name,
link=get_egress_policy_link,
verbose_name=_("Egress Policy"))
ports = tables.Column(get_ports_name,
link=get_ports_link,
verbose_name=_("Ports"))
status = tables.Column("status",
verbose_name=_("Status"),
display_choices=STATUS_DISPLAY_CHOICES)
admin_state_up = tables.Column("admin_state_up",
verbose_name=_("Admin State"))
shared = tables.Column("shared",
verbose_name=_("Shared"),
filters=(filters.yesno, filters.capfirst))
class Meta(object):
name = "FirewallGroupsTable"
verbose_name = _("Firewall Groups")
table_actions = (AddFirewallGroupLink,
DeleteFirewallGroupLink,
tables.NameFilterAction)
row_actions = (
UpdateFirewallGroupLink,
DeleteFirewallGroupLink,
AddPortToFirewallGroupLink,
RemovePortFromFirewallGroupLink)
class FirewallGroupPortsTable(port_tables.PortsTable):
class Meta(object):
name = 'ports'
verbose_name = _('Ports')
table_actions = []
row_actions = []

View File

@ -1,165 +0,0 @@
# Copyright 2017, Juniper Networks, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import tabs
from openstack_dashboard.api import neutron as api_neutron
from neutron_fwaas_dashboard.api import fwaas_v2 as api_fwaas_v2
from neutron_fwaas_dashboard.dashboards.project.firewalls_v2 import tables
FirewallGroupsTable = tables.FirewallGroupsTable
PoliciesTable = tables.PoliciesTable
RulesTable = tables.RulesTable
class RulesTab(tabs.TableTab):
table_classes = (RulesTable,)
name = _("Firewall Rules")
slug = "rules"
template_name = "horizon/common/_detail_table.html"
def get_rulestable_data(self):
try:
tenant_id = self.request.user.tenant_id
request = self.tab_group.request
rules = api_fwaas_v2.rule_list_for_tenant(request, tenant_id)
except Exception:
rules = []
exceptions.handle(self.tab_group.request,
_('Unable to retrieve rules list.'))
return rules
class PoliciesTab(tabs.TableTab):
table_classes = (PoliciesTable,)
name = _("Firewall Policies")
slug = "policies"
template_name = "horizon/common/_detail_table.html"
def get_policiestable_data(self):
try:
tenant_id = self.request.user.tenant_id
request = self.tab_group.request
policies = api_fwaas_v2.policy_list_for_tenant(request, tenant_id)
except Exception:
policies = []
exceptions.handle(self.tab_group.request,
_('Unable to retrieve policies list.'))
return policies
class FirewallGroupsTab(tabs.TableTab):
table_classes = (FirewallGroupsTable,)
name = _("Firewall Groups")
slug = "firewallgroups"
template_name = "horizon/common/_detail_table.html"
def get_policy_dict(self, policies):
return dict((policy.id, policy) for policy in policies)
def get_FirewallGroupsTable_data(self):
try:
tenant_id = self.request.user.tenant_id
request = self.tab_group.request
fw_groups = api_fwaas_v2.firewall_group_list_for_tenant(request,
tenant_id)
tenant_policies = api_fwaas_v2.policy_list_for_tenant(
request, tenant_id)
policy_dict = self.get_policy_dict(policies=tenant_policies)
for fw_group in fw_groups:
if fw_group['ingress_firewall_policy_id'] in policy_dict:
fw_group.ingress_policy = \
policy_dict[fw_group['ingress_firewall_policy_id']]
if fw_group['egress_firewall_policy_id'] in policy_dict:
fw_group.egress_policy = \
policy_dict[fw_group['egress_firewall_policy_id']]
except Exception:
fw_groups = []
exceptions.handle(self.tab_group.request,
_('Unable to retrieve firewall group list.'))
return fw_groups
class RuleDetailsTab(tabs.Tab):
name = _("Rule")
slug = "ruledetails"
template_name = "project/firewalls_v2/_rule_details.html"
def get_context_data(self, request):
return {"rule": self.tab_group.kwargs['rule']}
class PolicyDetailsTab(tabs.Tab):
name = _("Policy")
slug = "policydetails"
template_name = "project/firewalls_v2/_policy_details.html"
def get_context_data(self, request):
return {"policy": self.tab_group.kwargs['policy']}
class FirewallGroupDetailsTab(tabs.Tab):
name = _("FirewallGroup")
slug = "firewallgroupdetails"
template_name = "project/firewalls_v2/_firewallgroup_details.html"
def get_context_data(self, request):
return {"firewall_group": self.tab_group.kwargs['firewallgroup']}
class FirewallGroupPortsTab(tabs.TableTab):
name = _("Ports")
slug = "ports_tab"
table_classes = (tables.FirewallGroupPortsTable,)
template_name = ("horizon/common/_detail_table.html")
preload = False
def get_ports_data(self):
port_ids = self.tab_group.kwargs['firewallgroup']['ports']
if not port_ids:
return []
try:
ports = api_neutron.port_list(self.request, id=port_ids)
except Exception:
ports = []
msg = _('Failed to retrieve port list of the firewall group.')
exceptions.handle(self.request, msg)
return ports
class FirewallGroupTabs(tabs.TabGroup):
slug = "fwtabs"
tabs = (FirewallGroupsTab, PoliciesTab, RulesTab)
sticky = True
class RuleDetailsTabs(tabs.DetailTabsGroup):
slug = "ruletabs"
tabs = (RuleDetailsTab,)
class PolicyDetailsTabs(tabs.DetailTabsGroup):
slug = "policytabs"
tabs = (PolicyDetailsTab,)
class FirewallGroupDetailsTabs(tabs.DetailTabsGroup):
slug = "firewallgrouptabs"
tabs = (FirewallGroupDetailsTab, FirewallGroupPortsTab)

View File

@ -1,7 +0,0 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>{% trans "You may add ports to firewall group here." %}</p>
{% endblock %}

View File

@ -1,45 +0,0 @@
{% load i18n sizeformat parse_date %}
<div class="detail">
<dl class="dl-horizontal">
<dt>{% trans "Name" %}</dt>
<dd>{{ firewall_group.name|default:_("-") }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ firewall_group.description|default:_("-") }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ firewall_group.id }} </dd>
<dt>{% trans "Project ID" %}</dt>
<dd>{{ firewall_group.tenant_id }}</dd>
<dt>{% trans "Ingress Policy ID" %}</dt>
<dd>
{% if firewall_group.ingress_firewall_policy_id %}
{% url 'horizon:project:firewalls_v2:policydetails' firewall_group.ingress_firewall_policy_id as policy_url %}
<a href="{{ policy_url }}">{{firewall_group.ingress_policy.name|default:firewall_group.ingress_firewall_policy_id }}</a>
{% else %}
{% trans "-" %}
{% endif %}
</dd>
<dt>{% trans "Egress Policy ID" %}</dt>
<dd>
{% if firewall_group.egress_firewall_policy_id %}
{% url 'horizon:project:firewalls_v2:policydetails' firewall_group.egress_firewall_policy_id as policy_url %}
<a href="{{ policy_url }}">{{firewall_group.egress_policy.name|default:firewall_group.egress_firewall_policy_id }}</a>
{% else %}
{% trans "-" %}
{% endif %}
</dd>
<dt>{% trans "Status" %}</dt>
<dd>{{ firewall_group.status }}</dd>
<dt>{% trans "Admin State Up" %}</dt>
<dd>{{ firewall_group.admin_state_up}}</dd>
<dt>{% trans "Shared" %}</dt>
<dd>{{ firewall_group.shared|yesno|capfirst }}</dd>
</dl>
</div>

View File

@ -1,12 +0,0 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>{% blocktrans trimmed %}
Choose the rule you want to insert.
Specify either the rule you want to insert immediately before,
or the rule to insert immediately after.
If both are specified, the prior takes precedence.
{% endblocktrans %}</p>
{% endblock %}

View File

@ -1,37 +0,0 @@
{% load i18n sizeformat parse_date %}
<div class="detail">
<dl class="dl-horizontal">
<dt>{% trans "Name" %}</dt>
<dd>{{ policy.name|default:_("-") }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ policy.description|default:_("-") }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ policy.id }}</dd>
<dt>{% trans "Project ID" %}</dt>
<dd>{{ policy.tenant_id }}</dd>
<dt>{% trans "Rules" %}</dt>
<dd>
{% if policy.rules %}
<ol>
{% for rule in policy.rules %}
{% url 'horizon:project:firewalls_v2:ruledetails' rule.id as rule_url %}
<li><a href="{{ rule_url }}">{{ rule.name|default:rule.id }}</a></li>
{% endfor %}
</ol>
{% else %}
{% trans "-" %}
{% endif %}
</dd>
<dt>{% trans "Shared" %}</dt>
<dd>{{ policy.shared|yesno|capfirst }}</dd>
<dt>{% trans "Audited" %}</dt>
<dd>{{ policy.audited|yesno|capfirst }}</dd>
</dl>
</div>

View File

@ -1,7 +0,0 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>{% trans "Choose the rule you want to remove." %}</p>
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>{% trans "You may remove ports from firewall group here." %}</p>
{% endblock %}

View File

@ -1,44 +0,0 @@
{% load i18n sizeformat parse_date %}
<div class="detail">
<dl class="dl-horizontal">
<dt>{% trans "Name" %}</dt>
<dd>{{ rule.name|default:_("-") }}</dd>
<dt>{% trans "Description" %}</dt>
<dd>{{ rule.description|default:_("-") }}</dd>
<dt>{% trans "ID" %}</dt>
<dd>{{ rule.id }}</dd>
<dt>{% trans "Project ID" %}</dt>
<dd>{{ rule.tenant_id }}</dd>
<dt>{% trans "Action" %}</dt>
<dd>{{ rule.action|upper }}</dd>
<dt>{% trans "IP Version" %}</dt>
<dd>{{ rule.ip_version }}</dd>
<dt>{% trans "Protocol" %}</dt>
<dd>{{ rule.protocol|default:_("ANY")|upper }}</dd>
<dt>{% trans "Source IP Address" %}</dt>
<dd>{{ rule.source_ip_address|default:_("ANY") }}</dd>
<dt>{% trans "Source Port" %}</dt>
<dd>{{ rule.source_port|default:_("ANY") }}</dd>
<dt>{% trans "Destination IP Address" %}</dt>
<dd>{{ rule.destination_ip_address|default:_("ANY") }}</dd>
<dt>{% trans "Destination Port"%}</dt>
<dd>{{ rule.destination_port|default:_("ANY") }}</dd>
<dt>{% trans "Shared" %}</dt>
<dd>{{ rule.shared|yesno|capfirst }}</dd>
<dt>{% trans "Enabled" %}</dt>
<dd>{{ rule.enabled|yesno|capfirst }}</dd>
</dl>
</div>

View File

@ -1,3 +0,0 @@
{% load i18n %}
<p>{% blocktrans %}Choose port(s) from Available Ports. {% endblocktrans %}</p>

View File

@ -1,35 +0,0 @@
{% load i18n %}
<noscript><h3>{{ step }}</h3></noscript>
<div id="portListSortContainer" class="sort-container">
<div class="col-sm-6">
<h4 id="selected_port_label">{% trans "Selected Ports" %}</h4>
<ul id="selected_port" class="portlist box-list"></ul>
<h4>{% trans "Available Ports" %}</h4>
<ul id="available_port" class="portlist box-list"></ul>
</div>
<div class="col-sm-6">
{% include "project/firewalls_v2/_update_port_help.html" %}
</div>
</div>
<div id="portListIdContainer">
<div class="actions">
<div id="portListId">
{% include "horizon/common/_form_fields.html" %}
</div>
</div>
<div class="help_text">
{{ step.get_help_text }}
</div>
</div>
<script>
if (typeof $ !== 'undefined') {
horizon.firewalls_v2.workflow_init($(".workflow"));
} else {
addHorizonLoadEvent(function() {
horizon.firewalls_v2.workflow_init($(".workflow"));
});
}
</script>

View File

@ -1,6 +0,0 @@
{% load i18n horizon %}
<p>{% blocktrans trimmed %}
Choose rule(s) from Available Rules to Selected Rule by push button or
drag and drop, you may change their order by drag and drop as well.
{% endblocktrans %}</p>

View File

@ -1,35 +0,0 @@
{% load i18n %}
<noscript><h3>{{ step }}</h3></noscript>
<div id="ruleListSortContainer" class="sort-container">
<div class="col-sm-6">
<h4 id="selected_rule_label">{% trans "Selected Rules" %}</h4>
<ul id="selected_rule" class="rulelist box-list"></ul>
<h4>{% trans "Available Rules" %}</h4>
<ul id="available_rule" class="rulelist box-list"></ul>
</div>
<div class="col-sm-6">
{% include "project/firewalls_v2/_update_rule_help.html" %}
</div>
</div>
<div id="ruleListIdContainer">
<div class="actions">
<div id="ruleListId">
{% include "horizon/common/_form_fields.html" %}
</div>
</div>
<div class="help_text">
{{ step.get_help_text }}
</div>
</div>
<script>
if (typeof $ !== 'undefined') {
horizon.firewalls_v2.workflow_init($(".workflow"));
} else {
addHorizonLoadEvent(function() {
horizon.firewalls_v2.workflow_init($(".workflow"));
});
}
</script>

View File

@ -1,7 +0,0 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>{% trans "You may update firewall group details here." %}</p>
{% endblock %}

View File

@ -1,10 +0,0 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>{% blocktrans trimmed %}
You may update policy details here.
Use 'Insert Rule' or 'Remove Rule' links instead to insert or remove a rule.
{% endblocktrans %}</p>
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends "horizon/common/_modal_form.html" %}
{% load i18n %}
{% block modal-body-right %}
<h3>{% trans "Description:" %}</h3>
<p>{% trans "You may update rule details here." %}</p>
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Add New Firewall Group" %}{% endblock %}
{% block main %}
{% include 'horizon/common/_workflow.html' %}
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Add New Policy" %}{% endblock %}
{% block main %}
{% include 'horizon/common/_workflow.html' %}
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Add Port to Firewall Group" %}{% endblock %}
{% block main %}
{% include 'project/firewalls_v2/_addport.html' %}
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Add New Rule" %}{% endblock %}
{% block main %}
{% include 'horizon/common/_workflow.html' %}
{% endblock %}

View File

@ -1,11 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Firewall Groups" %}{% endblock %}
{% block main %}
<div class="row">
<div class="col-sm-12">
{{ tab_group.render }}
</div>
</div>
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Insert Rule to Policy" %}{% endblock %}
{% block main %}
{% include 'project/firewalls_v2/_insert_rule_to_policy.html' %}
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Remove Rule from Policy" %}{% endblock %}
{% block main %}
{% include 'project/firewalls_v2/_remove_rule_from_policy.html' %}
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Remove Port from Firewall Group" %}{% endblock %}
{% block main %}
{% include 'project/firewalls_v2/_removeport.html' %}
{% endblock %}

View File

@ -1,94 +0,0 @@
{% load horizon %}
{% minifyspace %}
<div class="themable-select dropdown {% if not stand_alone %} form-control{% endif %}"
xmlns="http://www.w3.org/1999/html">
<button type="button" class="btn btn-default dropdown-toggle"
data-toggle="dropdown"
{% if value %} title="{{ value }}" {% endif %}
aria-expanded="false"
{% if options|length < 1 %}
disabled="true"
{% endif %}
>
<span class="dropdown-title">
{% if options|length < 1 %}
{{ empty_text }}
{% elif initial_value %}
{{ initial_value.1 }}
{% endif %}
</span>
<span class="fa fa-caret-down"></span>
</button>
<ul class="dropdown-menu container-fluid dropdown-table">
<li class="row dropdown-thead">
<div class="col-xs-12">
<div class="row dropdown-tr ">
{% if alternate_xs %}
<div class="visible-xs-block col-xs-12 dropdown-th">{{ summarized_headers }}</div>
{% for column in columns %}
<div class="hidden-xs col-sm-{{ column_size }} dropdown-th">{{ column }}</div>
{% endfor %}
{% else %}
{% for column in columns %}
<div class="col-xs-{{ column_size }} dropdown-th">{{ column }}</div>
{% endfor %}
{% endif %}
</div>
</div>
</li>
{% for option in options %}
<li data-original-index="{{ forloop.counter0 }}"
class="row dropdown-tr"
data-toggle="tooltip"
data-placement="top"
>
<a data-select-value="{{ option.0 }}"
class="col-xs-12"
href="#"
>
<div class="row">
{% if alternate_xs %}
<div class="visible-xs-block col-xs-12 dropdown-td">
{{ option.1 }}
</div>
{% for column in option.2 %}
<div class="hidden-xs col-sm-{{ column_size }} dropdown-td">{{ column }}</div>
{% endfor %}
{% else %}
{% for column in option.2 %}
<div class="col-xs-{{ column_size }} dropdown-td">{{ column }}</div>
{% endfor %}
{% endif %}
</div>
</a>
</li>
{% endfor %}
</ul>
<select
{% if id %}
id="{{ id }}"{% endif %}
{% if name %}
name="{{ name }}"
{% endif %}
{% for k,v in select_attrs.items %}
{% if k != 'class' or 'switch' in v %}
{{ k|safe }}="{{ v }}"
{% endif %}
{% endfor %}
>
{% for option in options %}
<option value="{{ option.0 }}"
{% if option.0 == value %}
selected="selected"
{% endif %}
{% if option.3 %}
{{ option.3|safe }}
{% endif %}>
{{ option.1 }}
</option>
{% endfor %}
</select>
</div>
{% endminifyspace %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Edit Firewall Group" %}{% endblock %}
{% block main %}
{% include 'project/firewalls_v2/_updatefirewall.html' %}
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Edit Policy" %}{% endblock %}
{% block main %}
{% include 'project/firewalls_v2/_updatepolicy.html' %}
{% endblock %}

View File

@ -1,7 +0,0 @@
{% extends 'base.html' %}
{% load i18n %}
{% block title %}{% trans "Edit Rule" %}{% endblock %}
{% block main %}
{% include 'project/firewalls_v2/_updaterule.html' %}
{% endblock %}

View File

@ -1,798 +0,0 @@
# Copyright 2017, Juniper Networks, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from unittest import mock
from django.urls import reverse
from openstack_dashboard.test import helpers
from neutron_fwaas_dashboard.api import fwaas_v2 as api_fwaas_v2
from neutron_fwaas_dashboard.test import helpers as test
class FirewallTests(test.TestCase):
INDEX_URL = reverse('horizon:project:firewalls_v2:index')
ADDRULE_PATH = 'horizon:project:firewalls_v2:addrule'
ADDPOLICY_PATH = 'horizon:project:firewalls_v2:addpolicy'
ADDFIREWALLGROUP_PATH = 'horizon:project:firewalls_v2:addfirewallgroup'
RULE_DETAIL_PATH = 'horizon:project:firewalls_v2:ruledetails'
POLICY_DETAIL_PATH = 'horizon:project:firewalls_v2:policydetails'
FIREWALLGROUP_DETAIL_PATH = \
'horizon:project:firewalls_v2:firewallgroupdetails'
UPDATERULE_PATH = 'horizon:project:firewalls_v2:updaterule'
UPDATEPOLICY_PATH = 'horizon:project:firewalls_v2:updatepolicy'
UPDATEFIREWALLGROUP_PATH = 'horizon:project:firewalls_v2:updatefirewall'
INSERTRULE_PATH = 'horizon:project:firewalls_v2:insertrule'
REMOVERULE_PATH = 'horizon:project:firewalls_v2:removerule'
ADDPORT_PATH = 'horizon:project:firewalls_v2:addport'
REMOVEPORT_PATH = 'horizon:project:firewalls_v2:removeport'
def setup_mocks(self):
firewallgroups = self.firewall_groups_v2.list()
self.mock_firewall_group_list_for_tenant.return_value = firewallgroups
policies = self.fw_policies_v2.list()
self.mock_policy_list_for_tenant.return_value = policies
self.mock_rule_list_for_tenant.return_value = self.fw_rules_v2.list()
def check_mocks(self):
tenant_id = self.tenant.id
self.mock_firewall_group_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
# TODO(amotoki): get_firewallgroupstable_data() also calls
# policy_list_for_tenant(). This needs to be clean up.
self.assert_mock_multiple_calls_with_same_arguments(
self.mock_policy_list_for_tenant, 2,
mock.call(helpers.IsHttpRequest(), tenant_id))
self.mock_rule_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
def setup_mocks_with_exception(self):
self.mock_rule_list_for_tenant.side_effect = self.exceptions.neutron
self.mock_policy_list_for_tenant.side_effect = self.exceptions.neutron
self.mock_firewall_group_list_for_tenant.side_effect = \
self.exceptions.neutron
def check_mocks_with_exception(self):
tenant_id = self.tenant.id
self.mock_rule_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
self.mock_policy_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
self.mock_firewall_group_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_list_for_tenant',
'policy_list_for_tenant',
'rule_list_for_tenant',)})
def test_index_firewallgroups(self):
self.setup_mocks()
tenant_id = self.tenant.id
res = self.client.get(self.INDEX_URL, tenant_id=tenant_id)
self.assertTemplateUsed(res, 'project/firewalls_v2/details_tabs.html')
self.assertTemplateUsed(res, 'horizon/common/_detail_table.html')
self.assertEqual(len(res.context['table'].data),
len(self.firewall_groups_v2.list()))
self.check_mocks()
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_list_for_tenant',
'policy_list_for_tenant',
'rule_list_for_tenant',)})
def test_index_policies(self):
self.setup_mocks()
tenant_id = self.tenant.id
res = self.client.get(self.INDEX_URL + '?tab=fwtabs__policies',
tenant_id=tenant_id)
self.assertTemplateUsed(res, 'project/firewalls_v2/details_tabs.html')
self.assertTemplateUsed(res, 'horizon/common/_detail_table.html')
self.assertEqual(len(res.context['policiestable_table'].data),
len(self.fw_policies_v2.list()))
self.check_mocks()
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_list_for_tenant',
'policy_list_for_tenant',
'rule_list_for_tenant',)})
def test_index_rules(self):
self.setup_mocks()
tenant_id = self.tenant.id
res = self.client.get(self.INDEX_URL + '?tab=fwtabs__rules',
tenant_id=tenant_id)
self.assertTemplateUsed(res, 'project/firewalls_v2/details_tabs.html')
self.assertTemplateUsed(res, 'horizon/common/_detail_table.html')
self.assertEqual(len(res.context['rulestable_table'].data),
len(self.fw_rules_v2.list()))
self.check_mocks()
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_list_for_tenant',
'policy_list_for_tenant',
'rule_list_for_tenant')})
def test_index_exception_firewallgroups(self):
self.setup_mocks_with_exception()
tenant_id = self.tenant.id
res = self.client.get(self.INDEX_URL, tenant_id=tenant_id)
self.assertTemplateUsed(res, 'project/firewalls_v2/details_tabs.html')
self.assertTemplateUsed(res, 'horizon/common/_detail_table.html')
self.assertEqual(len(res.context['table'].data), 0)
self.check_mocks_with_exception()
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_list_for_tenant',
'policy_list_for_tenant',
'rule_list_for_tenant')})
def test_index_exception_policies(self):
self.setup_mocks_with_exception()
tenant_id = self.tenant.id
res = self.client.get(self.INDEX_URL + '?tab=fwtabs__policies',
tenant_id=tenant_id)
self.assertTemplateUsed(res, 'project/firewalls_v2/details_tabs.html')
self.assertTemplateUsed(res,
'horizon/common/_detail_table.html')
self.assertEqual(len(res.context['policiestable_table'].data), 0)
self.check_mocks_with_exception()
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_list_for_tenant',
'policy_list_for_tenant',
'rule_list_for_tenant')})
def test_index_exception_rules(self):
self.setup_mocks_with_exception()
tenant_id = self.tenant.id
res = self.client.get(self.INDEX_URL + '?tab=fwtabs__rules',
tenant_id=tenant_id)
self.assertTemplateUsed(res, 'project/firewalls_v2/details_tabs.html')
self.assertTemplateUsed(res, 'horizon/common/_detail_table.html')
self.assertEqual(len(res.context['rulestable_table'].data), 0)
self.check_mocks_with_exception()
@helpers.create_mocks({api_fwaas_v2: ('rule_create',), })
def test_add_rule_post(self):
rule1 = self.fw_rules_v2.first()
form_data = {'name': rule1.name,
'description': rule1.description,
'protocol': rule1.protocol,
'action': rule1.action,
'source_ip_address': rule1.source_ip_address,
'source_port': rule1.source_port,
'destination_ip_address': rule1.destination_ip_address,
'destination_port': rule1.destination_port,
'shared': rule1.shared,
'enabled': rule1.enabled,
'ip_version': rule1.ip_version
}
self.mock_rule_create.return_value = rule1
res = self.client.post(reverse(self.ADDRULE_PATH), form_data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_rule_create.assert_called_once_with(
helpers.IsHttpRequest(), **form_data)
@helpers.create_mocks({api_fwaas_v2: ('rule_create',), })
def test_add_rule_post_src_None(self):
rule1 = self.fw_rules_v2.first()
form_data = {'name': rule1.name,
'description': rule1.description,
'protocol': rule1.protocol,
'action': rule1.action,
'source_ip_address': '',
'destination_ip_address': rule1.destination_ip_address,
'source_port': '',
'destination_port': rule1.destination_port,
'shared': rule1.shared,
'enabled': rule1.enabled,
'ip_version': rule1.ip_version
}
self.mock_rule_create.return_value = rule1
res = self.client.post(reverse(self.ADDRULE_PATH), form_data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
data = form_data.copy()
data['source_ip_address'] = None
data['source_port'] = None
self.mock_rule_create.assert_called_once_with(
helpers.IsHttpRequest(), **data)
@helpers.create_mocks({api_fwaas_v2: ('rule_create',), })
def test_add_rule_post_dest_None(self):
rule1 = self.fw_rules_v2.first()
form_data = {'name': rule1.name,
'description': rule1.description,
'protocol': rule1.protocol,
'action': rule1.action,
'source_ip_address': rule1.source_ip_address,
'destination_ip_address': '',
'source_port': rule1.source_port,
'destination_port': '',
'shared': rule1.shared,
'enabled': rule1.enabled,
'ip_version': rule1.ip_version
}
self.mock_rule_create.return_value = rule1
res = self.client.post(reverse(self.ADDRULE_PATH), form_data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
data = form_data.copy()
data['destination_ip_address'] = None
data['destination_port'] = None
self.mock_rule_create.assert_called_once_with(
helpers.IsHttpRequest(), **data)
def test_add_rule_post_with_error(self):
rule1 = self.fw_rules_v2.first()
form_data = {'name': rule1.name,
'description': rule1.description,
'protocol': 'abc',
'action': 'pass',
'source_ip_address': rule1.source_ip_address,
'source_port': rule1.source_port,
'destination_ip_address': rule1.destination_ip_address,
'destination_port': rule1.destination_port,
'shared': rule1.shared,
'enabled': rule1.enabled,
'ip_version': 6
}
res = self.client.post(reverse(self.ADDRULE_PATH), form_data)
self.assertFormErrors(res, 3)
@helpers.create_mocks({api_fwaas_v2: ('policy_create',
'rule_list_for_tenant'), })
def test_add_policy_post(self):
policy = self.fw_policies_v2.first()
rules = self.fw_rules_v2.list()
tenant_id = self.tenant.id
form_data = {'name': policy.name,
'description': policy.description,
'firewall_rules': policy.firewall_rules,
'shared': policy.shared,
'audited': policy.audited
}
post_data = {'name': policy.name,
'description': policy.description,
'rule': policy.firewall_rules,
'shared': policy.shared,
'audited': policy.audited
}
# NOTE: SelectRulesAction.populate_rule_choices() lists rule not
# associated with any policy. We need to ensure that rules specified
# in policy.firewall_rules in post_data (above) are not associated
# with any policy. Test data in neutron_data is data in a stable state,
# so we need to modify here.
for rule in rules:
if rule.id in policy.firewall_rules:
rule.firewall_policy_id = rule.policy = None
self.mock_rule_list_for_tenant.return_value = rules
self.mock_policy_create.return_value = policy
res = self.client.post(reverse(self.ADDPOLICY_PATH), post_data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_rule_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
self.mock_policy_create.assert_called_once_with(
helpers.IsHttpRequest(), **form_data)
@helpers.create_mocks({api_fwaas_v2: ('rule_list_for_tenant',)})
def test_add_policy_post_with_error(self):
policy = self.fw_policies_v2.first()
rules = self.fw_rules_v2.list()
tenant_id = self.tenant.id
form_data = {'description': policy.description,
'firewall_rules': '',
'shared': policy.shared,
'audited': policy.audited
}
self.mock_rule_list_for_tenant.return_value = rules
res = self.client.post(reverse(self.ADDPOLICY_PATH), form_data)
self.assertFormErrors(res, 1)
self.mock_rule_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_create',
'policy_list_for_tenant',
'fwg_port_list_for_tenant',)})
def test_add_firewall_group_post(self):
fwg = self.firewall_groups_v2.first()
policies = self.fw_policies_v2.list()
tenant_id = self.tenant.id
form_data = {
'name': fwg.name,
'description': fwg.description,
'ingress_firewall_policy_id': fwg.ingress_firewall_policy_id,
'egress_firewall_policy_id': fwg.egress_firewall_policy_id,
'admin_state_up': fwg.admin_state_up,
'shared': False,
'port': [],
}
self.mock_policy_list_for_tenant.return_value = policies
self.mock_fwg_port_list_for_tenant.return_value = []
self.mock_firewall_group_create.return_value = fwg
res = self.client.post(reverse(self.ADDFIREWALLGROUP_PATH), form_data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_policy_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
self.mock_fwg_port_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
data = form_data.copy()
data['ports'] = data.pop('port')
self.mock_firewall_group_create.assert_called_once_with(
helpers.IsHttpRequest(), **data)
# TODO(SarathMekala) : Fix this test.
# @helpers.create_mocks({api_fwaas_v2: ('firewall_group_create',
# 'policy_list_for_tenant',
# 'fwg_port_list_for_tenant',)})
# def test_add_firewall_post_with_error(self):
# firewall_groups = self.firewall_groups_v2.first()
# policies = self.fw_policies_v2.list()
# tenant_id = self.tenant.id
# form_data = {'name': firewall_groups.name,
# 'description': firewall_groups.description,
# 'admin_state_up': False
# }
# self.mock_policy_list_for_tenant(
# helpers.IsHttpRequest(), tenant_id).AndReturn(policies)
#
# self.mox.ReplayAll()
# res = self.client.post(reverse(self.ADDFIREWALLGROUP_PATH), form_data)
#
# self.assertFormErrors(res, 1)
@helpers.create_mocks({api_fwaas_v2: ('rule_get',)})
def test_update_rule_get(self):
rule = self.fw_rules_v2.first()
self.mock_rule_get.return_value = rule
res = self.client.get(reverse(self.UPDATERULE_PATH, args=(rule.id,)))
self.assertTemplateUsed(res, 'project/firewalls_v2/updaterule.html')
self.mock_rule_get.assert_called_once_with(helpers.IsHttpRequest(),
rule.id)
@helpers.create_mocks({api_fwaas_v2: ('rule_get', 'rule_update')})
def test_update_rule_post(self):
rule = self.fw_rules_v2.first()
self.mock_rule_get.return_value = rule
self.mock_rule_update.return_value = rule
data = {
'name': 'new name',
'description': 'new desc',
'protocol': 'icmp',
'action': 'allow',
'shared': False,
'enabled': True,
'ip_version': rule.ip_version,
'source_ip_address': rule.source_ip_address,
'destination_ip_address': None,
'source_port': None,
'destination_port': rule.destination_port,
}
expected_put_data = {
'name': 'new name',
'description': 'new desc',
'protocol': 'icmp',
'action': 'allow',
'shared': False,
'destination_ip_address': None,
'source_port': None,
}
form_data = data.copy()
form_data['destination_ip_address'] = ''
form_data['source_port'] = ''
res = self.client.post(
reverse(self.UPDATERULE_PATH, args=(rule.id,)), form_data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_rule_get.assert_called_once_with(helpers.IsHttpRequest(),
rule.id)
self.mock_rule_update.assert_called_once_with(
helpers.IsHttpRequest(), rule.id, **expected_put_data)
@helpers.create_mocks({api_fwaas_v2: ('rule_get', 'rule_update')})
def test_update_protocol_any_rule_post(self):
# protocol any means protocol == None in neutron context.
rule = self.fw_rules_v2.get(protocol=None)
self.mock_rule_get.return_value = rule
self.mock_rule_update.return_value = rule
data = {
'name': 'new name',
'description': 'new desc',
'protocol': 'icmp',
'action': 'allow',
'shared': False,
'enabled': True,
'ip_version': rule.ip_version,
'source_ip_address': rule.source_ip_address,
'destination_ip_address': None,
'source_port': None,
'destination_port': rule.destination_port,
}
expected_put_data = {
'name': 'new name',
'description': 'new desc',
'protocol': 'icmp',
'action': 'allow',
'shared': False,
'destination_ip_address': None,
'source_port': None,
}
form_data = data.copy()
form_data['destination_ip_address'] = ''
form_data['source_port'] = ''
res = self.client.post(
reverse(self.UPDATERULE_PATH, args=(rule.id,)), form_data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_rule_get.assert_called_once_with(helpers.IsHttpRequest(),
rule.id)
self.mock_rule_update.assert_called_once_with(
helpers.IsHttpRequest(), rule.id, **expected_put_data)
@helpers.create_mocks({api_fwaas_v2: ('rule_get', 'rule_update')})
def test_update_rule_protocol_to_ANY_post(self):
rule = self.fw_rules_v2.first()
self.mock_rule_get.return_value = rule
self.mock_rule_update.return_value = rule
form_data = {
'name': 'new name',
'description': 'new desc',
'protocol': 'any',
'action': 'allow',
'shared': False,
'enabled': True,
'ip_version': rule.ip_version,
'source_ip_address': rule.source_ip_address,
'destination_ip_address': '',
'source_port': '',
'destination_port': rule.destination_port,
}
expected_put_data = {
'name': 'new name',
'description': 'new desc',
'protocol': None,
'action': 'allow',
'shared': False,
'destination_ip_address': None,
'source_port': None,
}
res = self.client.post(
reverse(self.UPDATERULE_PATH, args=(rule.id,)), form_data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_rule_get.assert_called_once_with(helpers.IsHttpRequest(),
rule.id)
self.mock_rule_update.assert_called_once_with(
helpers.IsHttpRequest(), rule.id, **expected_put_data)
@helpers.create_mocks({api_fwaas_v2: ('policy_get',)})
def test_update_policy_get(self):
policy = self.fw_policies_v2.first()
self.mock_policy_get.return_value = policy
res = self.client.get(
reverse(self.UPDATEPOLICY_PATH, args=(policy.id,)))
self.assertTemplateUsed(res, 'project/firewalls_v2/updatepolicy.html')
self.mock_policy_get.assert_called_once_with(helpers.IsHttpRequest(),
policy.id)
@helpers.create_mocks({api_fwaas_v2: ('policy_get', 'policy_update')})
def test_update_policy_post(self):
policy = self.fw_policies_v2.first()
self.mock_policy_get.return_value = policy
self.mock_policy_update.return_value = policy
data = {
'name': 'new name',
'description': 'new desc',
'shared': True,
'audited': False
}
expected_put_data = {
'name': 'new name',
'description': 'new desc',
'audited': False,
}
res = self.client.post(
reverse(self.UPDATEPOLICY_PATH, args=(policy.id,)), data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_policy_get.assert_called_once_with(helpers.IsHttpRequest(),
policy.id)
self.mock_policy_update.assert_called_once_with(
helpers.IsHttpRequest(), policy.id, **expected_put_data)
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_get',
'policy_list_for_tenant')})
def test_update_firewall_group_get(self):
firewall_group = self.firewall_groups_v2.first()
policies = self.fw_policies_v2.list()
tenant_id = self.tenant.id
self.mock_policy_list_for_tenant.return_value = policies
self.mock_firewall_group_get.return_value = firewall_group
res = self.client.get(
reverse(self.UPDATEFIREWALLGROUP_PATH, args=(firewall_group.id,)))
self.assertTemplateUsed(res,
'project/firewalls_v2/updatefirewall.html')
self.mock_policy_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
self.mock_firewall_group_get.assert_called_once_with(
helpers.IsHttpRequest(), firewall_group.id)
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_get',
'policy_list_for_tenant',
'firewall_group_update')})
def test_update_firewall_post(self):
fwg = self.firewall_groups_v2.first()
tenant_id = self.tenant.id
policies = self.fw_policies_v2.list()
data = {
'name': 'new name',
'description': 'new desc',
'ingress_firewall_policy_id': fwg.ingress_firewall_policy_id,
'egress_firewall_policy_id': '',
'admin_state_up': False,
'shared': False,
}
expected_put_data = {
'name': 'new name',
'description': 'new desc',
'egress_firewall_policy_id': None,
'admin_state_up': False,
}
self.mock_firewall_group_get.return_value = fwg
self.mock_policy_list_for_tenant.return_value = policies
self.mock_firewall_group_update.return_value = fwg
res = self.client.post(
reverse(
self.UPDATEFIREWALLGROUP_PATH,
args=(
fwg.id,
)),
data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_firewall_group_get.assert_called_once_with(
helpers.IsHttpRequest(), fwg.id)
self.mock_policy_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
self.mock_firewall_group_update.assert_called_once_with(
helpers.IsHttpRequest(), fwg.id, **expected_put_data)
@helpers.create_mocks({api_fwaas_v2: ('policy_get', 'policy_insert_rule',
'rule_list_for_tenant', 'rule_get')})
def test_policy_insert_rule(self):
policy = self.fw_policies_v2.first()
tenant_id = self.tenant.id
rules = self.fw_rules_v2.list()
new_rule_id = rules[2].id
data = {'firewall_rule_id': new_rule_id,
'insert_before': rules[1].id,
'insert_after': rules[0].id}
self.mock_policy_get.return_value = policy
policy.firewall_rules = [rules[0].id,
new_rule_id,
rules[1].id]
self.mock_rule_list_for_tenant.return_value = rules
self.mock_rule_get.return_value = rules[2]
self.mock_policy_insert_rule.return_value = policy
res = self.client.post(
reverse(self.INSERTRULE_PATH, args=(policy.id,)), data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_policy_get.assert_called_once_with(helpers.IsHttpRequest(),
policy.id)
self.mock_rule_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
self.mock_rule_get.assert_called_once_with(
helpers.IsHttpRequest(), new_rule_id)
self.mock_policy_insert_rule.assert_called_once_with(
helpers.IsHttpRequest(), policy.id, **data)
@helpers.create_mocks({api_fwaas_v2: ('policy_get', 'policy_remove_rule',
'rule_list_for_tenant', 'rule_get')})
def test_policy_remove_rule(self):
policy = self.fw_policies_v2.first()
tenant_id = self.tenant.id
rules = self.fw_rules_v2.list()
remove_rule_id = policy.firewall_rules[0]
left_rule_id = policy.firewall_rules[1]
data = {'firewall_rule_id': remove_rule_id}
after_remove_policy_dict = {'id': 'abcdef-c3eb-4fee-9763-12de3338041e',
'tenant_id': '1',
'name': 'policy1',
'description': 'policy description',
'firewall_rules': [left_rule_id],
'audited': True,
'shared': True}
after_remove_policy = api_fwaas_v2.Policy(after_remove_policy_dict)
self.mock_policy_get.return_value = policy
self.mock_rule_list_for_tenant.return_value = rules
self.mock_rule_get.return_value = rules[0]
self.mock_policy_remove_rule.return_value = after_remove_policy
res = self.client.post(
reverse(self.REMOVERULE_PATH, args=(policy.id,)), data)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, str(self.INDEX_URL))
self.mock_policy_get.assert_called_once_with(helpers.IsHttpRequest(),
policy.id)
self.mock_rule_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), tenant_id)
self.mock_rule_get.assert_called_once_with(
helpers.IsHttpRequest(), remove_rule_id)
self.mock_policy_remove_rule.assert_called_once_with(
helpers.IsHttpRequest(), policy.id, **data)
@helpers.create_mocks({api_fwaas_v2: ('rule_list_for_tenant',
'rule_delete')})
def test_delete_rule(self):
rule = self.fw_rules_v2.list()[2]
self.mock_rule_list_for_tenant.return_value = self.fw_rules_v2.list()
self.mock_rule_delete.return_value = None
form_data = {"action": "rulestable__deleterule__%s" % rule.id}
res = self.client.post(self.INDEX_URL, form_data)
self.assertNoFormErrors(res)
self.mock_rule_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), self.tenant.id)
self.mock_rule_delete.assert_called_once_with(
helpers.IsHttpRequest(), rule.id)
@helpers.create_mocks({api_fwaas_v2: ('policy_list_for_tenant',
'policy_delete')})
def test_delete_policy(self):
policy = self.fw_policies_v2.first()
self.mock_policy_list_for_tenant.return_value = \
self.fw_policies_v2.list()
self.mock_policy_delete.return_value = None
form_data = {"action": "policiestable__deletepolicy__%s" % policy.id}
res = self.client.post(self.INDEX_URL, form_data)
self.assertNoFormErrors(res)
self.mock_policy_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), self.tenant.id)
self.mock_policy_delete.assert_called_once_with(
helpers.IsHttpRequest(), policy.id)
@helpers.create_mocks({api_fwaas_v2: ('firewall_group_list_for_tenant',
'policy_list_for_tenant',
'firewall_group_delete',)})
def test_delete_firewall_group(self):
fwl = self.firewall_groups_v2.first()
self.mock_firewall_group_list_for_tenant.return_value = [fwl]
self.mock_policy_list_for_tenant.return_value = \
self.fw_policies_v2.list()
self.mock_firewall_group_delete.return_value = None
form_data = {
"action": "FirewallGroupsTable__deletefirewallgroup__%s" %
fwl.id}
res = self.client.post(self.INDEX_URL, form_data)
self.assertNoFormErrors(res)
self.mock_firewall_group_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), self.tenant.id)
self.mock_policy_list_for_tenant.assert_called_once_with(
helpers.IsHttpRequest(), self.tenant.id)
self.mock_firewall_group_delete.assert_called_once_with(
helpers.IsHttpRequest(), fwl.id)

View File

@ -1,53 +0,0 @@
# Copyright 2017, Juniper Networks, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.conf.urls import url
from neutron_fwaas_dashboard.dashboards.project.firewalls_v2 import views
# TODO(Sarath Mekala) : Fix 'firewall' --> 'firewallgroup' in URLs as
# well as in other places.
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^\?tab=fwtabs__firewalls$',
views.IndexView.as_view(), name='firewalls'),
url(r'^\?tab=fwtabs__rules$', views.IndexView.as_view(), name='rules'),
url(r'^\?tab=fwtabs__policies$',
views.IndexView.as_view(), name='policies'),
url(r'^addrule$', views.AddRuleView.as_view(), name='addrule'),
url(r'^addpolicy$', views.AddPolicyView.as_view(), name='addpolicy'),
url(r'^addfirewallgroup$',
views.AddFirewallGroupView.as_view(),
name='addfirewallgroup'),
url(r'^insertrule/(?P<policy_id>[^/]+)/$',
views.InsertRuleToPolicyView.as_view(), name='insertrule'),
url(r'^removerule/(?P<policy_id>[^/]+)/$',
views.RemoveRuleFromPolicyView.as_view(), name='removerule'),
url(r'^updaterule/(?P<rule_id>[^/]+)/$',
views.UpdateRuleView.as_view(), name='updaterule'),
url(r'^updatepolicy/(?P<policy_id>[^/]+)/$',
views.UpdatePolicyView.as_view(), name='updatepolicy'),
url(r'^updatefirewall/(?P<firewall_id>[^/]+)/$',
views.UpdateFirewallView.as_view(), name='updatefirewall'),
url(r'^addport/(?P<firewallgroup_id>[^/]+)/$',
views.AddPortView.as_view(), name='addport'),
url(r'^removeport/(?P<firewallgroup_id>[^/]+)/$',
views.RemovePortView.as_view(), name='removeport'),
url(r'^rule/(?P<rule_id>[^/]+)/$',
views.RuleDetailsView.as_view(), name='ruledetails'),
url(r'^policy/(?P<policy_id>[^/]+)/$',
views.PolicyDetailsView.as_view(), name='policydetails'),
url(r'^firewallgroup/(?P<firewallgroup_id>[^/]+)/$',
views.FirewallGroupDetailsView.as_view(), name='firewallgroupdetails'),
]

View File

@ -1,444 +0,0 @@
# Copyright 2017, Juniper Networks, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tabs
from horizon.utils import memoized
from horizon import workflows
from neutron_fwaas_dashboard.api import fwaas_v2 as api_fwaas_v2
from neutron_fwaas_dashboard.dashboards.project.firewalls_v2 \
import forms as fw_forms
from neutron_fwaas_dashboard.dashboards.project.firewalls_v2 \
import tabs as fw_tabs
from neutron_fwaas_dashboard.dashboards.project.firewalls_v2 \
import workflows as fw_workflows
InsertRuleToPolicy = fw_forms.InsertRuleToPolicy
RemoveRuleFromPolicy = fw_forms.RemoveRuleFromPolicy
UpdateFirewall = fw_forms.UpdateFirewall
UpdatePolicy = fw_forms.UpdatePolicy
UpdateRule = fw_forms.UpdateRule
AddPort = fw_forms.AddPort
RemovePort = fw_forms.RemovePort
FirewallGroupDetailsTabs = fw_tabs.FirewallGroupDetailsTabs
FirewallGroupTabs = fw_tabs.FirewallGroupTabs
PolicyDetailsTabs = fw_tabs.PolicyDetailsTabs
RuleDetailsTabs = fw_tabs.RuleDetailsTabs
AddFirewallGroup = fw_workflows.AddFirewallGroup
AddPolicy = fw_workflows.AddPolicy
AddRule = fw_workflows.AddRule
class IndexView(tabs.TabbedTableView):
tab_group_class = FirewallGroupTabs
template_name = 'project/firewalls_v2/details_tabs.html'
page_title = _("Firewall Groups")
class AddRuleView(workflows.WorkflowView):
workflow_class = AddRule
template_name = "project/firewalls_v2/addrule.html"
page_title = _("Add New Rule")
class AddPolicyView(workflows.WorkflowView):
workflow_class = AddPolicy
template_name = "project/firewalls_v2/addpolicy.html"
page_title = _("Add New Policy")
class AddFirewallGroupView(workflows.WorkflowView):
workflow_class = AddFirewallGroup
template_name = "project/firewalls_v2/addfirewallgroup.html"
page_title = _("Add New Firewall Group")
class RuleDetailsView(tabs.TabView):
tab_group_class = (RuleDetailsTabs)
template_name = 'horizon/common/_detail.html'
page_title = "{{ rule.name|default:rule.id }}"
failure_url = reverse_lazy('horizon:project:firewalls_v2:index')
def get_context_data(self, **kwargs):
context = super(RuleDetailsView, self).get_context_data(**kwargs)
rule = self.get_data()
table = fw_tabs.RulesTable(self.request)
breadcrumb = [
(_("Rules"), reverse_lazy('horizon:project:firewalls_v2:rules'))]
context["custom_breadcrumb"] = breadcrumb
context["rule"] = rule
context["url"] = self.failure_url
context["actions"] = table.render_row_actions(rule)
return context
@memoized.memoized_method
def get_data(self):
try:
rule_id = self.kwargs['rule_id']
rule = api_fwaas_v2.rule_get(self.request, rule_id)
except Exception:
exceptions.handle(self.request,
_('Unable to retrieve rule details.'),
redirect=self.failure_url)
return rule
def get_tabs(self, request, *args, **kwargs):
rule = self.get_data()
return self.tab_group_class(request, rule=rule, **kwargs)
class PolicyDetailsView(tabs.TabView):
tab_group_class = (PolicyDetailsTabs)
template_name = 'horizon/common/_detail.html'
page_title = "{{ policy.name|default:policy.id }}"
failure_url = reverse_lazy('horizon:project:firewalls_v2:index')
def get_context_data(self, **kwargs):
context = super(PolicyDetailsView, self).get_context_data(**kwargs)
policy = self.get_data()
table = fw_tabs.PoliciesTable(self.request)
breadcrumb = [
(_("Policies"),
reverse_lazy('horizon:project:firewalls_v2:policies'))]
context["custom_breadcrumb"] = breadcrumb
context["policy"] = policy
context["url"] = self.failure_url
context["actions"] = table.render_row_actions(policy)
return context
@memoized.memoized_method
def get_data(self):
try:
policy_id = self.kwargs['policy_id']
policy = api_fwaas_v2.policy_get(self.request, policy_id)
except Exception:
exceptions.handle(self.request,
_('Unable to retrieve policy details.'),
redirect=self.failure_url)
return policy
def get_tabs(self, request, *args, **kwargs):
policy = self.get_data()
return self.tab_group_class(request, policy=policy, **kwargs)
class FirewallGroupDetailsView(tabs.TabView):
tab_group_class = (FirewallGroupDetailsTabs)
template_name = 'horizon/common/_detail.html'
page_title = "{{ firewall_group.name|default:firewall_group.id }}"
failure_url = reverse_lazy('horizon:project:firewalls_v2:index')
def get_context_data(self, **kwargs):
context = super(FirewallGroupDetailsView, self) \
.get_context_data(**kwargs)
firewall_group = self.get_data()
table = fw_tabs.FirewallGroupsTable(self.request)
context["firewall_group"] = firewall_group
context["url"] = self.failure_url
context["actions"] = table.render_row_actions(firewall_group)
return context
@memoized.memoized_method
def get_data(self):
try:
firewallgroup_id = self.kwargs['firewallgroup_id']
firewall_group = api_fwaas_v2.firewall_group_get(self.request,
firewallgroup_id)
except Exception:
exceptions.handle(self.request,
_('Unable to retrieve firewall group details.'),
redirect=self.failure_url)
return firewall_group
def get_tabs(self, request, *args, **kwargs):
firewall_group = self.get_data()
return self.tab_group_class(request, firewallgroup=firewall_group,
**kwargs)
class UpdateRuleView(forms.ModalFormView):
form_class = UpdateRule
form_id = "update_rule_form"
template_name = "project/firewalls_v2/updaterule.html"
context_object_name = 'rule'
submit_label = _("Save Changes")
submit_url = "horizon:project:firewalls_v2:updaterule"
success_url = reverse_lazy("horizon:project:firewalls_v2:index")
page_title = _("Edit Rule {{ name }}")
def get_context_data(self, **kwargs):
context = super(UpdateRuleView, self).get_context_data(**kwargs)
context['rule_id'] = self.kwargs['rule_id']
args = (self.kwargs['rule_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
obj = self._get_object()
if obj:
context['name'] = obj.name_or_id
return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs):
rule_id = self.kwargs['rule_id']
try:
rule = api_fwaas_v2.rule_get(self.request, rule_id)
return rule
except Exception:
redirect = self.success_url
msg = _('Unable to retrieve rule details.')
exceptions.handle(self.request, msg, redirect=redirect)
def get_initial(self):
rule = self._get_object()
initial = rule.to_dict()
protocol = initial['protocol']
initial['protocol'] = protocol.upper() if protocol else 'ANY'
initial['action'] = initial['action'].upper()
return initial
class UpdatePolicyView(forms.ModalFormView):
form_class = UpdatePolicy
form_id = "update_policy_form"
template_name = "project/firewalls_v2/updatepolicy.html"
context_object_name = 'policy'
submit_label = _("Save Changes")
submit_url = "horizon:project:firewalls_v2:updatepolicy"
success_url = reverse_lazy("horizon:project:firewalls_v2:index")
page_title = _("Edit Policy {{ name }}")
def get_context_data(self, **kwargs):
context = super(UpdatePolicyView, self).get_context_data(**kwargs)
context["policy_id"] = self.kwargs['policy_id']
args = (self.kwargs['policy_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
obj = self._get_object()
if obj:
context['name'] = obj.name_or_id
return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs):
policy_id = self.kwargs['policy_id']
try:
policy = api_fwaas_v2.policy_get(self.request, policy_id)
return policy
except Exception:
redirect = self.success_url
msg = _('Unable to retrieve policy details.')
exceptions.handle(self.request, msg, redirect=redirect)
def get_initial(self):
policy = self._get_object()
initial = policy.to_dict()
return initial
class UpdateFirewallView(forms.ModalFormView):
form_class = UpdateFirewall
form_id = "update_firewall_form"
template_name = "project/firewalls_v2/updatefirewall.html"
context_object_name = 'firewall'
submit_label = _("Save Changes")
submit_url = "horizon:project:firewalls_v2:updatefirewall"
success_url = reverse_lazy("horizon:project:firewalls_v2:index")
page_title = _("Edit FirewallGroup {{ name }}")
def get_context_data(self, **kwargs):
context = super(UpdateFirewallView, self).get_context_data(**kwargs)
context["firewall_id"] = self.kwargs['firewall_id']
args = (self.kwargs['firewall_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
obj = self._get_object()
if obj:
context['name'] = obj.name
return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs):
fwg_id = self.kwargs['firewall_id']
try:
fwg = api_fwaas_v2.firewall_group_get(self.request, fwg_id)
return fwg
except Exception:
redirect = self.success_url
msg = _('Unable to retrieve firewall group details.')
exceptions.handle(self.request, msg, redirect=redirect)
def get_initial(self):
fwg = self._get_object()
initial = fwg.to_dict()
return initial
class AddPortView(forms.ModalFormView):
form_class = AddPort
form_id = "update_firewall_port_form"
template_name = "project/firewalls_v2/addport.html"
context_object_name = 'firewallgroup'
submit_label = _("Save Changes")
submit_url = "horizon:project:firewalls_v2:addport"
success_url = reverse_lazy("horizon:project:firewalls_v2:index")
page_title = _("Add port to Firewall Group {{ name }}")
def get_context_data(self, **kwargs):
context = super(AddPortView, self).get_context_data(**kwargs)
context["firewallgroup_id"] = self.kwargs['firewallgroup_id']
args = (self.kwargs['firewallgroup_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
obj = self._get_object()
if obj:
context['name'] = obj.name
return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs):
firewallgroup_id = self.kwargs['firewallgroup_id']
try:
firewallgroup = api_fwaas_v2.firewall_group_get(self.request,
firewallgroup_id)
return firewallgroup
except Exception:
redirect = self.success_url
msg = _('Unable to retrieve firewallgroup details.')
exceptions.handle(self.request, msg, redirect=redirect)
def get_initial(self):
firewallgroup = self._get_object()
initial = firewallgroup.to_dict()
return initial
class RemovePortView(forms.ModalFormView):
form_class = RemovePort
form_id = "update_firewall_port_form"
template_name = "project/firewalls_v2/removeport.html"
context_object_name = 'firewallgroup'
submit_label = _("Save Changes")
submit_url = "horizon:project:firewalls_v2:removeport"
success_url = reverse_lazy("horizon:project:firewalls_v2:index")
page_title = _("Remove port from FirewallGroup {{ name }}")
def get_context_data(self, **kwargs):
context = super(RemovePortView, self).get_context_data(**kwargs)
context["firewallgroup_id"] = self.kwargs['firewallgroup_id']
args = (self.kwargs['firewallgroup_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
obj = self._get_object()
if obj:
context['name'] = obj.name
return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs):
firewallgroup_id = self.kwargs['firewallgroup_id']
try:
firewallgroup = api_fwaas_v2.firewall_group_get(self.request,
firewallgroup_id)
return firewallgroup
except Exception:
redirect = self.success_url
msg = _('Unable to retrieve firewall group details.')
exceptions.handle(self.request, msg, redirect=redirect)
def get_initial(self):
firewallgroup = self._get_object()
initial = firewallgroup.to_dict()
return initial
class InsertRuleToPolicyView(forms.ModalFormView):
form_class = InsertRuleToPolicy
form_id = "update_policy_form"
template_name = "project/firewalls_v2/insert_rule_to_policy.html"
context_object_name = 'policy'
submit_url = "horizon:project:firewalls_v2:insertrule"
submit_label = _("Save Changes")
success_url = reverse_lazy("horizon:project:firewalls_v2:index")
page_title = _("Insert Rule to Policy")
def get_context_data(self, **kwargs):
context = super(InsertRuleToPolicyView,
self).get_context_data(**kwargs)
context["policy_id"] = self.kwargs['policy_id']
args = (self.kwargs['policy_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
obj = self._get_object()
if obj:
context['name'] = obj.name_or_id
return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs):
policy_id = self.kwargs['policy_id']
try:
policy = api_fwaas_v2.policy_get(self.request, policy_id)
return policy
except Exception:
redirect = self.success_url
msg = _('Unable to retrieve policy details.')
exceptions.handle(self.request, msg, redirect=redirect)
def get_initial(self):
policy = self._get_object()
initial = policy.to_dict()
initial['policy_id'] = initial['id']
return initial
class RemoveRuleFromPolicyView(forms.ModalFormView):
form_class = RemoveRuleFromPolicy
form_id = "update_policy_form"
template_name = "project/firewalls_v2/remove_rule_from_policy.html"
context_object_name = 'policy'
submit_label = _("Save Changes")
submit_url = "horizon:project:firewalls_v2:removerule"
success_url = reverse_lazy("horizon:project:firewalls_v2:index")
page_title = _("Remove Rule from Policy")
def get_context_data(self, **kwargs):
context = super(RemoveRuleFromPolicyView,
self).get_context_data(**kwargs)
context["policy_id"] = self.kwargs['policy_id']
args = (self.kwargs['policy_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
obj = self._get_object()
if obj:
context['name'] = obj.name_or_id
return context
@memoized.memoized_method
def _get_object(self, *args, **kwargs):
policy_id = self.kwargs['policy_id']
try:
policy = api_fwaas_v2.policy_get(self.request, policy_id)
return policy
except Exception:
redirect = self.success_url
msg = _('Unable to retrieve policy details.')
exceptions.handle(self.request, msg, redirect=redirect)
def get_initial(self):
policy = self._get_object()
initial = policy.to_dict()
initial['policy_id'] = initial['id']
return initial

View File

@ -1,260 +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 itertools
from django.template.loader import get_template
from django.utils.translation import ugettext_lazy as _
from horizon.forms import fields
"""A custom Horizon Forms Select widget that displays select choices as a table
The widgets is meant as an optional replacement for the existing Horizon
ThemableDynamicSelectWidget which it extends and is compatible with.
Columns
-------
Columns are defined by setting the widgets 'column' attribute, which is
expected to be an iterable of strings, each one corresponding to one column and
used for that columns heading.
Rows
----
Each row corresponds to one choice/select option with a defined value in
each column.
The values displayed in each column are derived using the 'build_columns'
attribute, which is expected to be a function that:
- takes a choice tuple of the form (value, label) as defined
for the Django SelectField instances as it's only parameter
- returns an iterable of Strings which are rendered as column
values for the given choice row in the same order as in the
iterable
The default implementation simply uses the provided value and label as separate
column values.
See the default implementation and example bellow for more details.
Condensed values
----------------
To maintain visual consistency, the currently selected value is displayed in
the 'standard' ThemableDynamicSelectWidget HTML setup. To accommodate this, a
condensed, single string value is created from the individual columns and
displayed in the select box.
This behavior can be modified by setting the 'condense' attribute. This is
expected to be a function that:
- Takes the column iterable returned by 'build_columns' function
- Returns a single string representation of the choice
By default, the condensed value is created by joining all of the provided
columns and joining them using commas as a delimiter.
See the default implementation and example bellow for more details.
Small screen reactivity
-----------------------
Support for small screens (< 768px) is turned on by setting the attribute
'alternate_xs' to True. When on, a condesned version of the popup table
us used for small screens, where a single column is used with the condensed
row values used instead of the full table rows.
The 'condense' function described above is used to construct this table.
Example
-------
port_id = forms.ThemableDynamicChoiceField(
label=_("Ports"),
widget=TableSelectWidget(
columns=[
'ID',
'Name'
],
build_columns=lambda choice: return (choice[1], choice[0]),
choices=[
('port 1', 'id1'),
('port 2', 'id2')
],
alternate_xs=True,
condense=lambda columns: return ",".join(columns)
)
)
Produces:
+------+--------+
| ID | Name |
+------+--------+
| id1 | port 1 |
| id2 | port 2 |
+------+--------+
on normal screens and
+-------------+
| ID, Name |
+-------------+
| id1, port 1 |
| id2, port 2 |
+-------------+
on xs screens.
"""
class TableSelectWidget(fields.ThemableDynamicSelectWidget):
def __init__(self,
attrs=None,
columns=None,
alternate_xs=False,
empty_text=_("No options available"),
other_html=None,
condense=None,
build_columns=None, *args, **kwargs
):
"""Initializer for TableSelectWidget
:param attrs: A { attribute: value } dictionary which is attached to
the hidden select element; see
ThemableDynamicSelectWidget for further information
:param columns: An iterable of column headers/names
:param alternate_xs: A truth-y value which enables/disables an
alternate rendering method for small screens
:param empty_text: The text to be displayed in case no options are
available
:param other_html: A method for adding custom HTML to the hidden option
HTML.
NOTE: This mimics the behavior of
ThemableDynamicSelectWidget and is retained to
maintain compatibility with any related, potential
functionality
:param condense: A function callback that produces a condensed label
for each option
:param build_columns: A function used to populate the individual
columns in the pop up table for each option
"""
super(TableSelectWidget, self).__init__(attrs, *args, **kwargs)
self.columns = columns or [_('Label'), _('Value'), 'Nothing']
self.alternate_xs = alternate_xs
self.empty_text = empty_text
if other_html:
self.other_html = other_html
if condense:
self.condense = condense
if build_columns:
self.build_columns = build_columns
@staticmethod
def build_columns(choice):
"""Default column building method
Overwrite this method when initializing this widget or using
self.fields[name].widget.build_columns in a parent form initialization
to customize the behavior (see above for details)
:param choice:
:return:
"""
return choice
@staticmethod
def condense(choice_columns):
"""The default condense method
Overwrite this method when initializing this widget or using
self.fields[name].widget.condense in a parent form initialization to
customize the behavior (see above for details)
:param choice_columns:
:return:
"""
return " / ".join([str(c) for c in choice_columns])
# Implements the parent 'other_html' construction for compatibility reasons
# Can be set in initializer to change the behavior as needed
def other_html(self, choice):
opt_label = choice[1]
other_html = self.transform_option_html_attrs(opt_label)
data_attr_html = self.get_data_attrs(opt_label)
if data_attr_html:
other_html += ' ' + data_attr_html
return other_html
def render(self, name, value, attrs=None, choices=None, renderer=None):
new_choices = []
initial_value = value
choices = choices or []
for opt in itertools.chain(self.choices, choices):
other_html = self.other_html(opt)
choice_columns = self.build_columns(opt)
condensed_label = self.condense(choice_columns)
built_choice = (
opt[0], condensed_label, choice_columns, other_html
)
new_choices.append(built_choice)
# Initial selection
if opt[0] == value:
initial_value = built_choice
if not initial_value and new_choices:
initial_value = new_choices[0]
element_id = attrs.pop('id', 'id_%s' % name)
# Size of individual columns in terms of the bootstrap grid - used
# for styling purposes
column_size = 12 // len(self.columns)
# Creates a single string label for all columns for use with small
# screens
condensed_headers = self.condense(self.columns)
template = get_template('project/firewalls_v2/table_select.html')
select_attrs = self.build_attrs(attrs)
context = {
'name': name,
'options': new_choices,
'id': element_id,
'value': value,
'initial_value': initial_value,
'select_attrs': select_attrs,
'column_size': column_size,
'columns': self.columns,
'condensed_headers': condensed_headers,
'alternate_xs': self.alternate_xs,
'empty_text': self.empty_text
}
return template.render(context)

View File

@ -1,388 +0,0 @@
# Copyright 2017, Juniper Networks, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from operator import attrgetter
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon.utils import validators
from horizon import workflows
import netaddr
from neutron_fwaas_dashboard.api import fwaas_v2 as api_fwaas_v2
port_validator = validators.validate_port_or_colon_separated_port_range
class AddRuleAction(workflows.Action):
name = forms.CharField(
max_length=80,
label=_("Name"),
required=False)
description = forms.CharField(
max_length=80,
label=_("Description"),
required=False)
protocol = forms.ThemableChoiceField(
label=_("Protocol"),
choices=[('tcp', _('TCP')),
('udp', _('UDP')),
('icmp', _('ICMP')),
('any', _('ANY'))],)
action = forms.ThemableChoiceField(
label=_("Action"),
choices=[('allow', _('ALLOW')),
('deny', _('DENY')),
('reject', _('REJECT'))],)
source_ip_address = forms.IPField(
label=_("Source IP Address/Subnet"),
version=forms.IPv4 | forms.IPv6,
required=False, mask=True)
destination_ip_address = forms.IPField(
label=_("Destination IP Address/Subnet"),
version=forms.IPv4 | forms.IPv6,
required=False, mask=True)
source_port = forms.CharField(
max_length=80,
label=_("Source Port/Port Range"),
required=False,
validators=[port_validator])
destination_port = forms.CharField(
max_length=80,
label=_("Destination Port/Port Range"),
required=False,
validators=[port_validator])
ip_version = forms.ThemableChoiceField(
label=_("IP Version"), required=False,
choices=[('4', '4'), ('6', '6')])
shared = forms.BooleanField(
label=_("Shared"), initial=False, required=False)
enabled = forms.BooleanField(
label=_("Enabled"), initial=True, required=False)
def _check_ip_addr_and_ip_version(self, cleaned_data):
ip_version = int(str(cleaned_data.get('ip_version')))
src_ip = cleaned_data.get('source_ip_address')
dst_ip = cleaned_data.get('destination_ip_address')
msg = _('Source/Destination Network Address and IP version '
'are inconsistent. Please make them consistent.')
if (src_ip and
netaddr.IPNetwork(src_ip).version != ip_version):
self._errors['ip_version'] = self.error_class([msg])
elif (dst_ip and
netaddr.IPNetwork(dst_ip).version != ip_version):
self._errors['ip_version'] = self.error_class([msg])
def clean(self):
cleaned_data = super(AddRuleAction, self).clean()
self._check_ip_addr_and_ip_version(cleaned_data)
class Meta(object):
name = _("Rule")
permissions = ('openstack.services.network',)
help_text = _("Create a firewall rule.\n\n"
"A Firewall rule is an association of the following "
"attributes:\n\n"
"<li>IP Addresses: The addresses from/to which the "
"traffic filtration needs to be applied.</li>"
"<li>IP Version: The type of IP packets (IP V4/V6) "
"that needs to be filtered.</li>"
"<li>Protocol: Type of packets (UDP, ICMP, TCP, Any) "
"that needs to be checked.</li>"
"<li>Action: Action is the type of filtration "
"required, it can be Reject/Deny/Allow data "
"packets.</li>\n"
"The protocol and action fields are required, all "
"others are optional.")
class AddRuleStep(workflows.Step):
action_class = AddRuleAction
contributes = ("name", "description", "protocol", "action",
"source_ip_address", "source_port",
"destination_ip_address", "destination_port",
"enabled", "shared", "ip_version")
def contribute(self, data, context):
context = super(AddRuleStep, self).contribute(data, context)
if data:
if context['protocol'] == 'any':
del context['protocol']
for field in ['source_port',
'destination_port',
'source_ip_address',
'destination_ip_address']:
if not context[field]:
del context[field]
return context
class AddRule(workflows.Workflow):
slug = "addrule"
name = _("Add Rule")
finalize_button_name = _("Add")
success_message = _('Added Rule "%s".')
failure_message = _('Unable to add Rule "%s".')
success_url = "horizon:project:firewalls_v2:index"
default_steps = (AddRuleStep,)
def format_status_message(self, message):
return message % self.context.get('name')
def handle(self, request, context):
try:
api_fwaas_v2.rule_create(request, **context)
return True
except Exception as e:
msg = self.format_status_message(self.failure_message) + str(e)
exceptions.handle(request, msg)
return False
class SelectRulesAction(workflows.Action):
rule = forms.MultipleChoiceField(
label=_("Rules"),
required=False,
widget=forms.ThemableCheckboxSelectMultiple(),
help_text=_("Create a policy with selected rules."))
class Meta(object):
name = _("Rules")
permissions = ('openstack.services.network',)
help_text = _("Select rules for your policy.")
def populate_rule_choices(self, request, context):
try:
tenant_id = self.request.user.tenant_id
rules = api_fwaas_v2.rule_list_for_tenant(request, tenant_id)
rules = sorted(rules,
key=attrgetter('name_or_id'))
rule_list = [(rule.id, rule.name_or_id) for rule in rules]
except Exception as e:
rule_list = []
exceptions.handle(request, _('Unable to retrieve rules (%s).') % e)
return rule_list
class SelectRulesStep(workflows.Step):
action_class = SelectRulesAction
template_name = "project/firewalls_v2/_update_rules.html"
contributes = ("firewall_rules",)
def contribute(self, data, context):
if data:
rules = self.workflow.request.POST.getlist("rule")
if rules:
rules = [r for r in rules if r]
context['firewall_rules'] = rules
return context
class AddPolicyAction(workflows.Action):
name = forms.CharField(max_length=80,
label=_("Name"))
description = forms.CharField(max_length=80,
label=_("Description"),
required=False)
shared = forms.BooleanField(label=_("Shared"),
initial=False,
required=False)
audited = forms.BooleanField(label=_("Audited"),
initial=False,
required=False)
class Meta(object):
name = _("Policy")
permissions = ('openstack.services.network',)
help_text = _("Create a firewall policy with an ordered list "
"of firewall rules.\n\n"
"A firewall policy is an ordered collection of firewall "
"rules. So if the traffic matches the first rule, the "
"other rules are not executed. If the traffic does not "
"match the current rule, then the next rule is "
"executed. A firewall policy has the following "
"attributes:\n\n"
"<li>Shared: A firewall policy can be shared across "
"tenants. Thus it can also be made part of an audit "
"workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li>"
"<li>Audited: When audited is set to True, it indicates "
"that the firewall policy has been audited. "
"Each time the firewall policy or the associated "
"firewall rules are changed, this attribute will be "
"set to False and will have to be explicitly set to "
"True through an update operation.</li>\n"
"The name field is required, all others are optional.")
class AddPolicyStep(workflows.Step):
action_class = AddPolicyAction
contributes = ("name", "description", "shared", "audited")
def contribute(self, data, context):
context = super(AddPolicyStep, self).contribute(data, context)
if data:
return context
class AddPolicy(workflows.Workflow):
slug = "addpolicy"
name = _("Add Policy")
finalize_button_name = _("Add")
success_message = _('Added Policy "%s".')
failure_message = _('Unable to add Policy "%s".')
success_url = "horizon:project:firewalls_v2:index"
default_steps = (AddPolicyStep, SelectRulesStep)
def format_status_message(self, message):
return message % self.context.get('name')
def handle(self, request, context):
try:
api_fwaas_v2.policy_create(request, **context)
return True
except Exception as e:
msg = self.format_status_message(self.failure_message) + str(e)
exceptions.handle(request, msg)
return False
class AddFWGPortsAction(workflows.Action):
port = forms.MultipleChoiceField(
label=_("Ports"),
required=False,
widget=forms.ThemableCheckboxSelectMultiple(),
help_text=_("Create a Firewall Group with selected ports."))
class Meta(object):
name = _("Ports")
permissions = ('openstack.services.network',)
help_text = _("Select ports for your firewall group.")
def populate_port_choices(self, request, context):
try:
tenant_id = self.request.user.tenant_id
ports = api_fwaas_v2.fwg_port_list_for_tenant(request, tenant_id)
ports = sorted(ports,
key=attrgetter('name_or_id'))
port_list = [(port.id, port.name_or_id) for port in ports]
except Exception as e:
port_list = []
exceptions.handle(request, _('Unable to retrieve ports (%s).') % e)
return port_list
class AddFWGPortsStep(workflows.Step):
action_class = AddFWGPortsAction
template_name = "project/firewalls_v2/_update_ports.html"
contributes = ("ports")
def contribute(self, data, context):
if data:
ports = self.workflow.request.POST.getlist("port")
if ports:
ports = [r for r in ports if r != '']
context['ports'] = ports
else:
context['ports'] = []
return context
class AddFirewallGroupAction(workflows.Action):
name = forms.CharField(max_length=80,
label=_("Name"),
required=False)
description = forms.CharField(max_length=80,
label=_("Description"),
required=False)
ingress_firewall_policy_id = forms.ThemableChoiceField(
label=_("Ingress Policy"),
required=False)
egress_firewall_policy_id = forms.ThemableChoiceField(
label=_("Egress Policy"),
required=False)
admin_state_up = forms.BooleanField(
label=_("Admin State"), initial=True, required=False)
shared = forms.BooleanField(
label=_("Shared"), initial=False, required=False)
def __init__(self, request, *args, **kwargs):
super(AddFirewallGroupAction, self).__init__(request, *args, **kwargs)
firewall_policy_id_choices = [('', _("Select a Policy"))]
try:
tenant_id = self.request.user.tenant_id
policies = api_fwaas_v2.policy_list_for_tenant(request, tenant_id)
policies = sorted(policies, key=attrgetter('name'))
except Exception as e:
exceptions.handle(request,
_('Unable to retrieve policy list (%s).') % e)
policies = []
for p in policies:
firewall_policy_id_choices.append((p.id, p.name_or_id))
self.fields['ingress_firewall_policy_id'].choices = \
firewall_policy_id_choices
self.fields['egress_firewall_policy_id'].choices = \
firewall_policy_id_choices
def clean(self):
cleaned_data = super(AddFirewallGroupAction, self).clean()
for field in ('ingress_firewall_policy_id',
'egress_firewall_policy_id'):
if not cleaned_data[field]:
cleaned_data[field] = None
return cleaned_data
class Meta(object):
name = _("FirewallGroup")
permissions = ('openstack.services.network',)
help_text = _("Create a firewall group based on a policy.\n\n"
"A firewall group represents a logical firewall "
"resource that a tenant can instantiate and manage. "
"A firewall group must be associated with one policy, "
"all other fields are optional.")
class AddFirewallGroupStep(workflows.Step):
action_class = AddFirewallGroupAction
contributes = ("name", "description", "admin_state_up", "shared",
"ingress_firewall_policy_id",
"egress_firewall_policy_id")
def contribute(self, data, context):
context = super(AddFirewallGroupStep, self).contribute(data, context)
return context
class AddFirewallGroup(workflows.Workflow):
slug = "addfirewallgroup"
name = _("Add Firewall Group")
finalize_button_name = _("Add")
success_message = _('Added Firewall Group"%s".')
failure_message = _('Unable to add Firewall Group "%s".')
success_url = "horizon:project:firewalls_v2:index"
default_steps = (AddFirewallGroupStep, AddFWGPortsStep)
def format_status_message(self, message):
return message % self.context.get('name')
def handle(self, request, context):
try:
api_fwaas_v2.firewall_group_create(request, **context)
return True
except Exception as e:
msg = self.format_status_message(self.failure_message) + str(e)
exceptions.handle(request, msg)
return False

View File

@ -1,20 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
# FEATURE just declares this enabled file needs to be loaded.
# This is required for ADD_INSTALLED_APPS to be processed.
# The value itself has no meaning in the current horizon.
FEATURE = 'neutron-fwaas-dashboard'
ADD_INSTALLED_APPS = ['neutron_fwaas_dashboard']
AUTO_DISCOVER_STATIC_FILES = True
ADD_SCSS_FILES = ['neutron_fwaas_dashboard/scss/firewalls.scss']

View File

@ -1,22 +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.
# The slug of the panel to be added to HORIZON_CONFIG. Required.
PANEL = 'firewalls_v2'
# The slug of the dashboard the PANEL associated with. Required.
PANEL_DASHBOARD = 'project'
# The slug of the panel group the PANEL is associated with.
PANEL_GROUP = 'network'
# Python panel class of the PANEL to be added.
ADD_PANEL = ('neutron_fwaas_dashboard.dashboards.project.'
'firewalls_v2.panel.Firewall_V2')

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.
from django.conf import settings
settings.POLICY_FILES['neutron-fwaas'] = 'neutron-fwaas-policy.json'

View File

@ -1,649 +0,0 @@
# Frank Kloeker <eumel@arcor.de>, 2016. #zanata
# Robert Simai <robert.simai@suse.com>, 2016. #zanata
# Andreas Jaeger <jaegerandi@gmail.com>, 2017. #zanata
# Frank Kloeker <eumel@arcor.de>, 2017. #zanata
# Robert Simai <robert.simai@suse.com>, 2017. #zanata
# Andreas Jaeger <jaegerandi@gmail.com>, 2018. #zanata
# Frank Kloeker <eumel@arcor.de>, 2018. #zanata
# Reik Keutterling <spielkind@gmail.com>, 2018. #zanata
# Robert Simai <robert.simai@suse.com>, 2018. #zanata
# Andreas Jaeger <jaegerandi@gmail.com>, 2019. #zanata
# Robert Simai <robert.simai@suse.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-fwaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-04-25 13:36+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:14+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 "-"
msgstr "-"
msgid "ALLOW"
msgstr "Erlauben"
msgctxt "Action Name of a Firewall Rule"
msgid "ALLOW"
msgstr "Erlauben"
msgid "ANY"
msgstr "ALLE"
msgid "Action"
msgstr "Aktion"
msgid "Action for the firewall rule"
msgstr "Aktion für die Firewallregel"
msgctxt "Current status of a Firewall Group"
msgid "Active"
msgstr "Aktiv"
msgid "Add"
msgstr "Hinzufügen"
msgid "Add Firewall Group"
msgstr "Firewall-Gruppe hinzufügen"
msgid "Add New Firewall Group"
msgstr "Neue Firewall-Gruppe hinzufügen"
msgid "Add New Policy"
msgstr "Neue Richtlinie hinzufügen"
msgid "Add New Rule"
msgstr "Neue Regel hinzufügen"
msgid "Add Policy"
msgstr "Richtlinie hinzufügen"
msgid "Add Port"
msgstr "Port hinzufügen"
msgid "Add Port to Firewall Group"
msgstr "Port zur Firewallgruppe hinzufügen"
msgid "Add Rule"
msgstr "Regel hinzufügen"
msgid "Add port to Firewall Group {{ name }}"
msgstr "Port zur Firewallgruppe {{ name }} hinzufügen"
#, python-format
msgid "Added Firewall Group\"%s\"."
msgstr "Firewall-Gruppe \"%s\" hinzugefügt."
#, python-format
msgid "Added Policy \"%s\"."
msgstr "Richtlinie \"%s\" hinzugefügt."
#, python-format
msgid "Added Rule \"%s\"."
msgstr "Regel \"%s\" wurde hinzugefügt."
#, python-format
msgid "Added the port(s) to the firewall group %s successfully."
msgstr "Port(s) wurde(n) zur Firewall-Gruppe %s erfolgreich hinzugefügt."
msgid "Admin State"
msgstr "Adminstatus"
msgid "Admin State Up"
msgstr "Adminstatus aktiv"
msgid "After"
msgstr "Nachher"
msgid "Audited"
msgstr "Geprüft"
msgid "Available Ports"
msgstr "Verfügbare Ports"
msgid "Available Rules"
msgstr "Verfügbare Regeln"
msgid "Before"
msgstr "Vorher"
msgid "Choose port(s) from Available Ports. "
msgstr "Wählen Sie aus den verfügbaren Ports aus."
msgid ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgstr ""
"Wählen Sie aus den \"Verfügbaren Regeln\" Regel(n) aus, indem Sie den Knopf "
"drücken oder mit Ziehen und Ablegen. Sie können auch die Reihenfolge mit "
"Ziehen und Ablegen ändern."
msgid ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgstr ""
"Wählen Sie die Regel aus, die Sie einfügen wollen. Spezifizieren Sie "
"entweder die Regel unmittelbar vor der Sie einfügen wollen oder die Regel "
"unmittelbar nach der Sie einfügen wollen. Wenn beide angegeben werden, hat "
"die vorherige Vorrang. "
msgid "Choose the rule you want to remove."
msgstr "Zu entfernende Richtlinie auswählen."
msgid "Create Firewall Group"
msgstr "Firewall-Gruppe erstellen"
msgid "Create a Firewall Group with selected ports."
msgstr "Erstellen einer Firewall-Gruppe mit den ausgewählten Ports."
msgid ""
"Create a firewall group based on a policy.\n"
"\n"
"A firewall group represents a logical firewall resource that a tenant can "
"instantiate and manage. A firewall group must be associated with one policy, "
"all other fields are optional."
msgstr ""
"Erzeugen einer Firewall-Gruppe auf Basis einer Richtlinie\n"
"\n"
"Eine Firewall-Gruppe repräsentiert eine logische Firewall-Ressource, die ein "
"Mandant instanzieren und verwalten kann. Eine Firewall-Gruppe muss mit einer "
"Richtlinie verbunden werden. Alle anderen Felder sind optional."
msgid ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgstr ""
"Erzeugen einer Firewall-Richtlinie mit einer geordneten Liste von Regeln.\n"
"\n"
"Eine Firewall-Richtlinie ist eine geordnete Sammlung von Firewall-Regeln. "
"Sobald eine Regel auf den Datenverkehr zutrifft, werden die weiteren Regeln "
"nicht mehr ausgeführt. Solange die Regeln nicht zutreffen, werden weitere "
"Regeln ausgeführt. Eine Firewall-Richtlinie hat die folgenden Attribute:\n"
"\n"
"<li>Geteilt/Shared: eine Firewall-Richtlinie kann mit mehreren Mandanten "
"geteilt werden. Dadurch kann sie auch als Teil eines Audit-Workflows "
"verwendet werden, um von einer berechtigten Einheit/Organisation/Person "
"geprüft zu werden.</li><li>Auditiert/Audited: wenn dies auf wahr/true "
"gesetzt ist, zeigt es an, dass die Richtlinie geprüft wurde. Jedes Mal, wenn "
"eine Richtlinie oder eine der Regeln darin geändert wird, wird der Indikator "
"wieder auf falsch/false gesetzt und muss durch eine Update-Operation "
"explizit wieder auf wahr/true gesetzt werden.</li>\n"
"Das Namensfeld ist erforderlich, alle anderen sind optional."
msgid ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgstr ""
"Firewall-Regel anlegen\n"
"\n"
"Eine Firewall-Regel bezieht sich auf die folgenden Attribute:\n"
"\n"
"<li>IP-Adresse: die Adresse, auf zu/von der der Datenverkehr gefiltert wird."
"</li><li>IP-Version: der IP Pakettyp (IPV4/6) der gefiltert wird.</"
"li><li>Protokoll: der Pakettyp (UDP, ICMP, TCP, Any) der kontrolliert wird.</"
"li><li>Aktion: die vorhergesehene Filteraktion, möglich ist Abweisen/"
"Verweigern/Erlauben für Datenpakete.</li>\n"
"Die Protokoll- und Aktionsfelder sind erforderlich, andere optional."
msgid "Create a policy with selected rules."
msgstr "Richtlinie mit ausgewählten Regeln erstellen."
msgctxt "Current status of a Firewall Group"
msgid "Created"
msgstr "Erstellt"
msgid "DENY"
msgstr "Verweigern"
msgctxt "Action Name of a Firewall Rule"
msgid "DENY"
msgstr "Verweigern"
msgctxt "Admin state of a Firewall Group"
msgid "DOWN"
msgstr "INAKTIV"
msgid "Delete Firewall Group"
msgid_plural "Delete Firewall Groups"
msgstr[0] "Firewall-Gruppe löschen"
msgstr[1] "Firewall-Gruppen löschen"
msgid "Delete Policy"
msgid_plural "Delete Policies"
msgstr[0] "Richtlinie löschen"
msgstr[1] "Richtlinien löschen"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Regel löschen"
msgstr[1] "Regeln löschen"
msgid "Description"
msgstr "Beschreibung"
msgid "Description:"
msgstr "Beschreibung:"
msgid "Destination IP"
msgstr "Ziel-IP"
msgid "Destination IP Address"
msgstr "Ziel-IP-Adresse"
msgid "Destination IP Address/Subnet"
msgstr "Ziel-IP-Adresse oder Subnetz"
msgid "Destination IP address or subnet"
msgstr "Ziel-IP-Adresse oder Subnetz"
msgid "Destination Port"
msgstr "Ziel-Port"
msgid "Destination Port/Port Range"
msgstr "Ziel-Port/-Portbereich"
msgid "Destination port (integer in [1, 65535] or range in a:b)"
msgstr "Ziel-Port (Ganzzahl aus [1, 65535] oder Bereich als a:b)"
msgctxt "Current status of a Firewall Group"
msgid "Down"
msgstr "Inaktiv"
msgid "Edit Firewall Group"
msgstr "Firewall-Gruppe bearbeiten"
msgid "Edit FirewallGroup {{ name }}"
msgstr "Firewall-Gruppe bearbeiten {{ name }}"
msgid "Edit Policy"
msgstr "Richtlinie bearbeiten"
msgid "Edit Policy {{ name }}"
msgstr "Richtlinie bearbeiten {{ name }}"
msgid "Edit Rule"
msgstr "Regel bearbeiten"
msgid "Edit Rule {{ name }}"
msgstr "Regel bearbeiten {{ name }}"
msgid "Egress Policy"
msgstr "Austrittsrichtlinie"
msgid "Egress Policy ID"
msgstr "Ausgang Richtlinien-ID"
msgid "Enabled"
msgstr "Aktiviert"
msgctxt "Current status of a Firewall Group"
msgid "Error"
msgstr "Fehler"
#, python-format
msgid "Failed to add the port(s) to the firewall group %(name)s: %(reason)s"
msgstr ""
"Port konnte zur der Firewallgruppe %(name)s nicht hinzugefügt werden: "
"%(reason)s"
#, python-format
msgid "Failed to insert rule to policy %(name)s: %(reason)s"
msgstr "Regel konnte nicht eingefügt werden in Richtlinie %(name)s: %(reason)s"
#, python-format
msgid "Failed to remove rule from policy %(name)s: %(reason)s"
msgstr "Entfernen der Regel von Richtlinie %(name)s fehlgeschlagen: %(reason)s"
#, python-format
msgid ""
"Failed to remove the port(s) from the firewall group %(name)s: %(reason)s"
msgstr ""
"Port konnte von der Firewallgruppe %(name)s nicht entfernt werden: %(reason)s"
#, python-format
msgid "Failed to retrieve available rules: %s"
msgstr "Verfügbare Regeln konnten nicht abgerufen werden: %s"
#, python-format
msgid "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgstr ""
"Aktuelle Regeln in Richtline %(name)s konnten nicht abgerufen werden: "
"%(reason)s"
msgid "Failed to retrieve port list of the firewall group."
msgstr "Abruf der Portliste der Firewall-Gruppe ist fehlgeschlagen."
#, python-format
msgid "Failed to update firewall group %(name)s: %(reason)s"
msgstr "Firewallgruppe %(name)s konnte nicht aktualisiert werden: %(reason)s"
#, python-format
msgid "Failed to update policy %(name)s: %(reason)s"
msgstr "Fehler beim Aktualisieren der Richtlinie %(name)s: %(reason)s"
#, python-format
msgid "Failed to update rule %(name)s: %(reason)s"
msgstr "Regel %(name)s konnte nicht aktualisiert werden: %(reason)s"
msgid "Firewall Groups"
msgstr "Firewall-Gruppe"
msgid "Firewall Policies"
msgstr "Firewallrichtlinien"
msgid "Firewall Rules"
msgstr "Firewallregeln"
#, python-format
msgid "Firewall group %s was successfully updated."
msgstr "Firewallgruppe %s wurde erfolgreich aktualisiert."
msgid "FirewallGroup"
msgstr "Firewall-Gruppe"
msgid "ICMP"
msgstr "ICMP"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP Version"
msgid "IP Version for Firewall Rule"
msgstr "IP-Version der Firewall-Regel"
msgctxt "Current status of a Firewall Group"
msgid "Inactive"
msgstr "Inaktiv"
msgid "Ingress Policy"
msgstr "Eingangsrichtlinie"
msgid "Ingress Policy ID"
msgstr "Eingang Richtlinien-ID"
msgid "Insert Rule"
msgstr "Regel einfügen"
msgid "Insert Rule to Policy"
msgstr "Regel in Richtlinie hinzufügen"
msgid "Label"
msgstr "Beschreibung"
msgid "Name"
msgstr "Name"
msgid "No options available"
msgstr "Keine Optionen verfügbar"
msgid "None"
msgstr "Keine"
msgctxt "Current status of a Firewall Group"
msgid "Pending Create"
msgstr "Geplante Erstellung"
msgctxt "Current status of a Firewall Group"
msgid "Pending Delete"
msgstr "Geplante Löschung"
msgctxt "Current status of a Firewall Group"
msgid "Pending Update"
msgstr "Geplante Aktualisierung"
msgid "Policies"
msgstr "Richtlinien"
msgid "Policy"
msgstr "Richtlinie"
#, python-format
msgid "Policy %s was successfully updated."
msgstr "Richtlinie %s wurde wurde erfolgreich aktualisiert."
msgid "Ports"
msgstr "Ports"
msgid "Project ID"
msgstr "Projekt-ID"
msgid "Protocol"
msgstr "Protokoll"
msgid "Protocol for the firewall rule"
msgstr "Protokoll für die Firewallregel"
msgid "REJECT"
msgstr "Abweisen"
msgctxt "Action Name of a Firewall Rule"
msgid "REJECT"
msgstr "Abweisen"
msgid "Remove Port"
msgstr "Port entfernen"
msgid "Remove Port from Firewall Group"
msgstr "Port von der Firewallgruppe entfernen"
msgid "Remove Rule"
msgstr "Regel entfernen"
msgid "Remove Rule from Policy"
msgstr "Regel aus Richtlinie entfernen"
msgid "Remove port from FirewallGroup {{ name }}"
msgstr "Port aus Firewall-Gruppe entfernen {{ name }}"
#, python-format
msgid "Removed the port(s) from the firewall group %s successfully."
msgstr "Port(s) wurde(n) von der Firewall-Gruppe %s erfolgreich entfernt."
msgid "Rule"
msgstr "Regel"
#, python-format
msgid "Rule %(rule)s was successfully inserted to policy %(policy)s."
msgstr "Regel %(rule)s wurde erfolgreich in Richtlinie %(policy)s eingefügt ."
#, python-format
msgid "Rule %(rule)s was successfully removed from policy %(policy)s."
msgstr "Regel %(rule)s wurde erfolgreich aus Richtlinie %(policy)s entfernt."
#, python-format
msgid "Rule %s was successfully updated."
msgstr "Regel %s wurde erfolgreich aktualisiert."
msgid "Rules"
msgstr "Regeln"
msgid "Save Changes"
msgstr "Änderungen speichern"
msgid "Scheduled deletion of Firewall Group"
msgid_plural "Scheduled deletion of Firewall Groups"
msgstr[0] "Geplante Löschung der Firewall-Gruppe"
msgstr[1] "Geplante Löschung der Firewall-Gruppen"
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
msgstr[0] "Geplante Löschung der Richtlinie"
msgstr[1] "Geplante Löschung von Richtlinien"
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
msgstr[0] "Geplante Löschung der Regel"
msgstr[1] "Geplante Löschung von Regeln"
msgid "Select a Policy"
msgstr "Richtlinie auswählen"
msgid "Select ports for your firewall group."
msgstr "Wählen Sie Ports für Ihre Firewall-Gruppe."
msgid "Select rules for your policy."
msgstr "Regeln für Richtlinie auswählen."
msgid "Selected Ports"
msgstr "Ausgewählte Ports"
msgid "Selected Rules"
msgstr "Ausgewählte Regeln"
msgid "Shared"
msgstr "Geteilt"
msgid "Source IP"
msgstr "Quell-IP"
msgid "Source IP Address"
msgstr "Quell-IP-Adresse"
msgid "Source IP Address/Subnet"
msgstr "Quell-IP-Adresse oder Subnetz"
msgid "Source IP address or subnet"
msgstr "Quell-IP-Adresse oder Subnetz"
msgid "Source Port"
msgstr "Quell-Port"
msgid "Source Port/Port Range"
msgstr "Quell-Port/-Portbereich"
msgid "Source port (integer in [1, 65535] or range in a:b)"
msgstr "Quell-Port (Ganzzahl aus [1, 65535] oder Bereich als a:b)"
msgid ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgstr ""
"Quelle/Ziel Netzwekadresse und IP-Version sind nicht konsistent. Bitte "
"ändern Sie dies."
msgid "Status"
msgstr "Status"
msgid "TCP"
msgstr "TCP"
msgid "UDP"
msgstr "UDP"
msgctxt "Admin state of a Firewall Group"
msgid "UP"
msgstr "AKTIV"
#, python-format
msgid "Unable to add Firewall Group \"%s\"."
msgstr "Firewall-Gruppe \"%s\" konnte nicht hinzugefügt werden."
#, python-format
msgid "Unable to add Policy \"%s\"."
msgstr "Richtlinie \"%s\" konnte nicht hinzugefügt werden."
#, python-format
msgid "Unable to add Rule \"%s\"."
msgstr "Regel \"%s\" kann nicht hinzugefügt werden"
#, python-format
msgid "Unable to delete firewall group. %s"
msgstr "Firewall-Gruppe kann nicht gelöscht werden: %s"
#, python-format
msgid "Unable to delete policy. %s"
msgstr "Richtlinie %s konnte nicht gelöscht werden."
#, python-format
msgid "Unable to delete rule. %s"
msgstr "Regel %s kann nicht gelöscht werden."
msgid "Unable to retrieve firewall group details."
msgstr "Firewall-Gruppendetails können nicht abgerufen werden."
msgid "Unable to retrieve firewall group list."
msgstr "Firewall-Gruppenliste kann nicht abgerufen werden."
msgid "Unable to retrieve firewallgroup details."
msgstr "Konnte Firewall-Gruppendetails nicht abrufen."
msgid "Unable to retrieve policies list."
msgstr "Liste der Richtlinien kann nicht abgerufen werden."
msgid "Unable to retrieve policy details."
msgstr "Richtliniendetails können nicht abgerufen werden."
#, python-format
msgid "Unable to retrieve policy list (%s)."
msgstr "Richtlinienliste kann nicht abgerufen werden (%s)."
msgid "Unable to retrieve policy list."
msgstr "Liste der Richtlinien kann nicht abgerufen werden."
#, python-format
msgid "Unable to retrieve ports (%s)."
msgstr "Ports können nicht abgerufen werden (%s)."
msgid "Unable to retrieve rule details."
msgstr "Details der Regeln können nicht abgerufen werden. "
#, python-format
msgid "Unable to retrieve rules (%s)."
msgstr "Regeln können nicht abgerufen werden (%s)."
msgid "Unable to retrieve rules list."
msgstr "Liste der Regeln kann nicht abgerufen werden."
msgid "Value"
msgstr "Wert"
msgid "You may add ports to firewall group here."
msgstr "Hier können Sie Ports zur Firewallgruppe hinzufügen."
msgid "You may remove ports from firewall group here."
msgstr "Hier können Sie Ports von der Firewallgruppe entfernen."
msgid "You may update firewall group details here."
msgstr "Hier können Sie die Firewallgruppendetails bearbeiten."
msgid ""
"You may update policy details here. Use 'Insert Rule' or 'Remove Rule' links "
"instead to insert or remove a rule."
msgstr ""
"Hier können Sie Richtliniendetails aktualisieren. Wählen Sie die "
"Verknüpfungen 'Regel einfügen' oder 'Regel entfernen', um eine Regel "
"einzufügen oder zu entfernen."
msgid "You may update rule details here."
msgstr "Hier können Sie die Details der Regeln aktualisieren."

View File

@ -1,633 +0,0 @@
# Andi Chandler <andi@gowling.com>, 2017. #zanata
# Andi Chandler <andi@gowling.com>, 2018. #zanata
# Andi Chandler <andi@gowling.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-fwaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-02-19 16:16+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-26 03:30+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 "-"
msgstr "-"
msgid "ALLOW"
msgstr "ALLOW"
msgctxt "Action Name of a Firewall Rule"
msgid "ALLOW"
msgstr "ALLOW"
msgid "ANY"
msgstr "ANY"
msgid "Action"
msgstr "Action"
msgid "Action for the firewall rule"
msgstr "Action for the firewall rule"
msgctxt "Current status of a Firewall Group"
msgid "Active"
msgstr "Active"
msgid "Add"
msgstr "Add"
msgid "Add Firewall Group"
msgstr "Add Firewall Group"
msgid "Add New Firewall Group"
msgstr "Add New Firewall Group"
msgid "Add New Policy"
msgstr "Add New Policy"
msgid "Add New Rule"
msgstr "Add New Rule"
msgid "Add Policy"
msgstr "Add Policy"
msgid "Add Port"
msgstr "Add Port"
msgid "Add Port to Firewall Group"
msgstr "Add Port to Firewall Group"
msgid "Add Rule"
msgstr "Add Rule"
msgid "Add port to Firewall Group {{ name }}"
msgstr "Add port to Firewall Group {{ name }}"
#, python-format
msgid "Added Firewall Group\"%s\"."
msgstr "Added Firewall Group\"%s\"."
#, python-format
msgid "Added Policy \"%s\"."
msgstr "Added Policy \"%s\"."
#, python-format
msgid "Added Rule \"%s\"."
msgstr "Added Rule \"%s\"."
#, python-format
msgid "Added the port(s) to the firewall group %s successfully."
msgstr "Added the port(s) to the firewall group %s successfully."
msgid "Admin State"
msgstr "Admin State"
msgid "Admin State Up"
msgstr "Admin State Up"
msgid "After"
msgstr "After"
msgid "Audited"
msgstr "Audited"
msgid "Available Ports"
msgstr "Available Ports"
msgid "Available Rules"
msgstr "Available Rules"
msgid "Before"
msgstr "Before"
msgid "Choose port(s) from Available Ports. "
msgstr "Choose port(s) from Available Ports. "
msgid ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgstr ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgid ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgstr ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgid "Choose the rule you want to remove."
msgstr "Choose the rule you want to remove."
msgid "Create Firewall Group"
msgstr "Create Firewall Group"
msgid "Create a Firewall Group with selected ports."
msgstr "Create a Firewall Group with selected ports."
msgid ""
"Create a firewall group based on a policy.\n"
"\n"
"A firewall group represents a logical firewall resource that a tenant can "
"instantiate and manage. A firewall group must be associated with one policy, "
"all other fields are optional."
msgstr ""
"Create a firewall group based on a policy.\n"
"\n"
"A firewall group represents a logical firewall resource that a tenant can "
"instantiate and manage. A firewall group must be associated with one policy, "
"all other fields are optional."
msgid ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgstr ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgid ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgstr ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgid "Create a policy with selected rules."
msgstr "Create a policy with selected rules."
msgctxt "Current status of a Firewall Group"
msgid "Created"
msgstr "Created"
msgid "DENY"
msgstr "DENY"
msgctxt "Action Name of a Firewall Rule"
msgid "DENY"
msgstr "DENY"
msgctxt "Admin state of a Firewall Group"
msgid "DOWN"
msgstr "DOWN"
msgid "Delete Firewall Group"
msgid_plural "Delete Firewall Groups"
msgstr[0] "Delete Firewall Group"
msgstr[1] "Delete Firewall Groups"
msgid "Delete Policy"
msgid_plural "Delete Policies"
msgstr[0] "Delete Policy"
msgstr[1] "Delete Policies"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Delete Rule"
msgstr[1] "Delete Rules"
msgid "Description"
msgstr "Description"
msgid "Description:"
msgstr "Description:"
msgid "Destination IP"
msgstr "Destination IP"
msgid "Destination IP Address"
msgstr "Destination IP Address"
msgid "Destination IP Address/Subnet"
msgstr "Destination IP Address/Subnet"
msgid "Destination IP address or subnet"
msgstr "Destination IP address or subnet"
msgid "Destination Port"
msgstr "Destination Port"
msgid "Destination Port/Port Range"
msgstr "Destination Port/Port Range"
msgid "Destination port (integer in [1, 65535] or range in a:b)"
msgstr "Destination port (integer in [1, 65535] or range in a:b)"
msgctxt "Current status of a Firewall Group"
msgid "Down"
msgstr "Down"
msgid "Edit Firewall Group"
msgstr "Edit Firewall Group"
msgid "Edit FirewallGroup {{ name }}"
msgstr "Edit FirewallGroup {{ name }}"
msgid "Edit Policy"
msgstr "Edit Policy"
msgid "Edit Policy {{ name }}"
msgstr "Edit Policy {{ name }}"
msgid "Edit Rule"
msgstr "Edit Rule"
msgid "Edit Rule {{ name }}"
msgstr "Edit Rule {{ name }}"
msgid "Egress Policy"
msgstr "Egress Policy"
msgid "Egress Policy ID"
msgstr "Egress Policy ID"
msgid "Enabled"
msgstr "Enabled"
msgctxt "Current status of a Firewall Group"
msgid "Error"
msgstr "Error"
#, python-format
msgid "Failed to add the port(s) to the firewall group %(name)s: %(reason)s"
msgstr "Failed to add the port(s) to the firewall group %(name)s: %(reason)s"
#, python-format
msgid "Failed to insert rule to policy %(name)s: %(reason)s"
msgstr "Failed to insert rule to policy %(name)s: %(reason)s"
#, python-format
msgid "Failed to remove rule from policy %(name)s: %(reason)s"
msgstr "Failed to remove rule from policy %(name)s: %(reason)s"
#, python-format
msgid ""
"Failed to remove the port(s) from the firewall group %(name)s: %(reason)s"
msgstr ""
"Failed to remove the port(s) from the firewall group %(name)s: %(reason)s"
#, python-format
msgid "Failed to retrieve available rules: %s"
msgstr "Failed to retrieve available rules: %s"
#, python-format
msgid "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgstr "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgid "Failed to retrieve port list of the firewall group."
msgstr "Failed to retrieve port list of the firewall group."
#, python-format
msgid "Failed to update firewall group %(name)s: %(reason)s"
msgstr "Failed to update firewall group %(name)s: %(reason)s"
#, python-format
msgid "Failed to update policy %(name)s: %(reason)s"
msgstr "Failed to update policy %(name)s: %(reason)s"
#, python-format
msgid "Failed to update rule %(name)s: %(reason)s"
msgstr "Failed to update rule %(name)s: %(reason)s"
msgid "Firewall Groups"
msgstr "Firewall Groups"
msgid "Firewall Policies"
msgstr "Firewall Policies"
msgid "Firewall Rules"
msgstr "Firewall Rules"
#, python-format
msgid "Firewall group %s was successfully updated."
msgstr "Firewall group %s was successfully updated."
msgid "FirewallGroup"
msgstr "FirewallGroup"
msgid "ICMP"
msgstr "ICMP"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP Version"
msgid "IP Version for Firewall Rule"
msgstr "IP Version for Firewall Rule"
msgctxt "Current status of a Firewall Group"
msgid "Inactive"
msgstr "Inactive"
msgid "Ingress Policy"
msgstr "Ingress Policy"
msgid "Ingress Policy ID"
msgstr "Ingress Policy ID"
msgid "Insert Rule"
msgstr "Insert Rule"
msgid "Insert Rule to Policy"
msgstr "Insert Rule to Policy"
msgid "Label"
msgstr "Label"
msgid "Name"
msgstr "Name"
msgid "No options available"
msgstr "No options available"
msgid "None"
msgstr "None"
msgctxt "Current status of a Firewall Group"
msgid "Pending Create"
msgstr "Pending Create"
msgctxt "Current status of a Firewall Group"
msgid "Pending Delete"
msgstr "Pending Delete"
msgctxt "Current status of a Firewall Group"
msgid "Pending Update"
msgstr "Pending Update"
msgid "Policies"
msgstr "Policies"
msgid "Policy"
msgstr "Policy"
#, python-format
msgid "Policy %s was successfully updated."
msgstr "Policy %s was successfully updated."
msgid "Ports"
msgstr "Ports"
msgid "Project ID"
msgstr "Project ID"
msgid "Protocol"
msgstr "Protocol"
msgid "Protocol for the firewall rule"
msgstr "Protocol for the firewall rule"
msgid "REJECT"
msgstr "REJECT"
msgctxt "Action Name of a Firewall Rule"
msgid "REJECT"
msgstr "REJECT"
msgid "Remove Port"
msgstr "Remove Port"
msgid "Remove Port from Firewall Group"
msgstr "Remove Port from Firewall Group"
msgid "Remove Rule"
msgstr "Remove Rule"
msgid "Remove Rule from Policy"
msgstr "Remove Rule from Policy"
msgid "Remove port from FirewallGroup {{ name }}"
msgstr "Remove port from FirewallGroup {{ name }}"
#, python-format
msgid "Removed the port(s) from the firewall group %s successfully."
msgstr "Removed the port(s) from the firewall group %s successfully."
msgid "Rule"
msgstr "Rule"
#, python-format
msgid "Rule %(rule)s was successfully inserted to policy %(policy)s."
msgstr "Rule %(rule)s was successfully inserted to policy %(policy)s."
#, python-format
msgid "Rule %(rule)s was successfully removed from policy %(policy)s."
msgstr "Rule %(rule)s was successfully removed from policy %(policy)s."
#, python-format
msgid "Rule %s was successfully updated."
msgstr "Rule %s was successfully updated."
msgid "Rules"
msgstr "Rules"
msgid "Save Changes"
msgstr "Save Changes"
msgid "Scheduled deletion of Firewall Group"
msgid_plural "Scheduled deletion of Firewall Groups"
msgstr[0] "Scheduled deletion of Firewall Group"
msgstr[1] "Scheduled deletion of Firewall Groups"
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
msgstr[0] "Scheduled deletion of Policy"
msgstr[1] "Scheduled deletion of Policies"
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
msgstr[0] "Scheduled deletion of Rule"
msgstr[1] "Scheduled deletion of Rules"
msgid "Select a Policy"
msgstr "Select a Policy"
msgid "Select ports for your firewall group."
msgstr "Select ports for your firewall group."
msgid "Select rules for your policy."
msgstr "Select rules for your policy."
msgid "Selected Ports"
msgstr "Selected Ports"
msgid "Selected Rules"
msgstr "Selected Rules"
msgid "Shared"
msgstr "Shared"
msgid "Source IP"
msgstr "Source IP"
msgid "Source IP Address"
msgstr "Source IP Address"
msgid "Source IP Address/Subnet"
msgstr "Source IP Address/Subnet"
msgid "Source IP address or subnet"
msgstr "Source IP address or subnet"
msgid "Source Port"
msgstr "Source Port"
msgid "Source Port/Port Range"
msgstr "Source Port/Port Range"
msgid "Source port (integer in [1, 65535] or range in a:b)"
msgstr "Source port (integer in [1, 65535] or range in a:b)"
msgid ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgstr ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgid "Status"
msgstr "Status"
msgid "TCP"
msgstr "TCP"
msgid "UDP"
msgstr "UDP"
msgctxt "Admin state of a Firewall Group"
msgid "UP"
msgstr "UP"
#, python-format
msgid "Unable to add Firewall Group \"%s\"."
msgstr "Unable to add Firewall Group \"%s\"."
#, python-format
msgid "Unable to add Policy \"%s\"."
msgstr "Unable to add Policy \"%s\"."
#, python-format
msgid "Unable to add Rule \"%s\"."
msgstr "Unable to add Rule \"%s\"."
#, python-format
msgid "Unable to delete firewall group. %s"
msgstr "Unable to delete firewall group. %s"
#, python-format
msgid "Unable to delete policy. %s"
msgstr "Unable to delete policy. %s"
#, python-format
msgid "Unable to delete rule. %s"
msgstr "Unable to delete rule. %s"
msgid "Unable to retrieve firewall group details."
msgstr "Unable to retrieve firewall group details."
msgid "Unable to retrieve firewall group list."
msgstr "Unable to retrieve firewall group list."
msgid "Unable to retrieve firewallgroup details."
msgstr "Unable to retrieve Firewallgroup details."
msgid "Unable to retrieve policies list."
msgstr "Unable to retrieve policies list."
msgid "Unable to retrieve policy details."
msgstr "Unable to retrieve policy details."
#, python-format
msgid "Unable to retrieve policy list (%s)."
msgstr "Unable to retrieve policy list (%s)."
msgid "Unable to retrieve policy list."
msgstr "Unable to retrieve policy list."
#, python-format
msgid "Unable to retrieve ports (%s)."
msgstr "Unable to retrieve ports (%s)."
msgid "Unable to retrieve rule details."
msgstr "Unable to retrieve rule details."
#, python-format
msgid "Unable to retrieve rules (%s)."
msgstr "Unable to retrieve rules (%s)."
msgid "Unable to retrieve rules list."
msgstr "Unable to retrieve rules list."
msgid "Value"
msgstr "Value"
msgid "You may add ports to firewall group here."
msgstr "You may add ports to firewall group here."
msgid "You may remove ports from firewall group here."
msgstr "You may remove ports from firewall group here."
msgid "You may update firewall group details here."
msgstr "You may update firewall group details here."
msgid ""
"You may update policy details here. Use 'Insert Rule' or 'Remove Rule' links "
"instead to insert or remove a rule."
msgstr ""
"You may update policy details here. Use 'Insert Rule' or 'Remove Rule' links "
"instead to insert or remove a rule."
msgid "You may update rule details here."
msgstr "You may update rule details here."

View File

@ -1,501 +0,0 @@
# Adrien Cunin <adrien@adriencunin.fr>, 2016. #zanata
# Gérald LONLAS <g.lonlas@gmail.com>, 2016. #zanata
# Sylvie Chesneau <sissicdf@fr.ibm.com>, 2016. #zanata
# Cédric Savignan <liced@liced.fr>, 2017. #zanata
# JF Taltavull <jftalta@gmail.com>, 2017. #zanata
# Loic Nicolle <loic.nicolle@orange.com>, 2017. #zanata
# Pascal Larivée <pascal@larivee.photo>, 2017. #zanata
# Loic Nicolle <loic.nicolle@orange.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-fwaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-02-19 16:16+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-03-27 03:09+0000\n"
"Last-Translator: Loic Nicolle <loic.nicolle@orange.com>\n"
"Language-Team: French\n"
"Language: fr\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
msgid "-"
msgstr "-"
msgid "ALLOW"
msgstr "AUTORISER"
msgctxt "Action Name of a Firewall Rule"
msgid "ALLOW"
msgstr "AUTORISER"
msgid "ANY"
msgstr "TOUT"
msgid "Action"
msgstr "Action"
msgid "Action for the firewall rule"
msgstr "Action pour la règle de pare-feu"
msgctxt "Current status of a Firewall Group"
msgid "Active"
msgstr "Actif"
msgid "Add"
msgstr "Ajouter"
msgid "Add Firewall Group"
msgstr "Ajouter un groupe de pare-feux"
msgid "Add New Policy"
msgstr "Ajouter une nouvelle stratégie"
msgid "Add New Rule"
msgstr "Ajouter une nouvelle règle"
msgid "Add Policy"
msgstr "Ajouter une stratégie"
msgid "Add Rule"
msgstr "Ajouter une règle"
#, python-format
msgid "Added Policy \"%s\"."
msgstr "Stratégie \"%s\" ajoutée."
#, python-format
msgid "Added Rule \"%s\"."
msgstr "Règle \"%s\" ajoutée."
msgid "Admin State"
msgstr "État Administateur"
msgid "Admin State Up"
msgstr "Etat Admin activé"
msgid "After"
msgstr "Après"
msgid "Audited"
msgstr "Audité"
msgid "Available Ports"
msgstr "Ports disponibles"
msgid "Available Rules"
msgstr "Règles disponibles"
msgid "Before"
msgstr "Avant"
msgid ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgstr ""
"Choisissez une ou plusieurs règles en les faisant passer des règles "
"disponibles aux règles sélectionnées en cliquant sur le bouton ou par "
"glisser-déposer. Vous pouvez aussi changer l'ordre des règles par glisser-"
"déposer."
msgid ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgstr ""
"Choisissez la règle que vous souhaitez insérer. Spécifiez la règle qui doit "
"précéder immédiatement votre nouvelle règle, ou la règle qui doit suivre "
"immédiatement votre nouvelle règle. Si vous spécifiez les deux, le premier "
"critère est prioritaire."
msgid "Choose the rule you want to remove."
msgstr "Choisissez la règle que vous voulez enlever."
msgid "Create a Firewall Group with selected ports."
msgstr "Créer un groupe de pare-feux avec les ports sélectionnés."
msgid ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgstr ""
"Créer une stratégie de pare-feu avec une liste ordonnée de règles de pare-"
"feu.\n"
"\n"
"Une stratégie de pare-feu est un ensemble ordonné de règles de pare-feu. Si "
"le trafic correspond à la première règle, les autres règles ne sont pas "
"exécutées. Si le trafic ne correspond pas à la règle en cours, la règle "
"suivante est exécutée. Une stratégie de pare-feu comporte les attributs "
"suivants :\n"
"\n"
"<li>Partagé (shared) : Une stratégie de pare-feu peut être partagée entre "
"locataires. Elle peut ainsi faire partie d'un flux de travaux d'audit au "
"sein duquel la stratégie de pare-feu peut être auditée par l'entité "
"appropriée autorisée.</li><li>Audité (audited) : Lorsque l'attribut est "
"défini sur True, la stratégie de pare-feu a été auditée. Chaque fois qu'une "
"stratégie de pare-feu ou les règles de pare-feu associées sont modifiées, "
"cet attribut est défini sur False et devra être explicitement défini avec la "
"valeur True via une opération de mise à jour.</li>\n"
"La zone de nom est obligatoire, toutes les autres sont facultatives."
msgid ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgstr ""
"Créer une règle de pare-feu.\n"
"\n"
"Une règle de pare-feu est une association des attributs suivants :\n"
"\n"
"<li>Adresses IP : Adresses depuis/vers lesquelles le filtrage du trafic doit "
"s'appliquer.</li><li>Version d'IP : Type des paquets IP (IP V4/V6) à filtrer."
"</li><li>Protocole : Type des paquets (UDP, ICMP, TCP, Tout) à vérifier.</"
"li><li>Action : Type de filtrage requis ; Il peut s'agir de Rejeter/Refuser/"
"Autoriser les paquets de données.</li>\n"
"Les zones de protocole et d'action sont obligatoires, toutes les autres sont "
"facultatives."
msgid "Create a policy with selected rules."
msgstr "Créer une stratégie avec les règles sélectionnées."
msgctxt "Current status of a Firewall Group"
msgid "Created"
msgstr "Créé"
msgid "DENY"
msgstr "REFUSER"
msgctxt "Action Name of a Firewall Rule"
msgid "DENY"
msgstr "REFUSER"
msgctxt "Admin state of a Firewall Group"
msgid "DOWN"
msgstr "INACTIF"
msgid "Delete Policy"
msgid_plural "Delete Policies"
msgstr[0] "Supprimer la stratégie"
msgstr[1] "Supprimer les stratégies"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Supprimer la règle"
msgstr[1] "Supprimer les règles"
msgid "Description"
msgstr "Description"
msgid "Description:"
msgstr "Description:"
msgid "Destination IP"
msgstr "IP de destination"
msgid "Destination IP Address"
msgstr "Adresse IP de destination"
msgid "Destination IP Address/Subnet"
msgstr "Adresse IP/Sous-réseau de destination"
msgid "Destination IP address or subnet"
msgstr "Adresse IP ou sous-réseau de destination"
msgid "Destination Port"
msgstr "Port de destination"
msgid "Destination Port/Port Range"
msgstr "Port/Plage de ports de destination"
msgid "Destination port (integer in [1, 65535] or range in a:b)"
msgstr "Port de destination (entier compris dans [1, 65535] ou plage a:b)"
msgctxt "Current status of a Firewall Group"
msgid "Down"
msgstr "Inactif"
msgid "Edit Policy"
msgstr "Editer la stratégie"
msgid "Edit Policy {{ name }}"
msgstr "Editer la stratégie {{ name }}"
msgid "Edit Rule"
msgstr "Éditer la règle"
msgid "Edit Rule {{ name }}"
msgstr "Editer la règle {{ name }}"
msgid "Egress Policy"
msgstr "Stratégie sortante"
msgid "Enabled"
msgstr "Activé"
msgctxt "Current status of a Firewall Group"
msgid "Error"
msgstr "Erreur"
#, python-format
msgid "Failed to insert rule to policy %(name)s: %(reason)s"
msgstr "Echec d'insertion de la règle dans la stratégie %(name)s : %(reason)s"
#, python-format
msgid "Failed to remove rule from policy %(name)s: %(reason)s"
msgstr "Echec de retrait de la règle de la stratégie %(name)s : %(reason)s"
#, python-format
msgid "Failed to retrieve available rules: %s"
msgstr "Impossible de récupérer les règles disponibles : %s"
#, python-format
msgid "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgstr ""
"Échec de la récupération des règles courantes de la stratégie %(name)s : "
"%(reason)s"
#, python-format
msgid "Failed to update policy %(name)s: %(reason)s"
msgstr "Echec de mise à jour de la stratégie %(name)s : %(reason)s"
#, python-format
msgid "Failed to update rule %(name)s: %(reason)s"
msgstr "Échec de la mise à jour de la règle %(name)s : %(reason)s"
msgid "Firewall Policies"
msgstr "Stratégies de pare-feu"
msgid "Firewall Rules"
msgstr "Règles de pare-feu"
msgid "ICMP"
msgstr "ICMP"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "Version d'IP"
msgid "IP Version for Firewall Rule"
msgstr "Version d'IP pour la règle de pare-feu"
msgctxt "Current status of a Firewall Group"
msgid "Inactive"
msgstr "Inactif"
msgid "Ingress Policy"
msgstr "Stratégie entrante"
msgid "Insert Rule"
msgstr "Insérer une règle"
msgid "Insert Rule to Policy"
msgstr "Insérer une règle dans la stratégie"
msgid "Name"
msgstr "Nom"
msgid "None"
msgstr "Aucun"
msgctxt "Current status of a Firewall Group"
msgid "Pending Create"
msgstr "Création en attente"
msgctxt "Current status of a Firewall Group"
msgid "Pending Delete"
msgstr "Suppression en attente"
msgctxt "Current status of a Firewall Group"
msgid "Pending Update"
msgstr "Mise à jour en attente"
msgid "Policies"
msgstr "Stratégies"
msgid "Policy"
msgstr "Stratégie"
#, python-format
msgid "Policy %s was successfully updated."
msgstr "La stratégie %s a été mise à jour."
msgid "Ports"
msgstr "Ports"
msgid "Project ID"
msgstr "Project ID"
msgid "Protocol"
msgstr "Protocole"
msgid "Protocol for the firewall rule"
msgstr "Protocole pour la règle de pare-feu"
msgid "REJECT"
msgstr "REJETER"
msgctxt "Action Name of a Firewall Rule"
msgid "REJECT"
msgstr "REJETER"
msgid "Remove Port"
msgstr "Supprimer le port"
msgid "Remove Rule"
msgstr "Retirer la règle"
msgid "Remove Rule from Policy"
msgstr "Retirer une règle de la stratégie"
msgid "Rule"
msgstr "Règle"
#, python-format
msgid "Rule %(rule)s was successfully inserted to policy %(policy)s."
msgstr "La règle %(rule)s a été insérée dans la stratégie %(policy)s."
#, python-format
msgid "Rule %(rule)s was successfully removed from policy %(policy)s."
msgstr "La règle %(rule)s a été retirée de la stratégie %(policy)s."
#, python-format
msgid "Rule %s was successfully updated."
msgstr "La règle %s a été mise à jour."
msgid "Rules"
msgstr "Règles"
msgid "Save Changes"
msgstr "Enregistrer les changements"
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
msgstr[0] "Suppression planifiée de la stratégie"
msgstr[1] "Suppression planifiée des stratégies"
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
msgstr[0] "Suppression planifiée de la règle"
msgstr[1] "Suppression planifiée des règles"
msgid "Select a Policy"
msgstr "Sélectionner une stratégie"
msgid "Select rules for your policy."
msgstr "Sélectionnez des règles pour votre stratégie."
msgid "Selected Rules"
msgstr "Règles sélectionnées"
msgid "Shared"
msgstr "Partagé"
msgid "Source IP"
msgstr "IP source"
msgid "Source IP Address"
msgstr "Adresse IP source"
msgid "Source IP Address/Subnet"
msgstr "Adresse IP/Sous-réseau source"
msgid "Source IP address or subnet"
msgstr "Adresse IP ou sous-réseau source"
msgid "Source Port"
msgstr "Port source"
msgid "Source Port/Port Range"
msgstr "Port/plage de ports source"
msgid "Source port (integer in [1, 65535] or range in a:b)"
msgstr "Port source (entier compris dans [1,65535] ou plage a:b)"
msgid ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgstr ""
"La version d'IP et l'adresse réseau source/de destination ne sont pas "
"cohérentes. Corrigez-les en conséquence."
msgid "Status"
msgstr "Statut"
msgid "TCP"
msgstr "TCP"
msgid "UDP"
msgstr "UDP"
msgctxt "Admin state of a Firewall Group"
msgid "UP"
msgstr "ACTIF"
#, python-format
msgid "Unable to add Policy \"%s\"."
msgstr "Impossible d'ajouter la stratégie \"%s\"."
#, python-format
msgid "Unable to add Rule \"%s\"."
msgstr "Impossible d'ajouter la règle \"%s\"."
#, python-format
msgid "Unable to delete policy. %s"
msgstr "Impossible de supprimer la stratégie. %s"
#, python-format
msgid "Unable to delete rule. %s"
msgstr "Impossible de supprimer la règle %s"
msgid "Unable to retrieve policies list."
msgstr "Impossible de récupérer la liste des stratégies."
msgid "Unable to retrieve policy details."
msgstr "Impossible de récupérer les détails de la stratégie."
#, python-format
msgid "Unable to retrieve policy list (%s)."
msgstr "Impossible de récupérer la liste des stratégies (%s)."
msgid "Unable to retrieve policy list."
msgstr "Impossible de récupérer la liste des stratégies."
#, python-format
msgid "Unable to retrieve ports (%s)."
msgstr "Impossible de récupérer les ports (%s)."
msgid "Unable to retrieve rule details."
msgstr "Impossible de récupérer les détails de la règle."
#, python-format
msgid "Unable to retrieve rules (%s)."
msgstr "Impossible de récupérer les règles (%s)."
msgid "Unable to retrieve rules list."
msgstr "Impossible de récupérer la liste des règles."
msgid "You may update rule details here."
msgstr "Ici, vous pouvez mettre à jour les détails de la règle."

View File

@ -1,637 +0,0 @@
# OpenStack Infra <zanata@openstack.org>, 2015. #zanata
# Andreas Jaeger <jaegerandi@gmail.com>, 2016. #zanata
# suhartono <cloudsuhartono@gmail.com>, 2016. #zanata
# suhartono <cloudsuhartono@gmail.com>, 2017. #zanata
# suhartono <cloudsuhartono@gmail.com>, 2018. #zanata
# Frank Kloeker <eumel@arcor.de>, 2019. #zanata
# suhartono <cloudsuhartono@gmail.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-fwaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-03-27 14:25+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-03 11:53+0000\n"
"Last-Translator: Frank Kloeker <eumel@arcor.de>\n"
"Language-Team: Indonesian\n"
"Language: id\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
msgid "-"
msgstr "-"
msgid "ALLOW"
msgstr "ALLOW"
msgctxt "Action Name of a Firewall Rule"
msgid "ALLOW"
msgstr "ALLOW (mengizinkan)"
msgid "ANY"
msgstr "ANY"
msgid "Action"
msgstr "Action"
msgid "Action for the firewall rule"
msgstr "Aksi aturan firewall"
msgctxt "Current status of a Firewall Group"
msgid "Active"
msgstr "Active"
msgid "Add"
msgstr "Menambahkan"
msgid "Add Firewall Group"
msgstr "Menambahkan Firewall Group"
msgid "Add New Firewall Group"
msgstr "Add New Firewall Group"
msgid "Add New Policy"
msgstr "Menambah kebijakan baru"
msgid "Add New Rule"
msgstr "Menambah aturan baru"
msgid "Add Policy"
msgstr "Add Policy (tambahkan kebiijakan)"
msgid "Add Port"
msgstr "Add Port"
msgid "Add Port to Firewall Group"
msgstr "Tambahkan Port ke Firewall Group"
msgid "Add Rule"
msgstr "Tambahkan Aturan"
msgid "Add port to Firewall Group {{ name }}"
msgstr "Tambahkan port ke Firewall Group {{ name }}"
#, python-format
msgid "Added Firewall Group\"%s\"."
msgstr "Ditambahkan Firewall Group\"%s\"."
#, python-format
msgid "Added Policy \"%s\"."
msgstr "Kebijakan ditambahkan \"%s\"."
#, python-format
msgid "Added Rule \"%s\"."
msgstr "Aturan ditambahkan \"%s\"."
#, python-format
msgid "Added the port(s) to the firewall group %s successfully."
msgstr "Berhasil menambahkan port ke grup firewall %s."
msgid "Admin State"
msgstr "Admin State"
msgid "Admin State Up"
msgstr "Admin State Up"
msgid "After"
msgstr "After (sesudah)"
msgid "Audited"
msgstr "Audited"
msgid "Available Ports"
msgstr "Available Ports"
msgid "Available Rules"
msgstr "Available Rules"
msgid "Before"
msgstr "Before (sebelum)"
msgid "Choose port(s) from Available Ports. "
msgstr "Pilih port dari Available Ports. "
msgid ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgstr ""
"Pilih aturan dari Available Rules ke Selected Rule dengan menekan tombol "
"atau seret dan lepaskan, Anda dapat mengubah pesanan mereka dengan drag dan "
"drop juga."
msgid ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgstr ""
"Pilih aturan yang ingin Anda sisipkan. Tentukan baik aturan yang ingin Anda "
"masukkan segera sebelumnya, atau aturan untuk memasukkan segera setelahnya. "
"Jika keduanya ditentukan, sebelumnya diutamakan."
msgid "Choose the rule you want to remove."
msgstr "Pilih aturan yang ingin Anda hapus."
msgid "Create Firewall Group"
msgstr "Membuat Firewall Group"
msgid "Create a Firewall Group with selected ports."
msgstr "Buat Firewall Group dengan port yang dipilih."
msgid ""
"Create a firewall group based on a policy.\n"
"\n"
"A firewall group represents a logical firewall resource that a tenant can "
"instantiate and manage. A firewall group must be associated with one policy, "
"all other fields are optional."
msgstr ""
"Buat grup firewall berdasarkan kebijakan.\n"
"\n"
"Grup firewall mewakili sumber daya firewall logis dimana tenant dapat "
"instantiate dan kelola. Grup firewall harus dikaitkan dengan satu kebijakan, "
"semua bidang lainnya opsional."
msgid ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgstr ""
"Membuat kebijakan firewall dengan daftar aturan firewall tersusun "
"berurutan.\n"
"\n"
"Sebuah kebijakan firewall adalah koleksi aturan firewall berurutan. Jadi "
"jika lalu lintas sesuai dengan aturan pertama, maka aturan lain tidak "
"dieksekusi. Jika lalu lintas tidak sesuai dengan aturan saat ini, maka "
"aturan berikutnya dieksekusi. Sebuah kebijakan firewall memiliki atribut "
"sebagai berikut:\n"
"\n"
"<li>Shared: Sebuah kebijakan firewall dapat digunakan bersama seluruh "
"penyewa (tenant). Dengan demikian kebijakan itu dapat juga menjadi bagian "
"dari alur kerja pemeriksaan dimana kebijakan firewall dapat diaudit oleh "
"entitas terkait yang berwenang.</li><li>Audited: Ketika diaudit diatur ke "
"True, ini menunjukkan bahwa kebijakan firewall telah diaudit. Setiap kali "
"kebijakan firewall atau aturan firewall yang terkait berubah, atribut ini "
"akan diatur ke False dan harus secara eksplisit diatur ke True melalui "
"operasi update.</li>\n"
"Kolom (field) nama diperlukan, semua yang lain adalah opsional."
msgid ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgstr ""
"Buat aturan firewall\n"
"\n"
"Aturan firewall adalah sebuah asosiasi atribut berikut:\n"
"\n"
"<li>IP Addresses: Alamat dari/ke dimana filtrasi lalu lintas perlu "
"diterapkan.</li><li>IP Version: Tipe paket IP (IP V4/V6) yang perlu disaring."
"</li><li>Protocol: Tipe paket (UDP, ICMP, TCP, lainnya) yang perlu diperiksa."
"</li><li>Action: Action adalah tipe filtrasi diperlukan, dapat Reject/Deny/"
"Allow paket data.</li>\n"
"Protokol dan action field (kolom aksi) yang diperlukan, semua yang lain "
"adalah opsional."
msgid "Create a policy with selected rules."
msgstr "Membuat kebijakan dengan aturan yang dipilih."
msgctxt "Current status of a Firewall Group"
msgid "Created"
msgstr "Created"
msgid "DENY"
msgstr "DENY (menyangkal)"
msgctxt "Action Name of a Firewall Rule"
msgid "DENY"
msgstr "DENY (menyangkal)"
msgctxt "Admin state of a Firewall Group"
msgid "DOWN"
msgstr "DOWN"
msgid "Delete Firewall Group"
msgid_plural "Delete Firewall Groups"
msgstr[0] "Delete Firewall Group"
msgid "Delete Policy"
msgid_plural "Delete Policies"
msgstr[0] "Delete Policy"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Delete Rule"
msgid "Description"
msgstr "Deskripsi"
msgid "Description:"
msgstr "Deskripsi:"
msgid "Destination IP"
msgstr "IP Tujuan"
msgid "Destination IP Address"
msgstr "Destination IP Address"
msgid "Destination IP Address/Subnet"
msgstr "Tujuan subnet/alamat IP"
msgid "Destination IP address or subnet"
msgstr "Tujuan subnet atau alamat IP"
msgid "Destination Port"
msgstr "Port Tujuan"
msgid "Destination Port/Port Range"
msgstr "Destination Port/Port Range (tujuan port/ kisaran port)"
msgid "Destination port (integer in [1, 65535] or range in a:b)"
msgstr ""
"Destination (tujuan) port (integer dalam [1, 65535] atau dalam kisaran a:b)"
msgctxt "Current status of a Firewall Group"
msgid "Down"
msgstr "Down"
msgid "Edit Firewall Group"
msgstr "Edit Firewall Group"
msgid "Edit FirewallGroup {{ name }}"
msgstr "Edit FirewallGroup {{ name }}"
msgid "Edit Policy"
msgstr "Ubah Kebijakan"
msgid "Edit Policy {{ name }}"
msgstr "Edit Policy {{ name }}"
msgid "Edit Rule"
msgstr "Ubah Aturan"
msgid "Edit Rule {{ name }}"
msgstr "Edit Rule {{ name }}"
msgid "Egress Policy"
msgstr "Egress Policy"
msgid "Egress Policy ID"
msgstr "Egress Policy ID"
msgid "Enabled"
msgstr "Enabled (aktif)"
msgctxt "Current status of a Firewall Group"
msgid "Error"
msgstr "Error"
#, python-format
msgid "Failed to add the port(s) to the firewall group %(name)s: %(reason)s"
msgstr "Gagal menambahkan port(s) ke firewall group %(name)s: %(reason)s"
#, python-format
msgid "Failed to insert rule to policy %(name)s: %(reason)s"
msgstr "Gagal untuk memasukkan aturan kebijakan %(name)s: %(reason)s"
#, python-format
msgid "Failed to remove rule from policy %(name)s: %(reason)s"
msgstr "Gagal menghapus aturan dari kebijakan %(name)s: %(reason)s"
#, python-format
msgid ""
"Failed to remove the port(s) from the firewall group %(name)s: %(reason)s"
msgstr "Gagal menghapus port(s) dari firewall group %(name)s: %(reason)s"
#, python-format
msgid "Failed to retrieve available rules: %s"
msgstr "Gagal mengambil aturan yang tersedia: %s"
#, python-format
msgid "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgstr "Gagal mengambil aturan saat ini dalam kebijakan %(name)s: %(reason)s"
msgid "Failed to retrieve port list of the firewall group."
msgstr "Gagal mengambil daftar port dari grup firewall."
#, python-format
msgid "Failed to update firewall group %(name)s: %(reason)s"
msgstr "Gagal memperbarui grup firewall %(name)s: %(reason)s"
#, python-format
msgid "Failed to update policy %(name)s: %(reason)s"
msgstr "Gagal memperbarui kebijakan %(name)s: %(reason)s"
#, python-format
msgid "Failed to update rule %(name)s: %(reason)s"
msgstr "Gagal memperbarui aturan %(name)s: %(reason)s"
msgid "Firewall Groups"
msgstr "Firewall Groups"
msgid "Firewall Policies"
msgstr "Firewall Policies (kebijakan firewall)"
msgid "Firewall Rules"
msgstr " Firewall Rules (aturan firewall)"
#, python-format
msgid "Firewall group %s was successfully updated."
msgstr "Grup firewall %s berhasil diperbarui."
msgid "FirewallGroup"
msgstr "FirewallGroup"
msgid "ICMP"
msgstr "ICMP"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP Version"
msgid "IP Version for Firewall Rule"
msgstr "IP Version untuk Firewall Rule"
msgctxt "Current status of a Firewall Group"
msgid "Inactive"
msgstr "Inactive"
msgid "Ingress Policy"
msgstr "Ingress Policy"
msgid "Ingress Policy ID"
msgstr "Ingress Policy ID"
msgid "Insert Rule"
msgstr "Insert Rule (menyisipkan aturan)"
msgid "Insert Rule to Policy"
msgstr "Sisipkan aturan ke kebijakan"
msgid "Label"
msgstr "Label"
msgid "Name"
msgstr "Name"
msgid "No options available"
msgstr "Tidak ada opsi yang tersedia"
msgid "None"
msgstr "None"
msgctxt "Current status of a Firewall Group"
msgid "Pending Create"
msgstr "Pending Create"
msgctxt "Current status of a Firewall Group"
msgid "Pending Delete"
msgstr "Pending Delete"
msgctxt "Current status of a Firewall Group"
msgid "Pending Update"
msgstr "Pending Update"
msgid "Policies"
msgstr "Kebijakan"
msgid "Policy"
msgstr "Policy (kebijakan)"
#, python-format
msgid "Policy %s was successfully updated."
msgstr "Kebijakan %s telah berhasil diperbarui."
msgid "Ports"
msgstr "Ports"
msgid "Project ID"
msgstr "Project ID"
msgid "Protocol"
msgstr "Protocol"
msgid "Protocol for the firewall rule"
msgstr "Protokol untuk aturan firewall"
msgid "REJECT"
msgstr "REJECT (menolak)"
msgctxt "Action Name of a Firewall Rule"
msgid "REJECT"
msgstr "REJECT (menolak)"
msgid "Remove Port"
msgstr "Remove Port"
msgid "Remove Port from Firewall Group"
msgstr "Hapus Port dari Firewall Group"
msgid "Remove Rule"
msgstr "Remove Rule (hapus aturan)"
msgid "Remove Rule from Policy"
msgstr "Buang aturan dari kebijakan"
msgid "Remove port from FirewallGroup {{ name }}"
msgstr "Hapus port dari FirewallGroup {{ name }}"
#, python-format
msgid "Removed the port(s) from the firewall group %s successfully."
msgstr "Port berhasil dihapus dari firewall group %s ."
msgid "Rule"
msgstr "Aturan"
#, python-format
msgid "Rule %(rule)s was successfully inserted to policy %(policy)s."
msgstr "Aturan %(rule)s berhasil dimasukkan ke kebijakan %(policy)s."
#, python-format
msgid "Rule %(rule)s was successfully removed from policy %(policy)s."
msgstr "Aturan %(rule)s berhasil dihapus dari kebijakan %(policy)s."
#, python-format
msgid "Rule %s was successfully updated."
msgstr "Aturan %s telah berhasil diperbarui."
msgid "Rules"
msgstr "Aturan"
msgid "Save Changes"
msgstr "Simpan perubahan"
msgid "Scheduled deletion of Firewall Group"
msgid_plural "Scheduled deletion of Firewall Groups"
msgstr[0] "Scheduled deletion of Firewall Group"
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
msgstr[0] "Scheduled deletion of Policy"
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
msgstr[0] "Scheduled deletion of Rule"
msgid "Select a Policy"
msgstr "Pilih kebijakan "
msgid "Select ports for your firewall group."
msgstr "Pilih port untuk grup firewall Anda."
msgid "Select rules for your policy."
msgstr "Pilih aturan untuk kebijakan Anda."
msgid "Selected Ports"
msgstr "Selected Ports"
msgid "Selected Rules"
msgstr "Selected Rules"
msgid "Shared"
msgstr "Shared"
msgid "Source IP"
msgstr "Source IP (IP sumber)"
msgid "Source IP Address"
msgstr "Source IP Address"
msgid "Source IP Address/Subnet"
msgstr "Source (asal) subnet/alamat IP"
msgid "Source IP address or subnet"
msgstr "Source (asal) subnet atau alamat IP"
msgid "Source Port"
msgstr "Port Sumber"
msgid "Source Port/Port Range"
msgstr "Source Port/Port Range (asal port/ kisaran port)"
msgid "Source port (integer in [1, 65535] or range in a:b)"
msgstr "Source (asal) port (integer dalam [1, 65535] atau dalam kisaran a:b)"
msgid ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgstr ""
"Sumber/tujuan alamat jaringan dan IP versi tidak konsisten. Harap membuat "
"mereka konsisten."
msgid "Status"
msgstr "Status"
msgid "TCP"
msgstr "TCP"
msgid "UDP"
msgstr "UDP"
msgctxt "Admin state of a Firewall Group"
msgid "UP"
msgstr "UP"
#, python-format
msgid "Unable to add Firewall Group \"%s\"."
msgstr "Tidak dapat menambahkan Firewall Group \"%s\"."
#, python-format
msgid "Unable to add Policy \"%s\"."
msgstr "Tidak dapat menambahkan kebijakan \"%s\"."
#, python-format
msgid "Unable to add Rule \"%s\"."
msgstr "Tidak dapat menambahkan Aturan \"%s\"."
#, python-format
msgid "Unable to delete firewall group. %s"
msgstr "Tidak dapat menghapus firewall group. %s"
#, python-format
msgid "Unable to delete policy. %s"
msgstr "Tidak dapat menghapus kebijakan. %s"
#, python-format
msgid "Unable to delete rule. %s"
msgstr "Tidak dapat menghapus aturan. %s"
msgid "Unable to retrieve firewall group details."
msgstr "Tidak dapat mengambil detail grup firewall."
msgid "Unable to retrieve firewall group list."
msgstr "Tidak dapat mengambil daftar grup firewall."
msgid "Unable to retrieve firewallgroup details."
msgstr "Tidak dapat mengambil rincian firewallgroup."
msgid "Unable to retrieve policies list."
msgstr "Tidak dapat mengambil daftar kebijakan."
msgid "Unable to retrieve policy details."
msgstr "Tidak dapat mengambil rincian kebijakan."
#, python-format
msgid "Unable to retrieve policy list (%s)."
msgstr "Tidak dapat mengambil daftar kebijakan (%s)."
msgid "Unable to retrieve policy list."
msgstr "Tidak dapat mengambil daftar kebijakan."
#, python-format
msgid "Unable to retrieve ports (%s)."
msgstr "Tidak dapat mengambil port (%s)."
msgid "Unable to retrieve rule details."
msgstr "Tidak dapat mengambil rincian aturan."
#, python-format
msgid "Unable to retrieve rules (%s)."
msgstr "Tidak dapat mengambil peraturan (%s)."
msgid "Unable to retrieve rules list."
msgstr "Tidak dapat mengambil daftar aturan."
msgid "Value"
msgstr "Value"
msgid "You may add ports to firewall group here."
msgstr "Anda dapat menambahkan port ke grup firewall di sini."
msgid "You may remove ports from firewall group here."
msgstr "Anda dapat menghapus port dari grup firewall di sini."
msgid "You may update firewall group details here."
msgstr "Anda dapat memperbarui rincian grup firewall di sini."
msgid ""
"You may update policy details here. Use 'Insert Rule' or 'Remove Rule' links "
"instead to insert or remove a rule."
msgstr ""
"Anda dapat memperbarui rincian kebijakan di sini. Gunakan tautan 'Insert "
"Rule' atau 'Remove Rule' sebagai gantinya untuk memasukkan atau menghapus "
"aturan."
msgid "You may update rule details here."
msgstr "Anda dapat memperbarui detail aturan di sini."

View File

@ -1,633 +0,0 @@
# Akihiro Motoki <amotoki@gmail.com>, 2017. #zanata
# Yuko Katabami <yukokatabami@gmail.com>, 2018. #zanata
# Takashi Kuroda <tkuroda@redhat.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-fwaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-03-19 10:41+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-03-20 03:16+0000\n"
"Last-Translator: Takashi Kuroda <tkuroda@redhat.com>\n"
"Language-Team: Japanese\n"
"Language: ja\n"
"X-Generator: Zanata 4.3.3\n"
"Plural-Forms: nplurals=1; plural=0\n"
msgid "-"
msgstr "-"
msgid "ALLOW"
msgstr "ALLOW"
msgctxt "Action Name of a Firewall Rule"
msgid "ALLOW"
msgstr "ALLOW"
msgid "ANY"
msgstr "ANY"
msgid "Action"
msgstr "アクション"
msgid "Action for the firewall rule"
msgstr "ファイアウォールルールのアクション"
msgctxt "Current status of a Firewall Group"
msgid "Active"
msgstr "稼働中"
msgid "Add"
msgstr "追加"
msgid "Add Firewall Group"
msgstr "ファイアウォールグループの追加"
msgid "Add New Firewall Group"
msgstr "ファイアウォールグループの追加"
msgid "Add New Policy"
msgstr "ポリシーの追加"
msgid "Add New Rule"
msgstr "ルールの追加"
msgid "Add Policy"
msgstr "ポリシーの追加"
msgid "Add Port"
msgstr "ポートの追加"
msgid "Add Port to Firewall Group"
msgstr "ファイアウォールグループへのポートの追加"
msgid "Add Rule"
msgstr "ルールの追加"
msgid "Add port to Firewall Group {{ name }}"
msgstr "ファイアウォールグループ {{ name }} へのポートの追加"
#, python-format
msgid "Added Firewall Group\"%s\"."
msgstr "ファイアウォールグループ \"%s\" を追加しました。"
#, python-format
msgid "Added Policy \"%s\"."
msgstr "ポリシー \"%s\" を追加しました。"
#, python-format
msgid "Added Rule \"%s\"."
msgstr "ルール \"%s\" を追加しました。"
#, python-format
msgid "Added the port(s) to the firewall group %s successfully."
msgstr "ポートを正常にファイアウォールグループ %s に追加しました。"
msgid "Admin State"
msgstr "管理状態"
msgid "Admin State Up"
msgstr "管理状態有効"
msgid "After"
msgstr "後に挿入"
msgid "Audited"
msgstr "監査対象 (Audited)"
msgid "Available Ports"
msgstr "利用可能なポート"
msgid "Available Rules"
msgstr "利用可能なルール"
msgid "Before"
msgstr "前に挿入"
msgid "Choose port(s) from Available Ports. "
msgstr "以下の利用可能なポートからポートを選択してください。"
msgid ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgstr ""
"利用可能なルールから選択済みルールに、ボタンを押すかドラッグアンドドロップす"
"ることでルールを選択します。ドラッグアンドドロップでルールの順番を変更するこ"
"ともできます。"
msgid ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgstr ""
"挿入するルールを選択してください。ルールをどのルールの直前、または直後に挿入"
"するかを指定してください。両方指定した場合は指定したルールの直前に挿入されま"
"す。"
msgid "Choose the rule you want to remove."
msgstr "削除するルールを選択してください。"
msgid "Create Firewall Group"
msgstr "ファイアウォールグループの作成"
msgid "Create a Firewall Group with selected ports."
msgstr "ポートを選択してファイアウォールグループを作成します。"
msgid ""
"Create a firewall group based on a policy.\n"
"\n"
"A firewall group represents a logical firewall resource that a tenant can "
"instantiate and manage. A firewall group must be associated with one policy, "
"all other fields are optional."
msgstr ""
"ポリシーに基づいてファイアウォールグループを作成します。\n"
"\n"
"ファイアウォールグループは、テナントがインスタンス化して管理することのできる"
"論理的なファイアウォールリソースを表します。1 つのファイアウォールグループは "
"1 つのポリシーと関連付けられる必要があり、他のフィールドはすべて省略可能で"
"す。"
msgid ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgstr ""
"ファイアウォールルールの順序付きリストでファイアウォールポリシーを作成しま"
"す。\n"
"\n"
"ファイアウォールポリシーは、ファイアウォールルールの順序付きコレクションなの"
"で、トラフィックが最初のルールに一致した場合には、他のルールは実行されませ"
"ん。トラフィックが現在のルールに一致しない場合には、次のルールが実行されま"
"す。ファイアウォールポリシーには、以下の属性があります。\n"
"\n"
"<li>共有: ファイアウォールポリシーをテナント間で共有できます。そのため、承認"
"済みの関連エンティティーによってファイアウォールポリシーを監査することができ"
"る監査ワークフローの一部にすることも可能です。</li><li>監査: 監査が True に設"
"定されている場合には、ファイアウォールポリシーが監査されることを意味します。"
"ファイアウォールポリシーまたは関連付けられたファイアウォールルールが変更され"
"るたびに、この属性は False に設定され、更新操作で明示的に True に設定する必要"
"があります。</li>\n"
"名前のフィールドは入力する必要があり、その他のフィールドはすべて省略可能で"
"す。"
msgid ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgstr ""
"ファイアウォールルールを作成します。\n"
"\n"
"ファイアウォールルールは、以下の属性の組み合わせです。\n"
"\n"
"<li>IP アドレス: トラフィックフィルターを適用する必要があるアドレス (送信元/"
"送信先) です。</li><li>IP バージョン: フィルタリングする必要がある IP パケッ"
"トの種別 (IP V4/V6) です。</li><li>プロトコル: チェックされる必要があるパケッ"
"トの種別 (UDP、ICMP、TCP、Any) です。</li><li>アクション: アクションは必要な"
"フィルターの種別で、データパケットを REJECT/DENY/ALLOW できます。</li>\n"
"プロトコルとアクションは必須項目であり、他のフィールドはすべて省略可能です。"
msgid "Create a policy with selected rules."
msgstr "ルールを選択してポリシーを作成します。"
msgctxt "Current status of a Firewall Group"
msgid "Created"
msgstr "作成済み"
msgid "DENY"
msgstr "DENY"
msgctxt "Action Name of a Firewall Rule"
msgid "DENY"
msgstr "DENY"
msgctxt "Admin state of a Firewall Group"
msgid "DOWN"
msgstr "DOWN"
msgid "Delete Firewall Group"
msgid_plural "Delete Firewall Groups"
msgstr[0] "ファイアウォールグループの削除"
msgid "Delete Policy"
msgid_plural "Delete Policies"
msgstr[0] "ポリシーの削除"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "ルールの削除"
msgid "Description"
msgstr "説明"
msgid "Description:"
msgstr "説明:"
msgid "Destination IP"
msgstr "宛先 IP アドレス"
msgid "Destination IP Address"
msgstr "宛先 IP アドレス"
msgid "Destination IP Address/Subnet"
msgstr "宛先 IP アドレス/サブネット"
msgid "Destination IP address or subnet"
msgstr "宛先 IP アドレスまたはサブネット"
msgid "Destination Port"
msgstr "宛先ポート番号"
msgid "Destination Port/Port Range"
msgstr "宛先ポート/ポートの範囲"
msgid "Destination port (integer in [1, 65535] or range in a:b)"
msgstr "宛先ポート ([1, 65535] の整数か a:b 形式の範囲)"
msgctxt "Current status of a Firewall Group"
msgid "Down"
msgstr "停止中"
msgid "Edit Firewall Group"
msgstr "ファイアウォールグループの編集"
msgid "Edit FirewallGroup {{ name }}"
msgstr "ファイアウォールグループ {{ name }} の編集"
msgid "Edit Policy"
msgstr "ポリシーの編集"
msgid "Edit Policy {{ name }}"
msgstr "ポリシー {{ name }} の編集"
msgid "Edit Rule"
msgstr "ルールの編集"
msgid "Edit Rule {{ name }}"
msgstr "ルール {{ name }} の編集"
msgid "Egress Policy"
msgstr "送信ポリシー"
msgid "Egress Policy ID"
msgstr "送信ポリシー ID"
msgid "Enabled"
msgstr "有効"
msgctxt "Current status of a Firewall Group"
msgid "Error"
msgstr "エラー"
#, python-format
msgid "Failed to add the port(s) to the firewall group %(name)s: %(reason)s"
msgstr ""
"ポートのファイアウォールグループ %(name)s への追加に失敗しました: %(reason)s"
#, python-format
msgid "Failed to insert rule to policy %(name)s: %(reason)s"
msgstr "ポリシー %(name)s へのルールの挿入に失敗しました: %(reason)s"
#, python-format
msgid "Failed to remove rule from policy %(name)s: %(reason)s"
msgstr "ポリシー %(name)s からのルールの削除に失敗しました: %(reason)s"
#, python-format
msgid ""
"Failed to remove the port(s) from the firewall group %(name)s: %(reason)s"
msgstr ""
"ポートのファイアウォールグループ %(name)s からの削除に失敗しました: "
"%(reason)s"
#, python-format
msgid "Failed to retrieve available rules: %s"
msgstr "利用可能なルールの取得に失敗しました: %s"
#, python-format
msgid "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgstr "ポリシー %(name)s の現在のルールの取得に失敗しました: %(reason)s"
msgid "Failed to retrieve port list of the firewall group."
msgstr "ファイアウォールグループのポート一覧を取得できません。"
#, python-format
msgid "Failed to update firewall group %(name)s: %(reason)s"
msgstr "ファイアウォールグループ %(name)s の更新に失敗しました: %(reason)s"
#, python-format
msgid "Failed to update policy %(name)s: %(reason)s"
msgstr "ポリシー %(name)s の更新に失敗しました: %(reason)s"
#, python-format
msgid "Failed to update rule %(name)s: %(reason)s"
msgstr "ルール %(name)s の更新に失敗しました: %(reason)s"
msgid "Firewall Groups"
msgstr "ファイアウォールグループ"
msgid "Firewall Policies"
msgstr "ファイアウォールポリシー"
msgid "Firewall Rules"
msgstr "ファイアウォールルール"
#, python-format
msgid "Firewall group %s was successfully updated."
msgstr "ファイアウォールグループ %s が正常に更新されました。"
msgid "FirewallGroup"
msgstr "ファイアウォールグループ"
msgid "ICMP"
msgstr "ICMP"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP バージョン"
msgid "IP Version for Firewall Rule"
msgstr "ファイアウォールルールの IP バージョン"
msgctxt "Current status of a Firewall Group"
msgid "Inactive"
msgstr "非稼働"
msgid "Ingress Policy"
msgstr "受信ポリシー"
msgid "Ingress Policy ID"
msgstr "受信ポリシー ID"
msgid "Insert Rule"
msgstr "ルールの挿入"
msgid "Insert Rule to Policy"
msgstr "ポリシーへのルールの挿入"
msgid "Label"
msgstr "ラベル"
msgid "Name"
msgstr "名前"
msgid "No options available"
msgstr "利用可能なオプションはありません"
msgid "None"
msgstr "なし"
msgctxt "Current status of a Firewall Group"
msgid "Pending Create"
msgstr "作成待ち"
msgctxt "Current status of a Firewall Group"
msgid "Pending Delete"
msgstr "削除待ち"
msgctxt "Current status of a Firewall Group"
msgid "Pending Update"
msgstr "更新待ち"
msgid "Policies"
msgstr "ポリシー"
msgid "Policy"
msgstr "ポリシー"
#, python-format
msgid "Policy %s was successfully updated."
msgstr "ポリシー %s が正常に更新されました。"
msgid "Ports"
msgstr "ポート"
msgid "Project ID"
msgstr "プロジェクト ID"
msgid "Protocol"
msgstr "プロトコル"
msgid "Protocol for the firewall rule"
msgstr "ファイアウォールルールのプロトコル"
msgid "REJECT"
msgstr "REJECT"
msgctxt "Action Name of a Firewall Rule"
msgid "REJECT"
msgstr "REJECT"
msgid "Remove Port"
msgstr "ポートの削除"
msgid "Remove Port from Firewall Group"
msgstr "ファイアウォールグループからのポートの削除"
msgid "Remove Rule"
msgstr "ルールの削除"
msgid "Remove Rule from Policy"
msgstr "ポリシーからのルールの削除"
msgid "Remove port from FirewallGroup {{ name }}"
msgstr "ファイアウォールグループ {{ name }} からのポートの削除"
#, python-format
msgid "Removed the port(s) from the firewall group %s successfully."
msgstr "ポートを正常にファイアウォールグループ %s から削除しました。"
msgid "Rule"
msgstr "ルール"
#, python-format
msgid "Rule %(rule)s was successfully inserted to policy %(policy)s."
msgstr "ルール %(rule)s のポリシー %(policy)s への挿入に成功しました。"
#, python-format
msgid "Rule %(rule)s was successfully removed from policy %(policy)s."
msgstr "ポリシー %(policy)s からのルール %(rule)s の削除に成功しました。"
#, python-format
msgid "Rule %s was successfully updated."
msgstr "ルール %s が正常に更新されました。"
msgid "Rules"
msgstr "ルール"
msgid "Save Changes"
msgstr "変更の保存"
msgid "Scheduled deletion of Firewall Group"
msgid_plural "Scheduled deletion of Firewall Groups"
msgstr[0] "ファイアウォールグループの削除を予約しました"
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
msgstr[0] "ポリシーの削除を予約しました"
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
msgstr[0] "ルールの削除を予約しました"
msgid "Select a Policy"
msgstr "ポリシーを選択してください"
msgid "Select ports for your firewall group."
msgstr "ファイアウォールグループを適用するポートを選択してください。"
msgid "Select rules for your policy."
msgstr "ポリシーに追加するルールの選択"
msgid "Selected Ports"
msgstr "選択済みポート"
msgid "Selected Rules"
msgstr "選択済みのルール"
msgid "Shared"
msgstr "共有"
msgid "Source IP"
msgstr "送信元 IP"
msgid "Source IP Address"
msgstr "送信元 IP アドレス"
msgid "Source IP Address/Subnet"
msgstr "送信元 IP アドレス/サブネット"
msgid "Source IP address or subnet"
msgstr "送信元 IP アドレスまたはサブネット"
msgid "Source Port"
msgstr "送信元ポート番号"
msgid "Source Port/Port Range"
msgstr "送信元ポート/ポートの範囲"
msgid "Source port (integer in [1, 65535] or range in a:b)"
msgstr "送信元ポート ([1, 65535] の整数か a:b 形式の範囲)"
msgid ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgstr ""
"送信元 / 送信先のネットワークアドレスと IP バージョンが一致していません。これ"
"らを一致させてください。"
msgid "Status"
msgstr "ステータス"
msgid "TCP"
msgstr "TCP"
msgid "UDP"
msgstr "UDP"
msgctxt "Admin state of a Firewall Group"
msgid "UP"
msgstr "UP"
#, python-format
msgid "Unable to add Firewall Group \"%s\"."
msgstr "ファイアウォールグループ \"%s\" を追加できません。"
#, python-format
msgid "Unable to add Policy \"%s\"."
msgstr "ポリシー \"%s\" を追加できません。"
#, python-format
msgid "Unable to add Rule \"%s\"."
msgstr "ルール \"%s\" を追加できません。"
#, python-format
msgid "Unable to delete firewall group. %s"
msgstr "ファイアウォールグループを削除できません: %s"
#, python-format
msgid "Unable to delete policy. %s"
msgstr "ポリシーを削除できません: %s"
#, python-format
msgid "Unable to delete rule. %s"
msgstr "ルールを削除できません: %s"
msgid "Unable to retrieve firewall group details."
msgstr "ファイアウォールグループの詳細を取得できません。"
msgid "Unable to retrieve firewall group list."
msgstr "ファイアウォールグループの一覧を取得できません。"
msgid "Unable to retrieve firewallgroup details."
msgstr "ファイアウォールグループの詳細を取得できません。"
msgid "Unable to retrieve policies list."
msgstr "ポリシー一覧を取得できません。"
msgid "Unable to retrieve policy details."
msgstr "ポリシーの詳細を取得できません。"
#, python-format
msgid "Unable to retrieve policy list (%s)."
msgstr "ポリシー覧を取得できません (%s)"
msgid "Unable to retrieve policy list."
msgstr "ポリシー一覧を取得できません。"
#, python-format
msgid "Unable to retrieve ports (%s)."
msgstr "ポートを取得できません (%s)"
msgid "Unable to retrieve rule details."
msgstr "ルールの詳細を取得できません。"
#, python-format
msgid "Unable to retrieve rules (%s)."
msgstr "ルール一覧を取得できません (%s)"
msgid "Unable to retrieve rules list."
msgstr "ルール一覧を取得できません。"
msgid "Value"
msgstr "値"
msgid "You may add ports to firewall group here."
msgstr "ファイアウォールグループにポートを追加できます。"
msgid "You may remove ports from firewall group here."
msgstr "ファイアウォールグループからポートを削除できます。"
msgid "You may update firewall group details here."
msgstr "ファイアウォールグループの詳細をここから更新できます。"
msgid ""
"You may update policy details here. Use 'Insert Rule' or 'Remove Rule' links "
"instead to insert or remove a rule."
msgstr ""
"ポリシーの詳細をここから更新できます。ルールの挿入、削除はここではなく「ルー"
"ルの挿入」「ルールの削除」を使ってください。"
msgid "You may update rule details here."
msgstr "ルールの詳細をここから更新できます。"

View File

@ -1,661 +0,0 @@
# Andrea Young Oak Li <youli@redhat.com>, 2016. #zanata
# Andreas Jaeger <jaegerandi@gmail.com>, 2016. #zanata
# Eunseop Shin <kairos9603@khu.ac.kr>, 2016. #zanata
# Ian Y. Choi <ianyrchoi@gmail.com>, 2016. #zanata
# Sungjin Kang <gang.sungjin@gmail.com>, 2016. #zanata
# ByungYeol Woo <wby1089@gmail.com>, 2017. #zanata
# Ian Y. Choi <ianyrchoi@gmail.com>, 2017. #zanata
# Sungjin Kang <gang.sungjin@gmail.com>, 2017. #zanata
# minwook-shin <minwook0106@gmail.com>, 2017. #zanata
# Ian Y. Choi <ianyrchoi@gmail.com>, 2018. #zanata
# Sungjin Kang <gang.sungjin@gmail.com>, 2018. #zanata
# ByungYeol Woo <wby1089@gmail.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-fwaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-02-19 16:16+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-03-05 12:40+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 "-"
msgstr "-"
msgid "ALLOW"
msgstr "ALLOW"
msgctxt "Action Name of a Firewall Rule"
msgid "ALLOW"
msgstr "ALLOW"
msgid "ANY"
msgstr "ANY"
msgid "Action"
msgstr "Action"
msgid "Action for the firewall rule"
msgstr "방화벽 규칙 작업"
# auto translated by TM merge from project: neutron-lbaas-dashboard, version: stable-pike, DocId: neutron_lbaas_dashboard/locale/djangojs
msgctxt "Current status of a Firewall Group"
msgid "Active"
msgstr "Active"
# auto translated by TM merge from project: horizon, version: master, DocId: horizon/locale/djangojs
msgid "Add"
msgstr "추가"
msgid "Add Firewall Group"
msgstr "방화벽 그룹 추가"
msgid "Add New Firewall Group"
msgstr "방화벽 그룹 추가"
msgid "Add New Policy"
msgstr "새로운 정책 추가"
msgid "Add New Rule"
msgstr "새로운 규칙 추가"
msgid "Add Policy"
msgstr "정책 추가"
msgid "Add Port"
msgstr "포트 추가"
msgid "Add Port to Firewall Group"
msgstr "방화벽 그룹에 포트 추가"
msgid "Add Rule"
msgstr "규칙 추가"
msgid "Add port to Firewall Group {{ name }}"
msgstr "방화벽 그룹 {{ name }}에 포트 추가"
#, python-format
msgid "Added Firewall Group\"%s\"."
msgstr "방화벽 그룹 \"%s\"를 추가하였습니다."
#, python-format
msgid "Added Policy \"%s\"."
msgstr "정책 \"%s\"를 추가하였습니다.:"
#, python-format
msgid "Added Rule \"%s\"."
msgstr "규칙 \"%s\"를 추가하였습니다."
#, python-format
msgid "Added the port(s) to the firewall group %s successfully."
msgstr "성공적으로 방화벽 그룹 %s에 포트가 추가되었습니다."
msgid "Admin State"
msgstr "관리 상태"
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "Admin State Up"
msgstr "관리자 업 상태"
msgid "After"
msgstr "이후"
msgid "Audited"
msgstr "상태 확인"
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "Available Ports"
msgstr "사용 가능한 포트"
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "Available Rules"
msgstr "사용 가능한 규칙"
msgid "Before"
msgstr "이전"
msgid "Choose port(s) from Available Ports. "
msgstr "사용 가능한 포트에서 포트를 선택합니다."
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgstr ""
"사용 가능한 규칙에서 선택한 규칙에 버튼을 누르거나 드래그 앤 드롭하여 규칙을 "
"선택합니다. 드래그 앤 드롭으로 규칙 순서를 변경할 수 있습니다."
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgstr ""
"삽입할 규칙을 선택합니다. 바로 앞에 삽입할 규칙인지, 바로 뒤에 삽입할 규칙인"
"지를 정해야합니다. 양 쪽 모두 지정하면, 앞에 있는 것이 우선 순위가 높습니다."
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "Choose the rule you want to remove."
msgstr "제거할 규칙을 선택하세요."
msgid "Create Firewall Group"
msgstr "방화벽 그룹 생성"
msgid "Create a Firewall Group with selected ports."
msgstr "선택한 포트와 함께 방화벽 그룹을 생성합니다."
msgid ""
"Create a firewall group based on a policy.\n"
"\n"
"A firewall group represents a logical firewall resource that a tenant can "
"instantiate and manage. A firewall group must be associated with one policy, "
"all other fields are optional."
msgstr ""
"정책에 기반하여 방화벽 그룹을 생성합니다.\n"
"\n"
"방화벽 그룹은 tenant가 인스턴스화하고 관리할 수 있는 논리적인 방화벽 자원을 "
"나타냅니다. 방화벽 그룹은 반드시 한 정책과 연결되어야 하며, 그 외 다른 필드들"
"은 선택 사항입니다."
msgid ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgstr ""
"방화벽 정책을 방화벽 규칙에 대한 정렬된 목록과 함께 생성합니다.\n"
"\n"
"방화벽 정책은 특정 순서의 방화벽 규칙 모음입니다. 따라서 트래픽이 첫 번째 규"
"칙과 매칭되는 경우, 다른 규칙들은 실행되지 않습니다. 트래픽이 현재 규칙과 매"
"칭이 되지 않는 경우에는, 다음 규칙이 실행됩니다. 방화벽 정책은 다음 속성을 가"
"집니다:\n"
"\n"
"<li>Shared: 방화벽 정책은 tenant에 걸쳐 공유될 수 있습니다. 따라서 이는 방화"
"벽 정책이 인증된 관련 엔티티에 의해 감사가 이루어지는 감사 워크플로우의 일부"
"가 될 수 있습니다.</li><li>Audited: 해당 속성이 True로 설정되면, 해당 방화벽 "
"정책에 대해 감사가 이루어졌음을 가리킵니다. 방화벽 정책 또는 연관된 방화벽 규"
"칙이 변경될 때마다 해당 속성은 False로 설정된 후 업데이트 작업이 이루어진 다"
"음 명확히 True로 설정될 것입니다.</li>\n"
"name 필드는 필수이며, 그 외는 선택 사항입니다."
msgid ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgstr ""
"방화벽 규칙을 생성합니다.\n"
"\n"
"방화벽 규칙은 다음과 같은 속성이 있습니다:\n"
"\n"
"<li>IP 주소: 트래픽 필터링이 적용되어야 하는 들어오는/나가는 주소입니다.</"
"li><li>IP 버전: 필터링을 필요로 하는 IP 패킷에 대한 유형입니다 (IP V4/V6).</"
"li><li>프로토콜: 확인될 필요가 있는 패킷 유형입니다 (UDP, ICMP, TCP, Any).</"
"li><li>액션: 액션은 필요로 하는 필터링 유형으로, 데이터 패킷에 대해 Reject/"
"Deny/Allow 가 될 수 있습니다.</li>\n"
"프로토콜 및 애견 필드는 필수이며, 그 외는 선택 사항입니다."
msgid "Create a policy with selected rules."
msgstr "선택한 규칙에 대한 정책를 생성합니다."
# auto translated by TM merge from project: designate-dashboard, version: master, DocId: designatedashboard/locale/django
msgctxt "Current status of a Firewall Group"
msgid "Created"
msgstr "생성됨"
msgid "DENY"
msgstr "DENY"
msgctxt "Action Name of a Firewall Rule"
msgid "DENY"
msgstr "DENY"
# auto translated by TM merge from project: horizon, version: stable-mitaka, DocId: openstack_dashboard/locale/django
msgctxt "Admin state of a Firewall Group"
msgid "DOWN"
msgstr "DOWN"
msgid "Delete Firewall Group"
msgid_plural "Delete Firewall Groups"
msgstr[0] "방화벽 그룹 삭제"
msgid "Delete Policy"
msgid_plural "Delete Policies"
msgstr[0] "정책 삭제"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "규칙 삭제"
msgid "Description"
msgstr "설명"
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "Description:"
msgstr "설명:"
msgid "Destination IP"
msgstr "대상 IP"
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "Destination IP Address"
msgstr "대상 IP 주소"
msgid "Destination IP Address/Subnet"
msgstr "대상 IP 주소/서브넷"
msgid "Destination IP address or subnet"
msgstr "대상 IP 주소 또는 서브넷"
msgid "Destination Port"
msgstr "대상 포트"
msgid "Destination Port/Port Range"
msgstr "대상 포트/포트 범위"
msgid "Destination port (integer in [1, 65535] or range in a:b)"
msgstr "대상 포트 ([1, 65535] 중 정수거나 a:b 범위 내)"
# auto translated by TM merge from project: zun-ui, version: master, DocId: zun_ui/locale/djangojs
msgctxt "Current status of a Firewall Group"
msgid "Down"
msgstr "Down"
msgid "Edit Firewall Group"
msgstr "방화벽 그룹 편집"
msgid "Edit FirewallGroup {{ name }}"
msgstr "FirewallGroup {{ name }} 편집"
msgid "Edit Policy"
msgstr "정책 편집"
msgid "Edit Policy {{ name }}"
msgstr "정책 {{ name }} 편집"
msgid "Edit Rule"
msgstr "규칙 편집"
msgid "Edit Rule {{ name }}"
msgstr "{{ name }} 규칙 편집"
msgid "Egress Policy"
msgstr "Egress 정책"
msgid "Egress Policy ID"
msgstr "Egress 정책 ID"
msgid "Enabled"
msgstr "사용됨"
# auto translated by TM merge from project: neutron-lbaas-dashboard, version: master, DocId: neutron_lbaas_dashboard/locale/djangojs
msgctxt "Current status of a Firewall Group"
msgid "Error"
msgstr "오류"
#, python-format
msgid "Failed to add the port(s) to the firewall group %(name)s: %(reason)s"
msgstr "방화벽 그룹 %(name)s 에 포트 추가하기가 실패했습니다: %(reason)s"
#, python-format
msgid "Failed to insert rule to policy %(name)s: %(reason)s"
msgstr "%(name)s 정책에 규칙을 추가하지 못하였습니다.: %(reason)s"
#, python-format
msgid "Failed to remove rule from policy %(name)s: %(reason)s"
msgstr "규칙을 %(name)s 정책에서 제거하지 못하였습니다.: %(reason)s"
#, python-format
msgid ""
"Failed to remove the port(s) from the firewall group %(name)s: %(reason)s"
msgstr "방화벽 그룹 %(name)s 에 포트 제거하기가 실패했습니다: %(reason)s"
#, python-format
msgid "Failed to retrieve available rules: %s"
msgstr "사용가능한 규칙을 검색하지 못하였습니다.: %s"
#, python-format
msgid "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgstr "%(name)s 정책에서 현재 규칙을 찾지 못하였습니다.: %(reason)s"
msgid "Failed to retrieve port list of the firewall group."
msgstr "방화벽 그룹에 대한 포트 목록을 가져올 수 없습니다."
#, python-format
msgid "Failed to update firewall group %(name)s: %(reason)s"
msgstr "방화벽 그룹 %(name)s 업데이트에 실패했습니다: %(reason)s"
#, python-format
msgid "Failed to update policy %(name)s: %(reason)s"
msgstr "정책 %(name)s를 업데이트하지 못하였습니다.: %(reason)s"
#, python-format
msgid "Failed to update rule %(name)s: %(reason)s"
msgstr "%(name)s 규칙을 업데이트하지 못하였습니다.: %(reason)s"
msgid "Firewall Groups"
msgstr "방화벽 그룹"
msgid "Firewall Policies"
msgstr "방화벽 정책"
msgid "Firewall Rules"
msgstr "방화벽 규칙"
#, python-format
msgid "Firewall group %s was successfully updated."
msgstr "방화벽 그룹 %s은 성공적으로 업데이트 되었습니다."
msgid "FirewallGroup"
msgstr "FirewallGroup"
# auto translated by TM merge from project: openstack-manuals, version: stable-liberty, DocId: doc/common-rst/source/locale/common-rst
msgid "ICMP"
msgstr "ICMP"
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP 버전"
msgid "IP Version for Firewall Rule"
msgstr "방화벽 규칙에 대한 IP 버전"
# auto translated by TM merge from project: horizon, version: stable-mitaka, DocId: openstack_dashboard/locale/django
msgctxt "Current status of a Firewall Group"
msgid "Inactive"
msgstr "Inactive"
msgid "Ingress Policy"
msgstr "Ingress 정책"
msgid "Ingress Policy ID"
msgstr "Ingress 정책 ID"
msgid "Insert Rule"
msgstr "규칙 추가"
msgid "Insert Rule to Policy"
msgstr "정책에 규칙을 추가"
msgid "Label"
msgstr "레이블"
msgid "Name"
msgstr "이름"
msgid "No options available"
msgstr "사용 가능한 옵션이 없습니다"
msgid "None"
msgstr "없음"
# auto translated by TM merge from project: horizon, version: stable-mitaka, DocId: openstack_dashboard/locale/django
msgctxt "Current status of a Firewall Group"
msgid "Pending Create"
msgstr "대기중인 생성"
# auto translated by TM merge from project: horizon, version: stable-mitaka, DocId: openstack_dashboard/locale/django
msgctxt "Current status of a Firewall Group"
msgid "Pending Delete"
msgstr "대기중인 삭제"
# auto translated by TM merge from project: horizon, version: stable-mitaka, DocId: openstack_dashboard/locale/django
msgctxt "Current status of a Firewall Group"
msgid "Pending Update"
msgstr "대기중인 업데이트"
msgid "Policies"
msgstr "정책"
msgid "Policy"
msgstr "정책"
#, python-format
msgid "Policy %s was successfully updated."
msgstr "정책 %s를 성공적으로 업데이트 하였습니다."
msgid "Ports"
msgstr "포트"
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "Project ID"
msgstr "프로젝트 ID"
# auto translated by TM merge from project: zun-ui, version: master, DocId: zun_ui/locale/djangojs
msgid "Protocol"
msgstr "프로토콜"
msgid "Protocol for the firewall rule"
msgstr "방화벽 규칙 프로토콜"
msgid "REJECT"
msgstr "REJECT"
msgctxt "Action Name of a Firewall Rule"
msgid "REJECT"
msgstr "REJECT"
msgid "Remove Port"
msgstr "포트 제거"
msgid "Remove Port from Firewall Group"
msgstr "방화벽 그룹에 포트 제거"
msgid "Remove Rule"
msgstr "규칙 삭제"
msgid "Remove Rule from Policy"
msgstr "정책에서 규칙 제거"
msgid "Remove port from FirewallGroup {{ name }}"
msgstr "FirewallGroup {{ name }} 에서 포트 제거"
#, python-format
msgid "Removed the port(s) from the firewall group %s successfully."
msgstr "성공적으로 방화벽 그룹 %s에서 포트를 제거하였습니다."
msgid "Rule"
msgstr "규칙"
#, python-format
msgid "Rule %(rule)s was successfully inserted to policy %(policy)s."
msgstr "%(rule)s 규칙을 %(policy)s 정책에 성공적으로 추가하였습니다."
#, python-format
msgid "Rule %(rule)s was successfully removed from policy %(policy)s."
msgstr "%(rule)s 규칙을 %(policy)s 정책에서 성공적으로 제거하였습니다."
#, python-format
msgid "Rule %s was successfully updated."
msgstr "%s 규칙을 성공적으로 업데이트 하였습니다."
msgid "Rules"
msgstr "규칙"
msgid "Save Changes"
msgstr "변경사항 저장"
msgid "Scheduled deletion of Firewall Group"
msgid_plural "Scheduled deletion of Firewall Groups"
msgstr[0] "방화벽 그룹에 대한 예약된 삭제"
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
msgstr[0] "정책 예약 삭제"
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
msgstr[0] "규칙 예약 삭제"
msgid "Select a Policy"
msgstr "정책 선택합니다."
msgid "Select ports for your firewall group."
msgstr "방화벽 그룹에 대한 포트를 선택합니다."
msgid "Select rules for your policy."
msgstr "정책을 위해 규칙을 선택합니다."
msgid "Selected Ports"
msgstr "선택한 포트"
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "Selected Rules"
msgstr "규칙을 선택합니다."
msgid "Shared"
msgstr "공유"
# auto translated by TM merge from project: neutron-lbaas-dashboard, version: master, DocId: neutron_lbaas_dashboard/locale/djangojs
msgid "Source IP"
msgstr "소스 IP"
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "Source IP Address"
msgstr "소스 IP 주소"
msgid "Source IP Address/Subnet"
msgstr "소스 IP 주소/서브넷"
msgid "Source IP address or subnet"
msgstr "소스 IP 주소 또는 서브넷"
msgid "Source Port"
msgstr "소스 포트"
msgid "Source Port/Port Range"
msgstr "소스 포트/포트 범위"
msgid "Source port (integer in [1, 65535] or range in a:b)"
msgstr "소스 포트 (정수 [1, 65535] 사이 또는 a:b 범위)"
msgid ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgstr ""
"원본/대상 네트워크 주소와 IP 버전이 일치하지 않습니다. 일치 시켜주세요."
msgid "Status"
msgstr "상태"
msgid "TCP"
msgstr "TCP"
msgid "UDP"
msgstr "UDP"
# auto translated by TM merge from project: horizon, version: stable-mitaka, DocId: openstack_dashboard/locale/django
msgctxt "Admin state of a Firewall Group"
msgid "UP"
msgstr "UP"
#, python-format
msgid "Unable to add Firewall Group \"%s\"."
msgstr "방화벽 그룹 \"%s\"를 추가할 수 없습니다."
#, python-format
msgid "Unable to add Policy \"%s\"."
msgstr "정책 \"%s\"를 추가할 수 없습니다."
#, python-format
msgid "Unable to add Rule \"%s\"."
msgstr "규칙 \"%s\"를 추가할 수 없습니다."
#, python-format
msgid "Unable to delete firewall group. %s"
msgstr "방화벽 그룹 %s를 삭제할 수 없습니다."
#, python-format
msgid "Unable to delete policy. %s"
msgstr "정책를 삭제할 수 없습니다. %s"
#, python-format
msgid "Unable to delete rule. %s"
msgstr "규칙을 삭제할 수 없습니다. %s"
msgid "Unable to retrieve firewall group details."
msgstr "방화벽 그룹 상세 정볼르 가져올 수 없습니다."
msgid "Unable to retrieve firewall group list."
msgstr "방화벽 그룹 목록을 가져올 수 없습니다."
msgid "Unable to retrieve firewallgroup details."
msgstr "방화벽 그룹 세부 사항을 가져올 수 없습니다."
msgid "Unable to retrieve policies list."
msgstr "정책 목록을 찾지 못 했습니다."
msgid "Unable to retrieve policy details."
msgstr "정책 세부 정보를 찾지 못 했습니다."
#, python-format
msgid "Unable to retrieve policy list (%s)."
msgstr "정책 목록 (%s) 을(를) 가져올 수 없습니다."
msgid "Unable to retrieve policy list."
msgstr "정책 목록을 찾지 못 했습니다."
#, python-format
msgid "Unable to retrieve ports (%s)."
msgstr "포트 (%s) 을(를) 가져올 수 없습니다."
msgid "Unable to retrieve rule details."
msgstr "규칙 세부 정보를 찾지 못 했습니다."
#, python-format
msgid "Unable to retrieve rules (%s)."
msgstr "규칙 (%s) 을(를) 가져올 수 없습니다."
msgid "Unable to retrieve rules list."
msgstr "규칙 목록을 찾지 못 했습니다."
msgid "Value"
msgstr "값"
msgid "You may add ports to firewall group here."
msgstr "이 방화벽 그룹에 포트를 추가할 수 있습니다."
msgid "You may remove ports from firewall group here."
msgstr "이 방화벽 그룹에서 포트를 제거할 수 있습니다."
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "You may update firewall group details here."
msgstr "방화벽 그룹 세부 사항을 여기서 업데이트 할 수 있습니다."
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid ""
"You may update policy details here. Use 'Insert Rule' or 'Remove Rule' links "
"instead to insert or remove a rule."
msgstr ""
"여기서 정책의 세부 사항을 업데이트 할 수 있습니다. 규칙을 삽입하거나 삭제하"
"는 대신에 '규칙 삽입'나 '규칙 삭제' 링크를 사용하십시오."
# auto translated by TM merge from project: neutron-fwaas-dashboard, version: stable-queens, DocId: neutron_fwaas_dashboard/locale/django
msgid "You may update rule details here."
msgstr "여기서 규칙 세부 사항을 업데이트 할 수 있습니다."

View File

@ -1,425 +0,0 @@
# Carlos Marques <marquesc@br.ibm.com>, 2016. #zanata
# José Mello <jose.eduardo.jr@gmail.com>, 2016. #zanata
# Fernando Pimenta <fernando.c.pimenta@gmail.com>, 2017. #zanata
# José Mello <jose.eduardo.jr@gmail.com>, 2017. #zanata
# Rodrigo Loures <rmoraesloures@gmail.com>, 2018. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-fwaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-02-19 16:16+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-05-02 12:55+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 "-"
msgstr "-"
msgid "ALLOW"
msgstr "ALLOW"
msgctxt "Action Name of a Firewall Rule"
msgid "ALLOW"
msgstr "ALLOW"
msgid "ANY"
msgstr "ANY"
msgid "Action"
msgstr "Ação"
msgid "Action for the firewall rule"
msgstr "Ação para a regra de firewall"
msgid "Add"
msgstr "Adicionar"
msgid "Add New Policy"
msgstr "Adicionar Nova Política"
msgid "Add New Rule"
msgstr "Adicionar Nova Regra"
msgid "Add Policy"
msgstr "Adicionar Política"
msgid "Add Rule"
msgstr "Adicionar Regra"
#, python-format
msgid "Added Policy \"%s\"."
msgstr "Política Adicionada \"%s\"."
#, python-format
msgid "Added Rule \"%s\"."
msgstr "Adicionada Regra \"%s\"."
msgid "Admin State"
msgstr "Estado de Administração"
msgid "Admin State Up"
msgstr "Estado Administrativo Ligado"
msgid "After"
msgstr "Após"
msgid "Audited"
msgstr "Auditado"
msgid "Available Rules"
msgstr "Regras Disponíveis"
msgid "Before"
msgstr "Antes"
msgid ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgstr ""
"Escolha regra(s) a partir de Regras Disponíveis para Regras Selecionadas "
"clicando no botão ou arrastando e soltando, você pode alterar sua ordem "
"arrastando e soltando também."
msgid ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgstr ""
"Escolha a regra que você deseja inserir. Especifique a regra que você deseja "
"inserir imediatamente antes, ou a regra para inserir imediatamente após. Se "
"ambos forem especificados, o anterior tem precedência."
msgid "Choose the rule you want to remove."
msgstr "Escolha a regra que você quer remover."
msgid ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgstr ""
"Crie uma política de firewall com uma lista ordenada de regras de firewall.\n"
"\n"
"Uma política de firewall é uma coleta ordenada de regras de firewall. "
"Portanto, se o tráfego corresponder à primeira regra, as outras regras não "
"serão executadas. Se o tráfego não corresponder à regra atual, então a "
"próxima regra será executada. Uma política de firewall possui os seguintes "
"atributos:\n"
"\n"
"<li> Compartilhado: Uma política de firewall pode ser compartilhada entre "
"locatários. Assim, ela também pode fazer parte de um fluxo de trabalho de "
"auditoria no qual a política de firewall pode ser auditada pela entidade "
"relevante que estiver autorizada.</li><li>Auditada: Quando auditada estiver "
"configurada para True, indica que a política de firewall foi auditada. "
"Sempre que a política de firewall ou as regras de firewall associadas forem "
"alteradas, esse atributo será configurado para False e precisará ser "
"configurado explicitamente para True por meio de uma operação de atualização."
"</li>\n"
"O campo de nome é obrigatório, e todos os outros são opcionais."
msgid ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgstr ""
"Crie uma regra de firewall.\n"
"\n"
"Uma regra de Firewall é uma associação dos seguintes atributos:\n"
"\n"
"<li>Endereços IP: Os endereços a partir dos quais a filtragem de tráfego "
"precisa ser aplicada</li><li>Versão do IP: O tipo de pacotes de IP (IP V4/"
"V6) que precisa ser filtrado.</li><li>Protocolo: O tipo de pacotes (UDP, "
"ICMP, TCP, Any) que precisa ser verificado.</li><li>Ação: Ação é o tipo de "
"filtragem necessário, que pode ser Rejeitar/Negar/Permitir pacotes de dados."
"</li>\n"
"Os campos de protocolo e de ação são obrigatórios, e todos os outros são "
"opcionais."
msgid "Create a policy with selected rules."
msgstr "Criar uma política com as regras selecionadas."
msgid "DENY"
msgstr "DENY"
msgctxt "Action Name of a Firewall Rule"
msgid "DENY"
msgstr "DENY"
msgid "Delete Policy"
msgid_plural "Delete Policies"
msgstr[0] "Excluir Política"
msgstr[1] "Excluir Políticas"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Excluir Regra"
msgstr[1] "Excluir Regras"
# #-#-#-#-# app_reserved_uids.pot (Installation Guide 0.1) #-#-#-#-#
# #-#-#-#-# basic_environment.pot (Installation Guide 0.1) #-#-#-#-#
# #-#-#-#-# overview.pot (Installation Guide 0.1) #-#-#-#-#
msgid "Description"
msgstr "Descrição"
msgid "Description:"
msgstr "Descrição:"
msgid "Destination IP"
msgstr "IP de Destino"
msgid "Destination IP Address"
msgstr "Endereço IP de Destino"
msgid "Destination IP Address/Subnet"
msgstr "Endereço IP/Sub-rede de Destino"
msgid "Destination IP address or subnet"
msgstr "Endereço IP ou sub-rede de destino"
msgid "Destination Port"
msgstr "Porta de Destino"
msgid "Destination Port/Port Range"
msgstr "Porta destino/Faixa de Porta"
msgid "Destination port (integer in [1, 65535] or range in a:b)"
msgstr "Porta de destino (número inteiro em [1, 65535] ou faixa em a:b)"
msgid "Edit Policy"
msgstr "Editar Política"
msgid "Edit Policy {{ name }}"
msgstr "Editar política {{ name }}"
msgid "Edit Rule"
msgstr "Editar Regra"
msgid "Edit Rule {{ name }}"
msgstr "Editar Regra {{ name }}"
msgid "Enabled"
msgstr "Habilitado"
#, python-format
msgid "Failed to insert rule to policy %(name)s: %(reason)s"
msgstr "Falha ao inserir regra na política %(name)s: %(reason)s"
#, python-format
msgid "Failed to remove rule from policy %(name)s: %(reason)s"
msgstr "Falha ao remover regra da política %(name)s: %(reason)s"
#, python-format
msgid "Failed to retrieve available rules: %s"
msgstr "Falha ao recuperar as regras disponíveis: %s"
#, python-format
msgid "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgstr "Falha ao recuperar as regras atuais na política %(name)s: %(reason)s"
#, python-format
msgid "Failed to update policy %(name)s: %(reason)s"
msgstr "Falha para atualizar a política %(name)s: %(reason)s"
#, python-format
msgid "Failed to update rule %(name)s: %(reason)s"
msgstr "Falha ao atualizar a regra %(name)s: %(reason)s"
msgid "Firewall Policies"
msgstr "Políticas de Firewall"
msgid "Firewall Rules"
msgstr "Regras de Firewall"
msgid "ICMP"
msgstr "ICMP"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "Versão do IP"
msgid "IP Version for Firewall Rule"
msgstr "Versão do IP para Regra de Firewall"
msgid "Insert Rule"
msgstr "Inserir Regra"
msgid "Insert Rule to Policy"
msgstr "Inserir regra na Política"
msgid "Name"
msgstr "Nome"
msgid "None"
msgstr "Nenhum"
msgid "Policies"
msgstr "Políticas"
msgid "Policy"
msgstr "Política"
#, python-format
msgid "Policy %s was successfully updated."
msgstr "A política %s foi atualizada com sucesso."
msgid "Ports"
msgstr "Portas"
msgid "Project ID"
msgstr "ID do projeto"
msgid "Protocol"
msgstr "Protocolo"
msgid "Protocol for the firewall rule"
msgstr "Protocolo para a regra de firewall"
msgid "REJECT"
msgstr "REJECT"
msgctxt "Action Name of a Firewall Rule"
msgid "REJECT"
msgstr "REJECT"
msgid "Remove Rule"
msgstr "Remover Regra"
msgid "Remove Rule from Policy"
msgstr "Remover Regra da Política"
msgid "Rule"
msgstr "Regra"
#, python-format
msgid "Rule %(rule)s was successfully inserted to policy %(policy)s."
msgstr "A regra %(rule)s foi adicionada com sucesso na política %(policy)s."
#, python-format
msgid "Rule %(rule)s was successfully removed from policy %(policy)s."
msgstr "A regra %(rule)s foi removida com sucesso da política %(policy)s."
#, python-format
msgid "Rule %s was successfully updated."
msgstr "A regra %s foi atualizada com sucesso."
msgid "Rules"
msgstr "Regras"
msgid "Save Changes"
msgstr "Salvar Alterações"
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
msgstr[0] "Exclusão agendada de Política"
msgstr[1] "Exclusão agendada de Políticas"
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
msgstr[0] "Exclusão agendada de Regra"
msgstr[1] "Exclusão agendada de Regras"
msgid "Select a Policy"
msgstr "Selecione uma Política"
msgid "Select rules for your policy."
msgstr "Selecionar regras para a sua política."
msgid "Selected Rules"
msgstr "Regras Selecionadas"
msgid "Shared"
msgstr "Compartilhado"
msgid "Source IP"
msgstr "IP de origem"
msgid "Source IP Address"
msgstr "Endereço IP de Origem"
msgid "Source IP Address/Subnet"
msgstr "Endereço IP/Sub-rede de Origem"
msgid "Source IP address or subnet"
msgstr "Endereço IP ou sub-rede de origem"
msgid "Source Port"
msgstr "Porta de Origem"
msgid "Source Port/Port Range"
msgstr "Porta de Origem/Faixa de Porta"
msgid "Source port (integer in [1, 65535] or range in a:b)"
msgstr "Porta de origem (número inteiro em [1, 65535] ou faixa em a:b)"
msgid ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgstr ""
"O Endereço de Rede de Origem/Destino e a Versão do IP estão inconsistentes. "
"Torne-os consistentes"
msgid "Status"
msgstr "Status"
msgid "TCP"
msgstr "TCP"
msgid "UDP"
msgstr "UDP"
#, python-format
msgid "Unable to add Policy \"%s\"."
msgstr "Não é possível adicionar a Política \"%s\"."
#, python-format
msgid "Unable to add Rule \"%s\"."
msgstr "Não é possível adicionar a Regra \"%s\"."
#, python-format
msgid "Unable to delete policy. %s"
msgstr "Não é possível excluir a política. %s"
#, python-format
msgid "Unable to delete rule. %s"
msgstr "Não é possível excluir regra. %s"
msgid "Unable to retrieve policies list."
msgstr "Não é possível recuperar a lista de políticas."
msgid "Unable to retrieve policy details."
msgstr "Não é possível recuperar detalhes da política."
msgid "Unable to retrieve policy list."
msgstr "Não é possível recuperar a lista de políticas."
msgid "Unable to retrieve rule details."
msgstr "Não é possível recuperar detalhes da regra."
msgid "Unable to retrieve rules list."
msgstr "Não é possível recuperar lista de regras."

View File

@ -1,655 +0,0 @@
# Antonio Kless <antoniok.spb@gmail.com>, 2015. #zanata
# OpenStack Infra <zanata@openstack.org>, 2015. #zanata
# Aleksey Alekseenko <9118250541@mail.ru>, 2016. #zanata
# Alexander <ainikitenkov@gmail.com>, 2016. #zanata
# Andreas Jaeger <jaegerandi@gmail.com>, 2016. #zanata
# Artem <amikhalev90@gmail.com>, 2016. #zanata
# Daisy <guoyingc@cn.ibm.com>, 2016. #zanata
# Fedor Tarasenko <feodor.tarasenko@gmail.com>, 2016. #zanata
# Irina Kochetova <ikochetova@hystax.com>, 2016. #zanata
# Maxim Bozhenko <mbozhenko@gmail.com>, 2016. #zanata
# Valentin Chikunov <vchikunov@hystax.com>, 2016. #zanata
# Artem <amikhalev90@gmail.com>, 2017. #zanata
# Ilya Alekseyev <ilyaalekseyev@acm.org>, 2017. #zanata
# Roman Gorshunov <roman.gorshunov@att.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-fwaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-08-10 13:30+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-08-13 06:01+0000\n"
"Last-Translator: Roman Gorshunov <roman.gorshunov@att.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"
msgid "-"
msgstr "-"
msgid "ALLOW"
msgstr "ALLOW"
msgctxt "Action Name of a Firewall Rule"
msgid "ALLOW"
msgstr "ALLOW"
msgid "ANY"
msgstr "Любой"
msgid "Action"
msgstr "Действие"
msgid "Action for the firewall rule"
msgstr "Действие для правила межсетевого экрана."
msgctxt "Current status of a Firewall Group"
msgid "Active"
msgstr "Активен"
msgid "Add"
msgstr "Добавить"
msgid "Add Firewall Group"
msgstr "Добавить новую группу межсетевого экрана"
msgid "Add New Firewall Group"
msgstr "Добавить новую группу межсетевого экрана"
msgid "Add New Policy"
msgstr "Добавить новую политику"
msgid "Add New Rule"
msgstr "Добавить новое правило"
msgid "Add Policy"
msgstr "Добавить политику"
msgid "Add Port"
msgstr "Добавить порт"
msgid "Add Port to Firewall Group"
msgstr "Добавить порт в группу межсетевого экрана"
msgid "Add Rule"
msgstr "Добавить правило"
msgid "Add port to Firewall Group {{ name }}"
msgstr "Добавить порт в группу межсетевого экрана {{ name }}"
#, python-format
msgid "Added Firewall Group\"%s\"."
msgstr "Добавлена группа межсетевого экрана \"%s\"."
#, python-format
msgid "Added Policy \"%s\"."
msgstr "Добалена политика \"%s\"."
#, python-format
msgid "Added Rule \"%s\"."
msgstr "Добавлено правило \"%s\"."
#, python-format
msgid "Added the port(s) to the firewall group %s successfully."
msgstr "Успешно добавлены порты в группу %s межсетевого экрана."
msgid "Admin State"
msgstr "Административное состояние"
msgid "Admin State Up"
msgstr "Административное состояние UP"
msgid "After"
msgstr "После"
msgid "Audited"
msgstr "Проверено"
msgid "Available Ports"
msgstr "Доступные порты"
msgid "Available Rules"
msgstr "Доступные правила"
msgid "Before"
msgstr "Перед"
msgid "Choose port(s) from Available Ports. "
msgstr "Выберите порт(ы) из доступных портов"
msgid ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgstr ""
"Переместите правила из Доступных в Выбранные, нажав на кнопку или перетащив "
"мышью, вы также можете изменить порядок с помощью мыши. "
msgid ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgstr ""
"Выберите правило, которое вы хотите вставить. Укажите правило до или после "
"которого вы хотите вставить новое правило. Если указаны оба, используется "
"первое."
msgid "Choose the rule you want to remove."
msgstr "Выберите правило, которое вы хотите удалить."
msgid "Create Firewall Group"
msgstr "Создать группу межсетевого экрана"
msgid "Create a Firewall Group with selected ports."
msgstr "Создать группу межсетевого экрана с выбранными портами."
msgid ""
"Create a firewall group based on a policy.\n"
"\n"
"A firewall group represents a logical firewall resource that a tenant can "
"instantiate and manage. A firewall group must be associated with one policy, "
"all other fields are optional."
msgstr ""
"Создание группы межсетевого экрана, основывающейся на политике.\n"
"\n"
"Группа межсетевого экрана представляет из себя ресурс логического "
"межсетевого экрана, который может быть создан и настроен тенантом. Групп "
"межсетевого экрана должна основываться на (одной) политике, все остальные "
"поля - опциональны."
msgid ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgstr ""
"Создайте политику межсетевого экрана с упорядоченной цепочкой правил.\n"
"\n"
"Политика межсетевого экрана - упорядоченная цепочка правил. Если трафик "
"соответствует критериям первого правила, к нему не применяются остальные. "
"Если трафик не соотвтествует критериям текущего правила, идёт проверка на "
"соответствие критериям следующего правила до конца цепочки. Политика "
"межсетевого экрана имеет следующие атрибуты:\n"
"\n"
"<li>Shared: Политика может быть общей между проектами. Предоставление общего "
"доступа может частью процесса аудита, когда к политикам предоставляется "
"авторизованный общий доступ.</li><li>Audited: При включении данной опции, "
"при каждом изменении политики/правил атрибут Audited сбрасывается в "
"состояние False и должен быть явно возвращён в состоянии True обновлением "
"политики.</li> \n"
"Имя является обязательным, остальные поля опциональны."
msgid ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgstr ""
"Создайте правило брандмауэра.\n"
"\n"
"Правило брандмауэра содержит следующие атрибуты:\n"
"\n"
"<li>IP-адреса: исходные или целевые адреса, для которых действует правило.</"
"li><li>Версия IP: тип пакетов IP (IP V4/V6), для которых требуется "
"фильтрация.</li><li>Протокол: тип пакетов (UDP, ICMP, TCP, Any), для которых "
"действует правило.</li><li>Действие: действие правила с пакетом (отклонить, "
"сбросить, разрешить).</li>\n"
"Поля протокола и действия являются обязательными, все прочие поля - "
"необязательные."
msgid "Create a policy with selected rules."
msgstr "Создать политику с выбранными правилами."
msgctxt "Current status of a Firewall Group"
msgid "Created"
msgstr "Создано"
msgid "DENY"
msgstr "DENY"
msgctxt "Action Name of a Firewall Rule"
msgid "DENY"
msgstr "DENY"
msgctxt "Admin state of a Firewall Group"
msgid "DOWN"
msgstr "Выключен"
msgid "Delete Firewall Group"
msgid_plural "Delete Firewall Groups"
msgstr[0] "Удалить группу межсетевого экрана"
msgstr[1] "Удалить группу межсетевого экрана"
msgstr[2] "Удалить группы межсетевого экрана"
msgid "Delete Policy"
msgid_plural "Delete Policies"
msgstr[0] "Удалить политику"
msgstr[1] "Удалить политики"
msgstr[2] "Удалить политики"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "Удалить правило"
msgstr[1] "Удалить правила"
msgstr[2] "Удалить правила"
msgid "Description"
msgstr "Описание"
msgid "Description:"
msgstr "Описание:"
msgid "Destination IP"
msgstr "IP адрес назначения"
msgid "Destination IP Address"
msgstr "IP адрес назначения"
msgid "Destination IP Address/Subnet"
msgstr "IP адрес/подсеть назначения"
msgid "Destination IP address or subnet"
msgstr "IP адрес/подсеть назначения"
msgid "Destination Port"
msgstr "Порт назначения"
msgid "Destination Port/Port Range"
msgstr "Порт/диапазон портов назначения"
msgid "Destination port (integer in [1, 65535] or range in a:b)"
msgstr "Порт назначения (целое число из диапазона [1-65535] или диапазон a:b) "
msgctxt "Current status of a Firewall Group"
msgid "Down"
msgstr "Выключен"
msgid "Edit Firewall Group"
msgstr "Редактировать группу межсетевого экрана"
msgid "Edit FirewallGroup {{ name }}"
msgstr "Редактирование группы межсетевого экрана {{ name }}"
msgid "Edit Policy"
msgstr "Редактировать политику"
msgid "Edit Policy {{ name }}"
msgstr "Редактирование политики {{ name }}"
msgid "Edit Rule"
msgstr "Редактировать правило"
msgid "Edit Rule {{ name }}"
msgstr "Редактирование правила {{ name }}"
msgid "Egress Policy"
msgstr "Политика исходящего трафика"
msgid "Egress Policy ID"
msgstr "ID политики исходящего трафика"
msgid "Enabled"
msgstr "Включен"
msgctxt "Current status of a Firewall Group"
msgid "Error"
msgstr "Ошибка"
#, python-format
msgid "Failed to add the port(s) to the firewall group %(name)s: %(reason)s"
msgstr ""
"Не удалось добавить порты в группу межсетевого экрана %(name)s: %(reason)s"
#, python-format
msgid "Failed to insert rule to policy %(name)s: %(reason)s"
msgstr "Не удалось добавить правило в политику %(name)s: %(reason)s"
#, python-format
msgid "Failed to remove rule from policy %(name)s: %(reason)s"
msgstr "Не удалось удалить правило из политики %(name)s: %(reason)s"
#, python-format
msgid ""
"Failed to remove the port(s) from the firewall group %(name)s: %(reason)s"
msgstr ""
"Не удалось удалить порты из группы межсетевого экрана %(name)s: %(reason)s"
#, python-format
msgid "Failed to retrieve available rules: %s"
msgstr "Не удалось получить доступные правила: %s"
#, python-format
msgid "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgstr "Не удалось получить текущие правила политики %(name)s: %(reason)s"
msgid "Failed to retrieve port list of the firewall group."
msgstr "Не удалось получить список портов группы межсетевого экрана."
#, python-format
msgid "Failed to update firewall group %(name)s: %(reason)s"
msgstr "Не удалось обновить группу межсетевого экрана %(name)s: %(reason)s"
#, python-format
msgid "Failed to update policy %(name)s: %(reason)s"
msgstr "Не удалось обновить политику %(name)s: %(reason)s"
#, python-format
msgid "Failed to update rule %(name)s: %(reason)s"
msgstr "Не удалось обновить правило %(name)s: %(reason)s"
msgid "Firewall Groups"
msgstr "Группы межсетевого экрана"
msgid "Firewall Policies"
msgstr "Политики межсетевого экрана"
msgid "Firewall Rules"
msgstr "Правила межсетевого экрана"
#, python-format
msgid "Firewall group %s was successfully updated."
msgstr "Группа %s межсетевого экрана была успешно обновлена."
msgid "FirewallGroup"
msgstr "Группа межсетевого экрана"
msgid "ICMP"
msgstr "ICMP"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "Версия IP"
msgid "IP Version for Firewall Rule"
msgstr "Версия протокола IP для правила межсетевого экрана"
msgctxt "Current status of a Firewall Group"
msgid "Inactive"
msgstr "Неактивно"
msgid "Ingress Policy"
msgstr "Политика входящего трафика"
msgid "Ingress Policy ID"
msgstr "ID политики входящего трафика"
msgid "Insert Rule"
msgstr "Вставить правило"
msgid "Insert Rule to Policy"
msgstr "Вставить правило в политику"
msgid "Label"
msgstr "Метка"
msgid "Name"
msgstr "Имя"
msgid "No options available"
msgstr "Нет доступных опций"
msgid "None"
msgstr "Нет"
msgctxt "Current status of a Firewall Group"
msgid "Pending Create"
msgstr "Ожидает создания"
msgctxt "Current status of a Firewall Group"
msgid "Pending Delete"
msgstr "Ожидает удаления"
msgctxt "Current status of a Firewall Group"
msgid "Pending Update"
msgstr "Ожидает обновления"
msgid "Policies"
msgstr "Политики"
msgid "Policy"
msgstr "Политика"
#, python-format
msgid "Policy %s was successfully updated."
msgstr "Политика %s была успешно обновлена."
msgid "Ports"
msgstr "Порты"
msgid "Project ID"
msgstr " ID проекта"
msgid "Protocol"
msgstr "Протокол"
msgid "Protocol for the firewall rule"
msgstr "Протокол для правила межсетевого экрана."
msgid "REJECT"
msgstr "REJECT"
msgctxt "Action Name of a Firewall Rule"
msgid "REJECT"
msgstr "REJECT"
msgid "Remove Port"
msgstr "Удалить порт"
msgid "Remove Port from Firewall Group"
msgstr "Удалить порт из группы межсетевого экрана"
msgid "Remove Rule"
msgstr "Удалить правило"
msgid "Remove Rule from Policy"
msgstr "Удалить правило из политики"
msgid "Remove port from FirewallGroup {{ name }}"
msgstr "Удалить порт из группы межсетевого экрана {{ name }}"
#, python-format
msgid "Removed the port(s) from the firewall group %s successfully."
msgstr "Порты успешно удалены из группы %s межсетевого экрана."
msgid "Rule"
msgstr "Правило"
#, python-format
msgid "Rule %(rule)s was successfully inserted to policy %(policy)s."
msgstr "Правило %(rule)s было успешно добавлено в политику %(policy)s."
#, python-format
msgid "Rule %(rule)s was successfully removed from policy %(policy)s."
msgstr "Правило %(rule)s было успешно удалено из политики %(policy)s."
#, python-format
msgid "Rule %s was successfully updated."
msgstr "Правило %s было успешно обновлено."
msgid "Rules"
msgstr "Правила"
msgid "Save Changes"
msgstr "Сохранить изменения"
msgid "Scheduled deletion of Firewall Group"
msgid_plural "Scheduled deletion of Firewall Groups"
msgstr[0] "Запланировано удаление группы межсетевого экрана"
msgstr[1] "Запланировано удаление группы межсетевого экрана"
msgstr[2] "Запланировано удаление групп межсетевого экрана"
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
msgstr[0] "Запланированное удаление политики"
msgstr[1] "Запланированное удаление политик"
msgstr[2] "Запланировано удаление политик"
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
msgstr[0] "Запланированное удаление правила"
msgstr[1] "Запланированное удаление правил"
msgstr[2] "Запланировано удаление правил"
msgid "Select a Policy"
msgstr "Выберите политику"
msgid "Select ports for your firewall group."
msgstr "Выберите порты для вашей группы сетевого экрана."
msgid "Select rules for your policy."
msgstr "Выбрать правила для вашей политики."
msgid "Selected Ports"
msgstr "Выбранные порты"
msgid "Selected Rules"
msgstr "Выбранные правила"
msgid "Shared"
msgstr "Общая"
msgid "Source IP"
msgstr "IP-адрес источника"
msgid "Source IP Address"
msgstr "IP адрес источника"
msgid "Source IP Address/Subnet"
msgstr "IP адрес/подсеть источника"
msgid "Source IP address or subnet"
msgstr "IP адрес/подсеть источника"
msgid "Source Port"
msgstr "Порт отправления"
msgid "Source Port/Port Range"
msgstr "Порт/диапазон портов отправления"
msgid "Source port (integer in [1, 65535] or range in a:b)"
msgstr ""
"Порт отправления (целое число из диапазона [1-65535] или диапазон a:b) "
msgid ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgstr ""
"Адрес источника/получателя и версия протокола несовместимы. Пожалуйста "
"исправьте."
msgid "Status"
msgstr "Статус"
msgid "TCP"
msgstr "TCP"
msgid "UDP"
msgstr "UDP"
msgctxt "Admin state of a Firewall Group"
msgid "UP"
msgstr "Включен"
#, python-format
msgid "Unable to add Firewall Group \"%s\"."
msgstr "Не удалось добавить группу межсетевого экрана \"%s\"."
#, python-format
msgid "Unable to add Policy \"%s\"."
msgstr "Не удалось добавить политику \"%s\"."
#, python-format
msgid "Unable to add Rule \"%s\"."
msgstr "Не удалось добавить правило \"%s\"."
#, python-format
msgid "Unable to delete firewall group. %s"
msgstr "Не удалось удалить группу межсетевого экрана. %s"
#, python-format
msgid "Unable to delete policy. %s"
msgstr "Не удалось удалить политику. %s"
#, python-format
msgid "Unable to delete rule. %s"
msgstr "Не удалось удалить правило. %s"
msgid "Unable to retrieve firewall group details."
msgstr "Не удалось получить детали группы межсетевого экрана."
msgid "Unable to retrieve firewall group list."
msgstr "Не удалось получить список групп межсетевого экрана."
msgid "Unable to retrieve firewallgroup details."
msgstr "Не удалось получить информацию о группе межсетевого экрана."
msgid "Unable to retrieve policies list."
msgstr "Не удалось получить список политик."
msgid "Unable to retrieve policy details."
msgstr "Не удалось получить информацию о политике."
#, python-format
msgid "Unable to retrieve policy list (%s)."
msgstr "Не удалось получить список политик (%s)."
msgid "Unable to retrieve policy list."
msgstr "Не удалось получить список политик."
#, python-format
msgid "Unable to retrieve ports (%s)."
msgstr "Не удалось получить порты (%s)."
msgid "Unable to retrieve rule details."
msgstr "Не удалось получить информацию о правиле."
#, python-format
msgid "Unable to retrieve rules (%s)."
msgstr "Не удалось получить правила (%s).."
msgid "Unable to retrieve rules list."
msgstr "Не удалось получить список правил."
msgid "Value"
msgstr "Значение"
msgid "You may add ports to firewall group here."
msgstr " Здесь вы можете добавить порты к группе межсетевого экрана."
msgid "You may remove ports from firewall group here."
msgstr " Здесь вы можете удалить порты из группы межсетевого экрана."
msgid "You may update firewall group details here."
msgstr " Здесь вы можете изменить конфигурацию группы межсетевого экрана."
msgid ""
"You may update policy details here. Use 'Insert Rule' or 'Remove Rule' links "
"instead to insert or remove a rule."
msgstr ""
"Здесь вы можете изменить конфигурацию политики. Для добавления или удаления "
"правил используйте соответствующие ссылки."
msgid "You may update rule details here."
msgstr " Здесь вы можете изменить конфигурацию правила."

View File

@ -1,624 +0,0 @@
# BillXiang <m13250816269@163.com>, 2016. #zanata
# Linda <duleish@cn.ibm.com>, 2016. #zanata
# Tony <tfu@redhat.com>, 2016. #zanata
# liuyanfu <lyf219@163.com>, 2016. #zanata
# sunanchen <KF.sunanchen@h3c.com>, 2016. #zanata
# TigerFang <tigerfun@126.com>, 2017. #zanata
# Tony <tfu@redhat.com>, 2017. #zanata
# blkart <blkart.org@gmail.com>, 2017. #zanata
# vuuv <froms2008@gmail.com>, 2017. #zanata
# zhonghuali <lizhonghua.li@huawei.com>, 2017. #zanata
# Tony <tfu@redhat.com>, 2018. #zanata
# Tony <tfu@redhat.com>, 2019. #zanata
msgid ""
msgstr ""
"Project-Id-Version: neutron-fwaas-dashboard VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
"POT-Creation-Date: 2019-03-19 10:41+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2019-03-21 12:54+0000\n"
"Last-Translator: Tony <tfu@redhat.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 "-"
msgstr "_"
msgid "ALLOW"
msgstr "允许"
msgctxt "Action Name of a Firewall Rule"
msgid "ALLOW"
msgstr "允许"
msgid "ANY"
msgstr "任意选项"
msgid "Action"
msgstr "操作"
msgid "Action for the firewall rule"
msgstr "针对防火墙规则的操作"
msgctxt "Current status of a Firewall Group"
msgid "Active"
msgstr "运行中"
msgid "Add"
msgstr "添加"
msgid "Add Firewall Group"
msgstr "添加防火墙组"
msgid "Add New Firewall Group"
msgstr "添加新的防火墙组"
msgid "Add New Policy"
msgstr "添加新的策略"
msgid "Add New Rule"
msgstr "添加新的规则"
msgid "Add Policy"
msgstr "添加策略"
msgid "Add Port"
msgstr "添加端口"
msgid "Add Port to Firewall Group"
msgstr "为防火墙组添加端口"
msgid "Add Rule"
msgstr "增加规则"
msgid "Add port to Firewall Group {{ name }}"
msgstr "添加端口到防火墙组 {{ name }}"
#, python-format
msgid "Added Firewall Group\"%s\"."
msgstr "添加防火墙组 \"%s\"。"
#, python-format
msgid "Added Policy \"%s\"."
msgstr "添加策略 “%s”。"
#, python-format
msgid "Added Rule \"%s\"."
msgstr "已添加规则 “%s”。"
#, python-format
msgid "Added the port(s) to the firewall group %s successfully."
msgstr "为防火墙组 %s 添加端口成功。"
msgid "Admin State"
msgstr "管理员状态"
msgid "Admin State Up"
msgstr "管理状态为启动"
msgid "After"
msgstr "晚于"
msgid "Audited"
msgstr "已审计"
msgid "Available Ports"
msgstr "可用的端口"
msgid "Available Rules"
msgstr "可用的规则"
msgid "Before"
msgstr "早于"
msgid "Choose port(s) from Available Ports. "
msgstr "从可用端口列表中选择。"
msgid ""
"Choose rule(s) from Available Rules to Selected Rule by push button or drag "
"and drop, you may change their order by drag and drop as well."
msgstr ""
"通过按下按钮或者拖放从可用策略中选择一个(或多个)添加至选定策略,您也可以利"
"用拖放改变它们的顺序。"
msgid ""
"Choose the rule you want to insert. Specify either the rule you want to "
"insert immediately before, or the rule to insert immediately after. If both "
"are specified, the prior takes precedence."
msgstr ""
"选择希望插入的规则。 指定在某条规则之前插入,或在某条规则之后插入。如果二者均"
"被指定,前面指定的优先。"
msgid "Choose the rule you want to remove."
msgstr "选择希望移除的规则。"
msgid "Create Firewall Group"
msgstr "创建防火墙组"
msgid "Create a Firewall Group with selected ports."
msgstr "创建带有所选端口的路由器组。"
msgid ""
"Create a firewall group based on a policy.\n"
"\n"
"A firewall group represents a logical firewall resource that a tenant can "
"instantiate and manage. A firewall group must be associated with one policy, "
"all other fields are optional."
msgstr ""
"根据策略创建防火墙组。\n"
"\n"
"防火墙组代表租户可以实例化和管理的逻辑防火墙资源。一个防火墙组必须与一个策略"
"相关联,所有其它字段是可选字段。"
msgid ""
"Create a firewall policy with an ordered list of firewall rules.\n"
"\n"
"A firewall policy is an ordered collection of firewall rules. So if the "
"traffic matches the first rule, the other rules are not executed. If the "
"traffic does not match the current rule, then the next rule is executed. A "
"firewall policy has the following attributes:\n"
"\n"
"<li>Shared: A firewall policy can be shared across tenants. Thus it can also "
"be made part of an audit workflow wherein the firewall policy can be audited "
"by the relevant entity that is authorized.</li><li>Audited: When audited is "
"set to True, it indicates that the firewall policy has been audited. Each "
"time the firewall policy or the associated firewall rules are changed, this "
"attribute will be set to False and will have to be explicitly set to True "
"through an update operation.</li>\n"
"The name field is required, all others are optional."
msgstr ""
"使用有序防火墙规则列表创建防火墙策略。\n"
"\n"
"防火墙策略是防火墙规则的有序集合。所以,如果流量满足第一个规则,那么其它规则"
"将不会执行。如果流量与当前规则不匹配,那么将执行下一个规则。防火墙策略具有以"
"下属性:\n"
"\n"
"<li>Shared防火墙规则可以在租户间共享。因此它可以作为审计工作流的一部分"
"已被授权的相关实体可对该防火墙策略进行审计。</li><li>Audited当 Audited 设置"
"为 True 时,表示已审计该防火墙策略。每次防火墙策略或关联防火墙规则发生变化"
"时,此属性将会设置为 False并且必须通过更新操作显式设置为 True。</li>\n"
"名称字段是必填字段,所有其他字段是可选字段。"
msgid ""
"Create a firewall rule.\n"
"\n"
"A Firewall rule is an association of the following attributes:\n"
"\n"
"<li>IP Addresses: The addresses from/to which the traffic filtration needs "
"to be applied.</li><li>IP Version: The type of IP packets (IP V4/V6) that "
"needs to be filtered.</li><li>Protocol: Type of packets (UDP, ICMP, TCP, "
"Any) that needs to be checked.</li><li>Action: Action is the type of "
"filtration required, it can be Reject/Deny/Allow data packets.</li>\n"
"The protocol and action fields are required, all others are optional."
msgstr ""
"创建防火墙规则。\n"
"\n"
"防火墙规则由以下属性关联形成:\n"
"\n"
"<li>IP 地址:需要应用流量过滤的来源/目标地址。</li><li>IP版本需要过滤的 IP "
"包类型 (IP V4/V6)。</li><li>协议需要检查的数据包类型UDP、ICMP、TCP 和 "
"Any。</li><li>操作:操作是所需过滤类型,它可为拒绝/放弃/允许数据包。</li>\n"
"协议字段和操作字段是必填字段,所有其他字段为可选字段。"
msgid "Create a policy with selected rules."
msgstr "使用所选规则创建策略。"
msgctxt "Current status of a Firewall Group"
msgid "Created"
msgstr "已创建"
msgid "DENY"
msgstr "拒绝"
msgctxt "Action Name of a Firewall Rule"
msgid "DENY"
msgstr "丢弃"
msgctxt "Admin state of a Firewall Group"
msgid "DOWN"
msgstr "关闭"
msgid "Delete Firewall Group"
msgid_plural "Delete Firewall Groups"
msgstr[0] "删除防火墙组"
msgid "Delete Policy"
msgid_plural "Delete Policies"
msgstr[0] "删除策略"
msgid "Delete Rule"
msgid_plural "Delete Rules"
msgstr[0] "删除规则"
msgid "Description"
msgstr "描述"
msgid "Description:"
msgstr "描述:"
msgid "Destination IP"
msgstr "目标 IP"
msgid "Destination IP Address"
msgstr "目的 IP 地址"
msgid "Destination IP Address/Subnet"
msgstr "目标 IP 地址/子网"
msgid "Destination IP address or subnet"
msgstr "目标 IP 地址或子网"
msgid "Destination Port"
msgstr "目标端口"
msgid "Destination Port/Port Range"
msgstr "目标端口/端口范围"
msgid "Destination port (integer in [1, 65535] or range in a:b)"
msgstr "目标端口([1, 65535] 区间内的整数或者以 a:b 形式表示的范围)"
msgctxt "Current status of a Firewall Group"
msgid "Down"
msgstr "关闭"
msgid "Edit Firewall Group"
msgstr "编辑防火墙组"
msgid "Edit FirewallGroup {{ name }}"
msgstr "编辑防火墙组 {{ name }}"
msgid "Edit Policy"
msgstr "编辑策略"
msgid "Edit Policy {{ name }}"
msgstr "编辑策略 {{ name }}"
msgid "Edit Rule"
msgstr "编辑规则"
msgid "Edit Rule {{ name }}"
msgstr "编辑规则 {{ name }}"
msgid "Egress Policy"
msgstr "出口策略"
msgid "Egress Policy ID"
msgstr "出口策略 ID"
msgid "Enabled"
msgstr "已启用"
msgctxt "Current status of a Firewall Group"
msgid "Error"
msgstr "错误"
#, python-format
msgid "Failed to add the port(s) to the firewall group %(name)s: %(reason)s"
msgstr "为防火墙组 %(name)s 添加端口失败 : %(reason)s"
#, python-format
msgid "Failed to insert rule to policy %(name)s: %(reason)s"
msgstr "无法将规则插入至策略 %(name)s%(reason)s"
#, python-format
msgid "Failed to remove rule from policy %(name)s: %(reason)s"
msgstr "无法从策略 %(name)s 中移除规则:%(reason)s"
#, python-format
msgid ""
"Failed to remove the port(s) from the firewall group %(name)s: %(reason)s"
msgstr "从防火墙组 %(name)s 中删除端口失败 : %(reason)s"
#, python-format
msgid "Failed to retrieve available rules: %s"
msgstr "无法检索可用的规则:%s"
#, python-format
msgid "Failed to retrieve current rules in policy %(name)s: %(reason)s"
msgstr "无法检索策略 %(name)s 中的当前规则:%(reason)s"
msgid "Failed to retrieve port list of the firewall group."
msgstr "无法获取防火墙组的端口列表。"
#, python-format
msgid "Failed to update firewall group %(name)s: %(reason)s"
msgstr "更新防火墙组 %(name)s 失败 : %(reason)s"
#, python-format
msgid "Failed to update policy %(name)s: %(reason)s"
msgstr "无法更新策略 %(name)s%(reason)s"
#, python-format
msgid "Failed to update rule %(name)s: %(reason)s"
msgstr "无法更新规则 %(name)s%(reason)s"
msgid "Firewall Groups"
msgstr "防火墙组"
msgid "Firewall Policies"
msgstr "防火墙策略"
msgid "Firewall Rules"
msgstr "防火墙规则"
#, python-format
msgid "Firewall group %s was successfully updated."
msgstr "防火墙组 %s 被成功更新。"
msgid "FirewallGroup"
msgstr "防火墙组"
msgid "ICMP"
msgstr "ICMP"
msgid "ID"
msgstr "ID"
msgid "IP Version"
msgstr "IP版本"
msgid "IP Version for Firewall Rule"
msgstr "防火墙规则的 IP 版本"
msgctxt "Current status of a Firewall Group"
msgid "Inactive"
msgstr "不活跃"
msgid "Ingress Policy"
msgstr "入口策略"
msgid "Ingress Policy ID"
msgstr "入口策略 ID"
msgid "Insert Rule"
msgstr "插入规则"
msgid "Insert Rule to Policy"
msgstr "向策略中添加规则"
msgid "Label"
msgstr "标签"
msgid "Name"
msgstr "名称"
msgid "No options available"
msgstr "无可用选项"
msgid "None"
msgstr "无"
msgctxt "Current status of a Firewall Group"
msgid "Pending Create"
msgstr "等待创建"
msgctxt "Current status of a Firewall Group"
msgid "Pending Delete"
msgstr "等待删除"
msgctxt "Current status of a Firewall Group"
msgid "Pending Update"
msgstr "等待更新"
msgid "Policies"
msgstr "策略"
msgid "Policy"
msgstr "策略"
#, python-format
msgid "Policy %s was successfully updated."
msgstr "已成功更新策略 %s。"
msgid "Ports"
msgstr "端口"
msgid "Project ID"
msgstr "项目 ID"
msgid "Protocol"
msgstr "协议"
msgid "Protocol for the firewall rule"
msgstr "防火墙规则的协议"
msgid "REJECT"
msgstr "拒绝"
msgctxt "Action Name of a Firewall Rule"
msgid "REJECT"
msgstr "拒绝"
msgid "Remove Port"
msgstr "删除端口"
msgid "Remove Port from Firewall Group"
msgstr "为防火墙组删除端口"
msgid "Remove Rule"
msgstr "移除规则"
msgid "Remove Rule from Policy"
msgstr "从策略中移除规则"
msgid "Remove port from FirewallGroup {{ name }}"
msgstr "从防火墙组中删除端口 {{ name }}"
#, python-format
msgid "Removed the port(s) from the firewall group %s successfully."
msgstr "从防火墙组 %s 中删除端口成功。"
msgid "Rule"
msgstr "规则"
#, python-format
msgid "Rule %(rule)s was successfully inserted to policy %(policy)s."
msgstr "规则 %(rule)s 被成功插入至策略 %(policy)s。"
#, python-format
msgid "Rule %(rule)s was successfully removed from policy %(policy)s."
msgstr "规则 %(rule)s 已从策略 %(policy)s 中成功移除。"
#, python-format
msgid "Rule %s was successfully updated."
msgstr "已成功更新规则 %s。"
msgid "Rules"
msgstr "规则"
msgid "Save Changes"
msgstr "保存变更"
msgid "Scheduled deletion of Firewall Group"
msgid_plural "Scheduled deletion of Firewall Groups"
msgstr[0] "已调度的删除防火期组"
msgid "Scheduled deletion of Policy"
msgid_plural "Scheduled deletion of Policies"
msgstr[0] "已安排删除策略"
msgid "Scheduled deletion of Rule"
msgid_plural "Scheduled deletion of Rules"
msgstr[0] "已安排删除规则"
msgid "Select a Policy"
msgstr "选择策略"
msgid "Select ports for your firewall group."
msgstr "为防火墙组选择端口。"
msgid "Select rules for your policy."
msgstr "为您的策略选择规则。"
msgid "Selected Ports"
msgstr "选择的端口"
msgid "Selected Rules"
msgstr "选定的规则"
msgid "Shared"
msgstr "共享"
msgid "Source IP"
msgstr "源 IP"
msgid "Source IP Address"
msgstr "源 IP 地址"
msgid "Source IP Address/Subnet"
msgstr "源 IP 地址/子网"
msgid "Source IP address or subnet"
msgstr "源 IP 地址或子网"
msgid "Source Port"
msgstr "源端口"
msgid "Source Port/Port Range"
msgstr "源端口/端口范围"
msgid "Source port (integer in [1, 65535] or range in a:b)"
msgstr "源端口([1, 65535] 区间内的整数或者以 a:b 形式表示的范围)"
msgid ""
"Source/Destination Network Address and IP version are inconsistent. Please "
"make them consistent."
msgstr "源/目标网络地址和 IP 版本不一致。请确保它们一致。"
msgid "Status"
msgstr "状态"
msgid "TCP"
msgstr "TCP"
msgid "UDP"
msgstr "UDP"
msgctxt "Admin state of a Firewall Group"
msgid "UP"
msgstr "启动"
#, python-format
msgid "Unable to add Firewall Group \"%s\"."
msgstr "无法添加防火墙组 \"%s\"。"
#, python-format
msgid "Unable to add Policy \"%s\"."
msgstr "无法添加策略 “%s”。"
#, python-format
msgid "Unable to add Rule \"%s\"."
msgstr "无法添加规则 “%s”。"
#, python-format
msgid "Unable to delete firewall group. %s"
msgstr "无法删除防火墙组 %s"
#, python-format
msgid "Unable to delete policy. %s"
msgstr "无法删除策略 %s"
#, python-format
msgid "Unable to delete rule. %s"
msgstr "无法删除规则 %s"
msgid "Unable to retrieve firewall group details."
msgstr "无法获取防火墙组详情。"
msgid "Unable to retrieve firewall group list."
msgstr "无法获取防火墙组列表。"
msgid "Unable to retrieve firewallgroup details."
msgstr "无法获取防火墙组详情。"
msgid "Unable to retrieve policies list."
msgstr "无法检索策略列表。"
msgid "Unable to retrieve policy details."
msgstr "无法检索策略详情。"
#, python-format
msgid "Unable to retrieve policy list (%s)."
msgstr "无法检索策略列表 (%s)。"
msgid "Unable to retrieve policy list."
msgstr "无法检索策略列表。"
#, python-format
msgid "Unable to retrieve ports (%s)."
msgstr "无法获取端口 (%s)。"
msgid "Unable to retrieve rule details."
msgstr "无法检索规则详情。"
#, python-format
msgid "Unable to retrieve rules (%s)."
msgstr "无法获取规则 (%s)。"
msgid "Unable to retrieve rules list."
msgstr "无法检索规则列表。"
msgid "Value"
msgstr "值"
msgid "You may add ports to firewall group here."
msgstr "您可以在这里为防火墙组添加端口。"
msgid "You may remove ports from firewall group here."
msgstr "您可以在这里为防火墙组删除端口。"
msgid "You may update firewall group details here."
msgstr "您可以在此处更新防火墙组的详情。"
msgid ""
"You may update policy details here. Use 'Insert Rule' or 'Remove Rule' links "
"instead to insert or remove a rule."
msgstr ""
"您可以在此处更新策略详情。使用'插入规则'或'移除规则'链接来插入或删除规则。"
msgid "You may update rule details here."
msgstr "您可以在此处更新规则详情。"

View File

@ -1,21 +0,0 @@
/**
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
horizon.firewalls_v2 = {
workflow_init: function() {
// Initialise the drag and drop rule list
horizon.lists.generate_html("port");
horizon.lists.generate_html("rule");
}
};

View File

@ -1,75 +0,0 @@
@import "/dashboard/scss/components/resource_topology";
.sort-container {
#selected_port {
@include common_box_list_selected("rule");
}
/* FWaaS v2 */
#selected_port {
@include common_box_list_selected("port");
}
}
// Table like styling of boostrap grid options in a bootstrap-dropdown
// compatible with the horizon dropdown javascript
.dropdown-table {
@media only screen and (min-width: 768px) {
min-width: $modal-md - $grid-gutter-width;
}
margin-bottom: $line-height-computed;
background-color: $body-bg;
padding: 10px;
.dropdown-thead {
margin: 0px;
.col-xs-12 {
padding: 0px;
}
.dropdown-tr {
.dropdown-th {
vertical-align: bottom;
border-bottom: 1px solid $table-border-color;
border-top: 0;
display: table-cell;
vertical-align: inherit;
font-weight: bold;
text-align: -internal-center;
color: $dropdown-header-color;
}
}
}
.dropdown-tr {
margin: 0px;
padding: 0px;
.col-xs-12 {
padding: 0px;
margin: 0px;
}
.row {
margin: 0px;
padding: 0px;
}
.dropdown-th, .dropdown-td {
padding: $table-cell-padding;
line-height: $line-height-base;
vertical-align: top;
border-top: 1px solid $table-border-color;
color: $dropdown-link-color;
}
}
.empty-options {
text-align: center;
vertical-align: center;
font-style: italic;
}
}

View File

@ -1,769 +0,0 @@
# Copyright 2017, Juniper Networks.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from unittest import mock
from neutronclient.v2_0.client import Client as neutronclient
import openstack_dashboard.api.nova as nova
from openstack_dashboard.test import helpers
from neutron_fwaas_dashboard.api import fwaas_v2 as api_fwaas_v2
from neutron_fwaas_dashboard.test import helpers as test
class FwaasV2ApiTests(test.APITestCase):
@helpers.create_mocks({nova: ('server_list',)})
def test_get_servers(self):
fields = ['id', 'name']
mock_servers = {
'916562da-fa95-4ae1-8bea-0b45f2f8297a': self._mock_server(
id='916562da-fa95-4ae1-8bea-0b45f2f8297a',
name='mock-server-1'
),
'7038e456-3067-493a-8f2b-69bc26acbccf': self._mock_server(
id='7038e456-3067-493a-8f2b-69bc26acbccf',
name='mock-server-2'
),
'23f683e5-8536-4e5a-806b-0382b02743dc': self._mock_server(
id='23f683e5-8536-4e5a-806b-0382b02743dc',
name='mock-server-3'
)
}
mock_server_ids = sorted(mock_servers.keys())
self.mock_server_list.return_value = [list(mock_servers.values())]
servers = api_fwaas_v2.get_servers(self.request)
server_ids = sorted(servers.keys())
self.assertEqual(server_ids, mock_server_ids)
for key in mock_server_ids:
expected_server = mock_servers[key]
server = servers[key]
self._assert_subobject(expected_server, server, fields)
def _assert_subobject(self, child, parent, fields):
for field in fields:
self.assertEqual(
getattr(child, field),
getattr(parent, field)
)
def _mock_server(self, **kwargs):
server = nova.Server({}, self.request)
for key, val in kwargs.items():
setattr(server, key, val)
return server
@helpers.create_mocks({neutronclient: ('list_networks',)})
def test_get_networks(self):
fields = ['name', 'id']
mock_networks = {
'64e8c993-1c99-40fb-a8bc-42d3fd487a97': {
'name': 'mock-network-1',
'id': '64e8c993-1c99-40fb-a8bc-42d3fd487a97'
},
'f1bd4bb5-2bf3-4e0e-9c8d-9a1a500eaece': {
'name': 'mock-network-2',
'id': 'f1bd4bb5-2bf3-4e0e-9c8d-9a1a500eaece'
},
'74173cf1-461e-4fd0-881e-2a0cc4a94e14': {
'name': 'mock-network-3',
'id': '74173cf1-461e-4fd0-881e-2a0cc4a94e14'
}
}
mock_network_ids = sorted(mock_networks.keys())
self.mock_list_networks.return_value = {
'networks': list(mock_networks.values())
}
network_names = api_fwaas_v2.get_network_names(self.request)
self.mock_list_networks.assert_called_once_with(fields=fields)
network_ids = sorted(network_names.keys())
self.assertEqual(network_ids, mock_network_ids)
for key in mock_network_ids:
self._assert_api_dict(
network_names[key]._apidict,
mock_networks[key],
fields
)
@helpers.create_mocks({neutronclient: ('list_routers',)})
def test_get_router_names(self):
fields = ['name', 'id']
mock_routers = {
'9d143b82-bd74-4ccf-81ba-9b7e02f3f7b2': {
'name': 'mock-router-1',
'id': '9d143b82-bd74-4ccf-81ba-9b7e02f3f7b2'
},
'84d72522-1c26-4d28-83ed-b8653ac5d38c': {
'name': 'mock-router-2',
'id': '84d72522-1c26-4d28-83ed-b8653ac5d38c'
},
'2149de19-840a-4b41-8a44-4755ce8a881b': {
'name': 'mock-router-3',
'id': '2149de19-840a-4b41-8a44-4755ce8a881b'
}
}
mock_router_ids = sorted(mock_routers.keys())
# Mock API call
self.mock_list_routers.return_value = {
'routers': list(mock_routers.values())
}
# call results
router_names = api_fwaas_v2.get_router_names(self.request)
# Check that the correct filters were applied for the API call
self.mock_list_routers.assert_called_once_with(fields=fields)
# Ensure that exactly the expected mock data ids have been retrieved
router_ids = sorted(router_names.keys())
self.assertEqual(router_ids, mock_router_ids)
# Check that the returned values correspond to the (mocked) API data
for key in mock_router_ids:
# Note that _apidict is being checked
self._assert_api_dict(
router_names[key]._apidict,
mock_routers[key],
fields
)
def _assert_api_dict(self, actual, expected, fields):
# Ensure exactly the required fields have been retrieved
actual_fields = sorted(actual.keys())
self.assertEqual(actual_fields, sorted(fields))
# Ensure expected datum was returned in each field
for field in fields:
self.assertEqual(actual[field], expected[field])
@helpers.create_mocks({neutronclient: ('create_fwaas_firewall_rule',)})
def test_rule_create(self):
rule1 = self.fw_rules_v2.first()
rule1_dict = self.api_fw_rules_v2.first()
form_data = {'name': rule1.name,
'description': rule1.description,
'protocol': rule1.protocol,
'action': rule1.action,
'source_ip_address': rule1.source_ip_address,
'source_port': rule1.source_port,
'destination_ip_address': rule1.destination_ip_address,
'destination_port': rule1.destination_port,
'shared': rule1.shared,
'enabled': rule1.enabled
}
form_dict = {'firewall_rule': form_data}
ret_dict = {'firewall_rule': rule1_dict}
self.mock_create_fwaas_firewall_rule.return_value = ret_dict
ret_val = api_fwaas_v2.rule_create(self.request, **form_data)
self._assert_rule_return_value(ret_val, rule1)
self.mock_create_fwaas_firewall_rule.assert_called_once_with(form_dict)
def _assert_rule_return_value(self, ret_val, exp_rule):
self.assertIsInstance(ret_val, api_fwaas_v2.Rule)
self.assertEqual(exp_rule.name, ret_val.name)
self.assertTrue(ret_val.id)
@helpers.create_mocks({neutronclient: ('list_fwaas_firewall_rules',)})
def test_rule_list(self):
exp_rules = self.fw_rules_v2.list()
api_rules = {'firewall_rules': self.api_fw_rules_v2.list()}
self.mock_list_fwaas_firewall_rules.return_value = api_rules
ret_val = api_fwaas_v2.rule_list(self.request)
for (v, d) in zip(ret_val, exp_rules):
self._assert_rule_return_value(v, d)
self.mock_list_fwaas_firewall_rules.assert_called_once_with()
@helpers.create_mocks({neutronclient: ('list_fwaas_firewall_rules',)})
def test_rule_list_for_tenant(self):
tenant_id = self.request.user.project_id
exp_rules = self.fw_rules_v2.list()
api_rules = {'firewall_rules': self.api_fw_rules_v2.list()}
self.mock_list_fwaas_firewall_rules.side_effect = [
{'firewall_rules': []},
api_rules,
]
ret_val = api_fwaas_v2.rule_list_for_tenant(self.request, tenant_id)
for (v, d) in zip(ret_val, exp_rules):
self._assert_rule_return_value(v, d)
self.assertEqual(2, self.mock_list_fwaas_firewall_rules.call_count)
self.mock_list_fwaas_firewall_rules.assert_has_calls([
mock.call(tenant_id=tenant_id, shared=False),
mock.call(shared=True),
])
@helpers.create_mocks({neutronclient: ('show_fwaas_firewall_rule',)})
def test_rule_get(self):
exp_rule = self.fw_rules_v2.first()
ret_dict = {'firewall_rule': self.api_fw_rules_v2.first()}
self.mock_show_fwaas_firewall_rule.return_value = ret_dict
ret_val = api_fwaas_v2.rule_get(self.request, exp_rule.id)
self._assert_rule_return_value(ret_val, exp_rule)
self.mock_show_fwaas_firewall_rule.assert_called_once_with(exp_rule.id)
@helpers.create_mocks({neutronclient: ('update_fwaas_firewall_rule',)})
def test_rule_update(self):
rule = self.fw_rules_v2.first()
rule_dict = self.api_fw_rules_v2.first()
rule.name = 'new name'
rule.description = 'new desc'
rule.protocol = 'icmp'
rule.action = 'deny'
rule.shared = True
rule.enabled = False
rule_dict['name'] = 'new name'
rule_dict['description'] = 'new desc'
rule_dict['protocol'] = 'icmp'
rule_dict['action'] = 'deny'
rule_dict['shared'] = True
rule_dict['enabled'] = False
form_data = {'name': rule.name,
'description': rule.description,
'protocol': rule.protocol,
'action': rule.action,
'shared': rule.shared,
'enabled': rule.enabled
}
form_dict = {'firewall_rule': form_data}
ret_dict = {'firewall_rule': rule_dict}
self.mock_update_fwaas_firewall_rule.return_value = ret_dict
ret_val = api_fwaas_v2.rule_update(self.request,
rule.id, **form_data)
self._assert_rule_return_value(ret_val, rule)
self.mock_update_fwaas_firewall_rule.assert_called_once_with(
rule.id, form_dict)
@helpers.create_mocks({neutronclient: ('create_fwaas_firewall_policy', )})
def test_policy_create(self):
policy1 = self.fw_policies_v2.first()
policy1_dict = self.api_fw_policies_v2.first()
form_data = {'name': policy1.name,
'description': policy1.description,
'firewall_rules': policy1.firewall_rules,
'shared': policy1.shared,
'audited': policy1.audited
}
form_dict = {'firewall_policy': form_data}
ret_dict = {'firewall_policy': policy1_dict}
self.mock_create_fwaas_firewall_policy.return_value = ret_dict
ret_val = api_fwaas_v2.policy_create(self.request, **form_data)
self.assertIsInstance(ret_val, api_fwaas_v2.Policy)
self.assertEqual(policy1.name, ret_val.name)
self.assertTrue(ret_val.id)
self.mock_create_fwaas_firewall_policy.assert_called_once_with(
form_dict)
def _assert_policy_return_value(self, ret_val, exp_policy):
self.assertIsInstance(ret_val, api_fwaas_v2.Policy)
self.assertEqual(exp_policy.name, ret_val.name)
self.assertTrue(ret_val.id)
self.assertEqual(len(exp_policy.firewall_rules), len(ret_val.rules))
self.assertEqual(len(exp_policy.firewall_rules),
len(ret_val.firewall_rules))
for (r, exp_r) in zip(ret_val.rules, exp_policy.rules):
self.assertEqual(exp_r.id, r.id)
@helpers.create_mocks({neutronclient: ('list_fwaas_firewall_policies',
'list_fwaas_firewall_rules')})
def test_policy_list(self):
exp_policies = self.fw_policies_v2.list()
policies_dict = {'firewall_policies': self.api_fw_policies_v2.list()}
rules_dict = {'firewall_rules': self.api_fw_rules_v2.list()}
self.mock_list_fwaas_firewall_policies.return_value = policies_dict
self.mock_list_fwaas_firewall_rules.return_value = rules_dict
ret_val = api_fwaas_v2.policy_list(self.request)
for (v, d) in zip(ret_val, exp_policies):
self._assert_policy_return_value(v, d)
self.mock_list_fwaas_firewall_policies.assert_called_once_with()
self.mock_list_fwaas_firewall_rules.assert_called_once_with()
@helpers.create_mocks({neutronclient: ('list_fwaas_firewall_policies',
'list_fwaas_firewall_rules')})
def test_policy_list_for_tenant(self):
tenant_id = self.request.user.project_id
exp_policies = self.fw_policies_v2.list()
policies_dict = {'firewall_policies': self.api_fw_policies_v2.list()}
rules_dict = {'firewall_rules': self.api_fw_rules_v2.list()}
self.mock_list_fwaas_firewall_policies.side_effect = [
{'firewall_policies': []},
policies_dict,
]
self.mock_list_fwaas_firewall_rules.return_value = rules_dict
ret_val = api_fwaas_v2.policy_list_for_tenant(self.request, tenant_id)
for (v, d) in zip(ret_val, exp_policies):
self._assert_policy_return_value(v, d)
self.assertEqual(2, self.mock_list_fwaas_firewall_policies.call_count)
self.mock_list_fwaas_firewall_policies.assert_has_calls([
mock.call(tenant_id=tenant_id, shared=False),
mock.call(shared=True),
])
self.mock_list_fwaas_firewall_rules.assert_called_once_with()
@helpers.create_mocks({neutronclient: ('show_fwaas_firewall_policy',
'list_fwaas_firewall_rules')})
def test_policy_get(self):
exp_policy = self.fw_policies_v2.first()
policy_dict = self.api_fw_policies_v2.first()
# The first two rules are associated with the first policy.
api_rules = self.api_fw_rules_v2.list()[:2]
ret_dict = {'firewall_policy': policy_dict}
self.mock_show_fwaas_firewall_policy.return_value = ret_dict
filters = {'firewall_policy_id': exp_policy.id}
ret_dict = {'firewall_rules': api_rules}
self.mock_list_fwaas_firewall_rules.return_value = ret_dict
ret_val = api_fwaas_v2.policy_get(self.request, exp_policy.id)
self._assert_policy_return_value(ret_val, exp_policy)
self.mock_show_fwaas_firewall_policy.assert_called_once_with(
exp_policy.id)
self.mock_list_fwaas_firewall_rules.assert_called_once_with(**filters)
@helpers.create_mocks({neutronclient: ('show_fwaas_firewall_policy',)})
def test_policy_get_no_rule(self):
# 2nd policy is not associated with any rules.
exp_policy = self.fw_policies_v2.list()[1]
policy_dict = self.api_fw_policies_v2.list()[1]
ret_dict = {'firewall_policy': policy_dict}
self.mock_show_fwaas_firewall_policy.return_value = ret_dict
ret_val = api_fwaas_v2.policy_get(self.request, exp_policy.id)
self.assertIsInstance(ret_val, api_fwaas_v2.Policy)
self.assertEqual(exp_policy.name, ret_val.name)
self.assertTrue(ret_val.id)
self.assertFalse(len(ret_val.rules))
self.mock_show_fwaas_firewall_policy.assert_called_once_with(
exp_policy.id)
@helpers.create_mocks({neutronclient: ('update_fwaas_firewall_policy',)})
def test_policy_update(self):
policy = self.fw_policies_v2.first()
policy_dict = self.api_fw_policies_v2.first()
policy.name = 'new name'
policy.description = 'new desc'
policy.shared = True
policy.audited = False
policy_dict['name'] = 'new name'
policy_dict['description'] = 'new desc'
policy_dict['shared'] = True
policy_dict['audited'] = False
form_data = {'name': policy.name,
'description': policy.description,
'shared': policy.shared,
'audited': policy.audited
}
form_dict = {'firewall_policy': form_data}
ret_dict = {'firewall_policy': policy_dict}
self.mock_update_fwaas_firewall_policy.return_value = ret_dict
ret_val = api_fwaas_v2.policy_update(self.request,
policy.id, **form_data)
self.assertIsInstance(ret_val, api_fwaas_v2.Policy)
self.assertEqual(policy.name, ret_val.name)
self.assertTrue(ret_val.id)
self.mock_update_fwaas_firewall_policy.assert_called_once_with(
policy.id, form_dict)
@helpers.create_mocks(
{neutronclient: ('insert_rule_fwaas_firewall_policy',)})
def test_policy_insert_rule(self):
policy = self.fw_policies_v2.first()
policy_dict = self.api_fw_policies_v2.first()
new_rule_id = 'h0881d38-c3eb-4fee-9763-12de3338041d'
policy.firewall_rules.append(new_rule_id)
policy_dict['firewall_rules'].append(new_rule_id)
body = {'firewall_rule_id': new_rule_id,
'insert_before': policy.firewall_rules[1],
'insert_after': policy.firewall_rules[0]}
self.mock_insert_rule_fwaas_firewall_policy.return_value = policy_dict
ret_val = api_fwaas_v2.policy_insert_rule(self.request,
policy.id, **body)
self.assertIn(new_rule_id, ret_val.firewall_rules)
self.mock_insert_rule_fwaas_firewall_policy.assert_called_once_with(
policy.id, body)
@helpers.create_mocks(
{neutronclient: ('remove_rule_fwaas_firewall_policy',)})
def test_policy_remove_rule(self):
policy = self.fw_policies_v2.first()
policy_dict = self.api_fw_policies_v2.first()
remove_rule_id = policy.firewall_rules[0]
policy_dict['firewall_rules'].remove(remove_rule_id)
body = {'firewall_rule_id': remove_rule_id}
self.mock_remove_rule_fwaas_firewall_policy.return_value = policy_dict
ret_val = api_fwaas_v2.policy_remove_rule(self.request,
policy.id, **body)
self.assertNotIn(remove_rule_id, ret_val.firewall_rules)
self.mock_remove_rule_fwaas_firewall_policy.assert_called_once_with(
policy.id, body)
@helpers.create_mocks({neutronclient: ('create_fwaas_firewall_group', )})
def test_firewall_group_create(self):
firewall_group = self.firewall_groups_v2.first()
firewall_group_dict = self.api_firewall_groups_v2.first()
form_data = {
'name': firewall_group.name,
'description': firewall_group.description,
'ingress_firewall_policy_id':
firewall_group.ingress_firewall_policy_id,
'egress_firewall_policy_id':
firewall_group.egress_firewall_policy_id,
'admin_state_up': firewall_group.admin_state_up
}
form_dict = {'firewall_group': form_data}
ret_dict = {'firewall_group': firewall_group_dict}
self.mock_create_fwaas_firewall_group.return_value = ret_dict
ret_val = api_fwaas_v2.firewall_group_create(self.request, **form_data)
self.assertIsInstance(ret_val, api_fwaas_v2.FirewallGroup)
self.assertEqual(firewall_group.name, ret_val.name)
self.assertEqual(firewall_group.id, ret_val.id)
self.mock_create_fwaas_firewall_group.assert_called_once_with(
form_dict)
def _assert_firewall_return_value(self, ret_val, exp_firewall,
expand_policy=True):
self.assertIsInstance(ret_val, api_fwaas_v2.FirewallGroup)
self.assertEqual(exp_firewall.name, ret_val.name)
self.assertTrue(ret_val.id)
self.assertEqual(exp_firewall.ingress_firewall_policy_id,
ret_val.ingress_firewall_policy_id)
if expand_policy:
if exp_firewall.ingress_firewall_policy_id:
self.assertEqual(exp_firewall.ingress_firewall_policy_id,
ret_val.ingress_policy.id)
self.assertEqual(exp_firewall.ingress_policy.name,
ret_val.ingress_policy.name)
else:
self.assertIsNone(ret_val.ingress_policy)
if exp_firewall.egress_firewall_policy_id:
self.assertEqual(exp_firewall.egress_firewall_policy_id,
ret_val.egress_policy.id)
self.assertEqual(exp_firewall.egress_policy.name,
ret_val.egress_policy.name)
else:
self.assertIsNone(ret_val.egress_policy)
# TODO(Sarath Mekala) : Add API tests for firewall_group_create with ports,
# add port to firewall and remove port from fw.
@helpers.create_mocks({neutronclient: ('list_fwaas_firewall_groups',
'list_fwaas_firewall_policies')})
def test_firewall_group_list(self):
exp_firewalls = self.firewall_groups_v2.list()
firewalls_dict = {
'firewall_groups': self.api_firewall_groups_v2.list()}
self.mock_list_fwaas_firewall_groups.return_value = firewalls_dict
ret_val = api_fwaas_v2.firewall_group_list(self.request)
for (v, d) in zip(ret_val, exp_firewalls):
self._assert_firewall_return_value(v, d, expand_policy=False)
self.mock_list_fwaas_firewall_groups.assert_called_once_with()
@helpers.create_mocks({neutronclient: ('list_fwaas_firewall_groups',
'list_fwaas_firewall_policies')})
def test_firewall_group_list_for_tenant(self):
tenant_id = self.request.user.project_id
exp_firewalls = self.firewall_groups_v2.list()
firewalls_dict = {
'firewall_groups': self.api_firewall_groups_v2.list()}
self.mock_list_fwaas_firewall_groups.side_effect = [
firewalls_dict,
firewalls_dict,
]
ret_val = api_fwaas_v2.firewall_group_list_for_tenant(
self.request, tenant_id)
for (v, d) in zip(ret_val, exp_firewalls):
self._assert_firewall_return_value(v, d, expand_policy=False)
self.assertEqual(2, self.mock_list_fwaas_firewall_groups.call_count)
self.mock_list_fwaas_firewall_groups.assert_has_calls([
mock.call(shared=False, tenant_id=tenant_id),
mock.call(shared=True),
])
@helpers.create_mocks({neutronclient: ('list_fwaas_firewall_groups', )})
def test_fwg_port_list(self):
mock_port_id_1 = '62b974c5-48fb-4fd1-946f-5ace1d970dd4'
mock_port_id_2 = 'da012bb6-c350-4a72-b6c9-69c4f2008aa4'
mock_port_id_3 = 'c2a2ce11-71dd-49a5-84ec-2407ecb42106'
mock_groups = [
{'ports': [mock_port_id_1, mock_port_id_2]},
{'ports': []},
{'ports': [mock_port_id_3]}
]
self.mock_list_fwaas_firewall_groups.return_value = {
'firewall_groups': mock_groups
}
expected_set = {mock_port_id_1, mock_port_id_2, mock_port_id_3}
retrieved_set = api_fwaas_v2.fwg_port_list(self.request)
self.assertEqual(expected_set, retrieved_set)
@helpers.create_mocks({neutronclient: ('list_ports',
'list_fwaas_firewall_groups')})
def test_fwg_port_list_for_tenant(self):
tenant_id = self.request.user.project_id
router_port = {
'id': 'id-1',
'name': 'port-1',
'device_owner': 'network:router_interface'
}
vm_port1 = {
'id': 'id-vm_port-1',
'name': 'port-2',
'device_owner': 'compute:nova'
}
vm_port2 = {
'id': 'id-vm_port-2',
'name': 'port-2',
'device_owner': 'compute:nova'
}
gateway_port = {
'id': 'id-3',
'name': 'port-3',
'device_owner': 'network:router_gateway'
}
dhcp_port = {
'id': 'id-4',
'name': 'port-4',
'device_owner': 'network:dhcp'
}
dummy_ports = {'ports': [
router_port,
vm_port1,
vm_port2,
gateway_port,
dhcp_port,
]}
self.mock_list_ports.return_value = dummy_ports
self.mock_list_fwaas_firewall_groups.return_value = \
{'firewall_groups': []}
ports = api_fwaas_v2.fwg_port_list_for_tenant(self.request, tenant_id)
self.assertEqual(router_port['id'], ports[0]['id'])
self.assertEqual(vm_port1['id'], ports[1]['id'])
self.assertEqual(vm_port2['id'], ports[2]['id'])
self.mock_list_ports.assert_called_once_with(tenant_id=tenant_id)
self.mock_list_fwaas_firewall_groups.assert_called_once_with(
tenant_id=tenant_id)
@helpers.create_mocks({neutronclient: ('list_ports',
'list_fwaas_firewall_groups')})
def test_fwg_port_list_for_tenant_with_used_port(self):
tenant_id = self.request.user.project_id
router_port = {
'id': 'id-1',
'name': 'port-1',
'device_owner': 'network:router_interface'
}
vm_port1 = {
'id': 'id-vm_port-1',
'name': 'port-2',
'device_owner': 'compute:nova'
}
gateway_port = {
'id': 'id-3',
'name': 'port-3',
'device_owner': 'network:router_gateway'
}
dhcp_port = {
'id': 'id-4',
'name': 'port-4',
'device_owner': 'network:dhcp'
}
dummy_ports = {'ports': [
router_port,
vm_port1,
gateway_port,
dhcp_port,
]}
used_ports = {'firewall_groups': [{'ports': [router_port['id']]}]}
self.mock_list_ports.return_value = dummy_ports
self.mock_list_fwaas_firewall_groups.return_value = used_ports
ports = api_fwaas_v2.fwg_port_list_for_tenant(self.request, tenant_id)
self.assertEqual(vm_port1['id'], ports[0]['id'])
self.mock_list_ports.assert_called_once_with(tenant_id=tenant_id)
self.mock_list_fwaas_firewall_groups.assert_called_once_with(
tenant_id=tenant_id)
@helpers.create_mocks({neutronclient: ('list_ports',
'list_fwaas_firewall_groups')})
def test_fwg_port_list_for_tenant_no_match(self):
tenant_id = self.request.user.project_id
dummy_ports = {'ports': [
{'name': 'port-3', 'device_owner': 'network:router_gateway'},
{'name': 'port-4', 'device_owner': 'network:dhcp'},
]}
self.mock_list_ports.return_value = dummy_ports
self.mock_list_fwaas_firewall_groups.return_value = \
{'firewall_groups': []}
ports = api_fwaas_v2.fwg_port_list_for_tenant(self.request, tenant_id)
self.assertEqual([], ports)
self.mock_list_ports.assert_called_once_with(tenant_id=tenant_id)
self.mock_list_fwaas_firewall_groups.assert_called_once_with(
tenant_id=tenant_id)
@helpers.create_mocks({neutronclient: ('list_ports',
'list_fwaas_firewall_groups')})
def test_fwg_port_list_for_tenant_no_ports(self):
tenant_id = self.request.user.project_id
self.mock_list_ports.return_value = {'ports': []}
self.mock_list_fwaas_firewall_groups.return_value = \
{'firewall_groups': []}
ports = api_fwaas_v2.fwg_port_list_for_tenant(self.request, tenant_id)
self.assertEqual([], ports)
self.mock_list_ports.assert_called_once_with(tenant_id=tenant_id)
self.mock_list_fwaas_firewall_groups.assert_called_once_with(
tenant_id=tenant_id)
@helpers.create_mocks({neutronclient: ('show_fwaas_firewall_group',
'show_fwaas_firewall_policy')})
def test_firewall_group_get(self):
exp_firewall = self.firewall_groups_v2.first()
ret_dict = {'firewall_group': self.api_firewall_groups_v2.first()}
ingress_policy_id = exp_firewall.ingress_firewall_policy_id
ingress_policy = [p for p in self.api_fw_policies_v2.list()
if p['id'] == ingress_policy_id][0]
egress_policy_id = exp_firewall.egress_firewall_policy_id
egress_policy = [p for p in self.api_fw_policies_v2.list()
if p['id'] == egress_policy_id][0]
self.mock_show_fwaas_firewall_group.return_value = ret_dict
self.mock_show_fwaas_firewall_policy.side_effect = [
{'firewall_policy': ingress_policy},
{'firewall_policy': egress_policy}
]
ret_val = api_fwaas_v2.firewall_group_get(self.request,
exp_firewall.id)
self._assert_firewall_return_value(ret_val, exp_firewall)
self.mock_show_fwaas_firewall_group.assert_called_once_with(
exp_firewall.id)
self.assertEqual(2, self.mock_show_fwaas_firewall_policy.call_count)
self.mock_show_fwaas_firewall_policy.assert_has_calls([
mock.call(ingress_policy_id),
mock.call(egress_policy_id),
])
@helpers.create_mocks({neutronclient: ('update_fwaas_firewall_group',)})
def test_firewall_group_update(self):
firewall = self.firewall_groups_v2.first()
firewall_dict = self.api_firewall_groups_v2.first()
firewall.name = 'new name'
firewall.description = 'new desc'
firewall.admin_state_up = False
firewall_dict['name'] = 'new name'
firewall_dict['description'] = 'new desc'
firewall_dict['admin_state_up'] = False
form_data = {'name': firewall.name,
'description': firewall.description,
'admin_state_up': firewall.admin_state_up
}
form_dict = {'firewall_group': form_data}
ret_dict = {'firewall_group': firewall_dict}
self.mock_update_fwaas_firewall_group.return_value = ret_dict
ret_val = api_fwaas_v2.firewall_group_update(self.request,
firewall.id, **form_data)
self.assertIsInstance(ret_val, api_fwaas_v2.FirewallGroup)
self.assertEqual(firewall.name, ret_val.name)
self.assertTrue(ret_val.id)
self.mock_update_fwaas_firewall_group.assert_called_once_with(
firewall.id, form_dict)

View File

@ -1,33 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from openstack_dashboard.test import helpers
from neutron_fwaas_dashboard.test.test_data import utils
class TestDataLoaderMixin(object):
def _setup_test_data(self):
super(TestDataLoaderMixin, self)._setup_test_data()
utils.load_data(self)
class TestCase(TestDataLoaderMixin, helpers.TestCase):
pass
class BaseAdminViewTests(TestDataLoaderMixin, helpers.TestCase):
pass
class APITestCase(TestDataLoaderMixin, helpers.APITestCase):
pass

View File

@ -1,4 +0,0 @@
[plugin]
is_plugin=True
plugin_page_path=neutron_fwaas_dashboard.test.integration.pages
plugin_page_structure='{"Project": {"Network": {"_": ["Firewall Groups"]}}}'

View File

@ -1,21 +0,0 @@
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from openstack_dashboard.test.integration_tests.pages import basepage
class FirewallgroupsPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf):
super(FirewallgroupsPage, self).__init__(driver, conf)
self._page_title = "Firewall Groups"

View File

@ -1,24 +0,0 @@
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from openstack_dashboard.test.integration_tests import helpers
class TestNeutronFWaaSDashboardInstalled(helpers.TestCase):
def test_alarms_page_opened(self):
firewall_groups_page = \
self.home_pg.go_to_project_network_firewallgroupspage()
self.assertEqual(firewall_groups_page.page_title,
'Firewall Groups - OpenStack Dashboard')

View File

@ -1,51 +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.
# Default to Horizons test settings to avoid any missing keys
from horizon.test.settings import * # noqa
from openstack_dashboard.test.settings import * # noqa
import openstack_dashboard.enabled
from openstack_dashboard.utils import settings
import neutron_fwaas_dashboard.enabled
# pop these keys to avoid log warnings about deprecation
# update_dashboards will populate them anyway
HORIZON_CONFIG.pop('dashboards', None)
HORIZON_CONFIG.pop('default_dashboard', None)
# Update the dashboards with neutron_fwaas_dashboard
settings.update_dashboards(
[
openstack_dashboard.enabled,
neutron_fwaas_dashboard.enabled,
],
HORIZON_CONFIG,
INSTALLED_APPS
)
# Ensure any duplicate apps are removed after the update_dashboards call
INSTALLED_APPS = list(set(INSTALLED_APPS))
# --------------------
# Test-only settings
# --------------------
# TEST_GLOBAL_MOCKS_ON_PANELS: defines what and how methods should be
# mocked globally for unit tests and Selenium tests.
# 'method' is required. 'return_value' and 'side_effect'
# are optional and passed to mock.patch().
TEST_GLOBAL_MOCKS_ON_PANELS['firewalls_v2'] = {
'method': ('neutron_fwaas_dashboard.dashboards.project.firewalls_v2.panel.'
'Firewall_V2.can_access'),
'return_value': True,
}

View File

@ -1,167 +0,0 @@
# Copyright 2017 Juniper Networks
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import copy
from openstack_dashboard.test.test_data import utils
from neutron_fwaas_dashboard.api import fwaas_v2 as fwaas
def data(TEST):
# Data returned by openstack_dashboard.api.neutron wrapper.
TEST.firewall_groups_v2 = utils.TestDataContainer()
TEST.fw_policies_v2 = utils.TestDataContainer()
TEST.fw_rules_v2 = utils.TestDataContainer()
# Data return by neutronclient.
TEST.api_firewall_groups_v2 = utils.TestDataContainer()
TEST.api_fw_policies_v2 = utils.TestDataContainer()
TEST.api_fw_rules_v2 = utils.TestDataContainer()
# 1st rule (used by 1st policy)
rule1_dict = {
'action': 'allow',
'description': 'rule1 description',
'destination_ip_address': '4.5.6.7/32',
'destination_port': '1:65535',
'enabled': True,
'id': 'f0881d38-c3eb-4fee-9763-12de3338041d',
'ip_version': '4',
'name': 'rule1',
'protocol': 'tcp',
'shared': True,
'source_ip_address': '1.2.3.0/24',
'source_port': '80',
'tenant_id': '1',
}
TEST.api_fw_rules_v2.add(rule1_dict)
rule1 = fwaas.Rule(copy.deepcopy(rule1_dict))
TEST.fw_rules_v2.add(rule1)
# 2nd rule (used by 2nd policy; no name)
rule2_dict = {
'action': 'deny',
'description': '',
'destination_ip_address': None,
'destination_port': '1:65535',
'enabled': True,
'id': 'c6298a93-850f-4f64-b78a-959fd4f1e5df',
'ip_version': '6',
'name': '',
'protocol': 'udp',
'shared': False,
'source_ip_address': '2001:db8::/32',
'source_port': '80',
'tenant_id': '1',
}
TEST.api_fw_rules_v2.add(rule2_dict)
rule2 = fwaas.Rule(copy.deepcopy(rule2_dict))
TEST.fw_rules_v2.add(rule2)
# 3rd rule (not used by any policy)
rule3_dict = {
'action': 'allow',
'description': 'rule3 description',
'destination_ip_address': '4.5.6.7/32',
'destination_port': '1:65535',
'enabled': True,
'id': 'h0881d38-c3eb-4fee-9763-12de3338041d',
'ip_version': '4',
'name': 'rule3',
'protocol': None,
'shared': True,
'source_ip_address': '1.2.3.0/24',
'source_port': '80',
'tenant_id': '1',
}
TEST.api_fw_rules_v2.add(rule3_dict)
rule3 = fwaas.Rule(copy.deepcopy(rule3_dict))
TEST.fw_rules_v2.add(rule3)
# 1st policy (associated with 2 rules)
policy1_dict = {
'audited': True,
'description': 'policy with two rules',
'firewall_rules': [rule1_dict['id'], rule2_dict['id']],
'id': 'abcdef-c3eb-4fee-9763-12de3338041e',
'name': 'policy1',
'shared': True,
'tenant_id': '1',
}
TEST.api_fw_policies_v2.add(policy1_dict)
policy1 = fwaas.Policy(copy.deepcopy(policy1_dict))
policy1._apidict['rules'] = [rule1, rule2]
TEST.fw_policies_v2.add(policy1)
# 2nd policy (associated with no rules; no name)
policy2_dict = {
'audited': False,
'description': '',
'firewall_rules': [],
'id': 'cf50b331-787a-4623-825e-da794c918d6a',
'name': '',
'shared': False,
'tenant_id': '1',
}
TEST.api_fw_policies_v2.add(policy2_dict)
policy2 = fwaas.Policy(copy.deepcopy(policy2_dict))
policy2._apidict['rules'] = []
TEST.fw_policies_v2.add(policy2)
# 1st firewall group
fwg1_dict = {
'admin_state_up': True,
'description': 'firewall description',
'egress_firewall_policy_id': 'cf50b331-787a-4623-825e-da794c918d6a',
'id': '8913dde8-4915-4b90-8d3e-b95eeedb0d49',
'ingress_firewall_policy_id': 'abcdef-c3eb-4fee-9763-12de3338041e',
'name': 'firewallgroup1',
'ports': [],
'shared': False,
'status': 'PENDING_CREATE',
'tenant_id': '1',
}
TEST.api_firewall_groups_v2.add(fwg1_dict)
fwg1 = fwaas.FirewallGroup(copy.deepcopy(fwg1_dict))
fwg1._apidict['ingress_policy'] = policy1
fwg1._apidict['egress_policy'] = policy2
fwg1._apidict['port_ids'] = []
TEST.firewall_groups_v2.add(fwg1)
# 2nd firewall group (no name)
fwg2_dict = {
'admin_state_up': True,
'description': '',
'egress_firewall_policy_id': None,
'id': '1aa75150-415f-458e-bae5-5a362a4fb1f7',
'ingress_firewall_policy_id': None,
'name': '',
'ports': [],
'shared': False,
'status': 'INACTIVE',
'tenant_id': '1',
}
TEST.api_firewall_groups_v2.add(fwg2_dict)
fwg2 = fwaas.FirewallGroup(copy.deepcopy(fwg2_dict))
fwg2._apidict['ingress_policy'] = None
fwg2._apidict['egress_policy'] = None
TEST.firewall_groups_v2.add(fwg2)

View File

@ -1,28 +0,0 @@
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from openstack_dashboard.test.test_data import utils
def load_data(load_onto=None):
from neutron_fwaas_dashboard.test.test_data import fwaas_v2_data
# The order of these loaders matters, some depend on others.
loaders = (
fwaas_v2_data.data,
)
if load_onto:
for data_func in loaders:
data_func(load_onto)
return load_onto
else:
return utils.TestData(*loaders)

View File

@ -1,15 +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_info = pbr.version.VersionInfo('neutron_fwaas_dashboard')

View File

@ -1,10 +0,0 @@
---
fixes:
- |
"Add Router" and "Remove Router" operations are now controlled by
``update_firewall`` rule in the policy.json file.
Previously they were controlled by ``get_firewall`` rule and non-existing
rules like ``add_router`` and ``remove_router``.
If operators define their custom policy rules for ``add_router`` and
``remove_router``, such policy rules need to updated accordingly.
[`bug 1703952 <https://bugs.launchpad.net/neutron-fwaas-dashboard/+bug/1703952>`__]

View File

@ -1,14 +0,0 @@
---
prelude: >
Neutron-fwaas-dashboard project is now deprecated in the Neutron stadium.
deprecations:
- |
Due to lack of maintainers neutron-fwaas-dashboard project is now
deprecated in the Neutron stadium. There is no planned releases of this
project in the ``Victoria`` cycle.
In ``W`` cycle project will be moved out from the stadium to the unofficial
OpenStack projects.
If You want to step in and be maintainer of this project to keep it in the
Neutron stadium, please contact the ``neutron team`` via
openstack-discuss@lists.openstack.org or IRC channel #openstack-neutron
@freenode.

View File

@ -1,7 +0,0 @@
---
upgrade:
- |
FWaaS v1 support was dropped.
FWaaS v1 has been deprecated in neutron-fwaas and was dropped in Stein
release. Along with neutron-fwaas, neutron-fwaas-dashboard dropped
its support.

View File

@ -1,6 +0,0 @@
---
upgrade:
- |
Python 2.7 support has been dropped. Last release of neutron-fwaas
dashboard to support py2.7 is OpenStack Train. The minimum version
of Python now supported by neutron-fwaas-dashboard is Python 3.6.

View File

@ -1,7 +0,0 @@
---
features:
- |
A panel for FWaaS v2 is newly added. There is no specific installation
process. After installing the new release of neutron-fwaas-dashboard,
if FWaaS v2 API is available on your neutron deployment, the panel for
FWaaS v2 will be displayed.

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