././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3870573 neutron_vpnaas_dashboard-15.0.0/0000775000175000017500000000000015257164617015506 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2604258 neutron_vpnaas_dashboard-15.0.0/.zuul.yaml0000664000175000017500000000031215257164532017437 0ustar00zuulzuul- project: templates: - check-requirements - horizon-non-primary-django-jobs - openstack-python3-jobs-horizon - publish-openstack-docs-pti - release-notes-jobs-python3 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.2630496 neutron_vpnaas_dashboard-15.0.0/AUTHORS0000664000175000017500000000254715257164617016566 0ustar00zuulzuulAkihiro Motoki Andreas Jaeger Cao Xuan Hoang Corey Bryant Dirk Mueller Dmitriy Chubinidze Doug Hellmann Elod Illes Ghanshyam Mann Hervé Beraud Ivan Anfimov Ivan Kolodyazhny Maximilian Stinsky Monty Taylor OpenStack Release Bot Premysl Kouril Rafael Weingärtner Reik Keutterling Rodolfo Alonso Hernandez Sean McGinnis ShangXiao Stephen Finucane Takashi Kajinami Takashi Kajinami Van Hung Pham YAMAMOTO Takashi caoyuan huang.zhiping jacky06 jiaqi07 lajoskatona manchandavishal niuke shanyunfan33 zhang.lei zhanghao ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2604258 neutron_vpnaas_dashboard-15.0.0/CONTRIBUTING.rst0000664000175000017500000000123615257164532020145 0ustar00zuulzuulIf 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-vpnaas-dashboard ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.2310476 neutron_vpnaas_dashboard-15.0.0/ChangeLog0000664000175000017500000002155415257164617017267 0ustar00zuulzuulCHANGES ======= 15.0.0 ------ * Imported Translations from Zanata * Send flat update bodies to openstacksdk * Fix KeyError when loading VPN and IPsec connection edit forms * Fix router name and connections expansion in VPN services table * Fix for issue with translations * Update packaging configuration * Drop Python 3.10 * Imported Translations from Zanata * Update Babel configuration * Add bug tracker URL * Imported Translations from Zanata * Update master for stable/2026.1 14.0.0 ------ * Imported Translations from Zanata * Imported Translations from Zanata * Bump flake8-import-order * Imported Translations from Zanata * Imported Translations from Zanata * reno: Update master for unmaintained/2024.1 * Migrate from neutronclient to SDK * Imported Translations from Zanata * Imported Translations from Zanata * Migrate setup configuration to pyproject.toml * Update master for stable/2025.2 * Add additional auth, encryption and PFS choices * Replace deprecated assertQuerysetEqual 13.0.0 ------ * Imported Translations from Zanata * Add help text for initiator state * Imported Translations from Zanata * Reword help text to avoid Unicode apostrophe * docs: add information about restart Apache service for RHEL/CentOS Stream * Cleanup deliverables info * Cleanup setup.py * Add help text for DPD actions * Normalize cryptographic algorithm names * Imported Translations from Zanata * tox: Remove basepython and ineffective ignore\_basepython\_conflict * Use systemctl command to manage service * Imported Translations from Zanata * Imported Translations from Zanata * Remove unicode prefix from code * Drop environments for nose * Remove tags from README * remove unicode from code * Update master for stable/2025.1 12.0.0 ------ * Update default envlist * Bump hacking * reno: Update master for unmaintained/2023.1 * Update supported python versions according to tested runtimes * Fix outdated tox minversion * tox: Drop envdir * Update master for stable/2024.2 * reno: Update master for unmaintained/zed * Imported Translations from Zanata 11.0.0 ------ * Explicitly convert \`\`assertQuerysetEqual\`\` input parameters * Update master for stable/2024.1 * reno: Update master for unmaintained/xena * reno: Update master for unmaintained/wallaby * reno: Update master for unmaintained/victoria 10.0.0.0rc1 ----------- * reno: Update master for unmaintained/yoga * Update master for stable/2023.2 * Imported Translations from Zanata 9.0.0 ----- * setup.cfg: Replace dashes with underscores * Imported Translations from Zanata * Update master for stable/2023.1 8.0.0 ----- * Fix pdf-docs target * Switch to 2023.1 Python3 unit tests and generic template name * Update master for stable/zed 7.0.0 ----- * Imported Translations from Zanata * Update master for stable/wallaby * Update master for stable/xena * Drop lower-constraints.txt and its testing * Imported Translations from Zanata * Use TOX\_CONSTRAINTS\_FILE * Update python testing as per zed cycle testing runtime * Replace deprecated django.conf.urls.url() * Replace deprecated ugettext\_lazy and ungettext\_lazy * Fix lower constraints * Update master for stable/yoga 6.0.0 ----- * Imported Translations from Zanata * Fix lower-constraints * Imported Translations from Zanata * Add Python3 wallaby unit tests * Update master for stable/victoria 3.0.0 ----- * Cleanup for Refactor-error-messages * [goal] Migrate testing to ubuntu focal * Add aggressive negotiation mode for ikepolicy * Imported Translations from Zanata * drop mock from lower-constraints and requirements * Stop to use the \_\_future\_\_ module * Switch to newer openstackdocstheme and reno versions * Fix hacking min version to 3.0.1 * Imported Translations from Zanata * Imported Translations from Zanata * Bump default tox env from py37 to py38 * Add py38 package metadata * Imported Translations from Zanata * Add Python3 victoria unit tests * Update master for stable/ussuri 2.0.0 ----- * Imported Translations from Zanata * Fix pyScss version in lower-constraints.txt * Update hacking for Python3 * Drop Django 1.11 support * translation: drop babel extractor definitions * [ussuri][goal] Drop python 2.7 support and testing * Switch to official Ussuri jobs * Imported Translations from Zanata * Update master for stable/train * Imported Translations from Zanata * Fix help text for "Authorization algorithm" * Add tox env and job for Django 2.2 * Update the constraints url 1.6.0 ----- * Change PDF file name * PDF documentation build * Add release notes link for README * Sync Sphinx requirement * Imported Translations from Zanata * Add Python 3 Train unit tests * Imported Translations from Zanata * Replace git.openstack.org URLs with opendev.org URLs * OpenDev Migration Patch * Dropping the py35 testing * Imported Translations from Zanata * Update master for stable/stein * Imported Translations from Zanata 1.5.1 ----- * Imported Translations from Zanata * Imported Translations from Zanata * Fix devstack plugin to work with Python 3 * Bump hacking to 1.1.0 1.5.0 ----- * Imported Translations from Zanata * Remove use\_mox usage * Update the VPNaaS dashboard documentation link * Support alrogithms other than sha1 * Bump horizon lower-constraints * Change openstack-dev to openstack-discuss * Imported Translations from Zanata * Cleanup zuul.yaml * switch documentation job to new PTI * import zuul job settings from project-config * Imported Translations from Zanata * Imported Translations from Zanata * Update reno for stable/rocky 1.4.0 ----- * Switch test runner to django default runner * fix tox python3 overrides * Add python3 django 1.11 job instead of django 2.0 job 1.3.0 ----- * Imported Translations from Zanata * Follow the new PTI for document build * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Show team and repo badges on README * Fix pep8 errors * Django 2.0 support * add lower-constraints job * Updated from global requirements * Imported Translations from Zanata * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Avoid tox-install.sh * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Drop mox3 from test-requirements.txt * Drop mox usage from VPNaaS panel tests * Drop mox usage from VPNaaS API tests * Imported Translations from Zanata * Imported Translations from Zanata * Drop BRANCH\_NAME and CLIENT\_NAME in tox.ini * Updated from global requirements * [trivial] fixed typo in vpn/forms.py * Imported Translations from Zanata * Update reno for stable/queens * Imported Translations from Zanata 1.2.1 ----- * Imported Translations from Zanata * Correct django template pattern in babel-django.cfg * Imported Translations from Zanata * Add VPN service: List only routers with external gateway * Replace None with - (hyphen) for value None * Fix unnecessary capitalized messages * Make switched multiple choice field work * Imported Translations from Zanata * Imported Translations from Zanata * doc: remove symlink for releasenotes * Updated from global requirements * Imported Translations from Zanata * Updated from global requirements 1.2.0 ----- * Fix the typo * Align tox\_install.sh with other projects * Remove setting of version/release from releasenotes * Updated from global requirements * .gitignore: add translation catalogs (.mo and .pot) * Disable status handling in VPN service table * Use TextInput widget for readonly choice fields * Use ThemableChoiceField * Allow peer\_id and peer\_address input formats other than IP address * IPsec site connection should support id * Cleanup unnessary reverse\_lazy() in code * Cleanup unnessary ID attribute in code * Fix VPN Service Details page * Add deliverables info * Update tox from py34 to py35 * Updated from global requirements * Use 'IPsec' consistently * Fix typo 1.1.0 ----- * Use flake8-import-order plugin * Updated from global requirements * Add support for Endpoint Group * devstack: Remove workaround for horizon plugin framework * Move VPN panel in the left menu lower by default * Release note for stable/pike 0.1.0 ----- * Update Korean translation * Update URLs in documents according to document migration * Ensure log messages are not translated * Translation import * Translation import for ja * tox\_install: Don't leave IFS set * Updated from global requirements * Updated from global requirements * Manually sync with g-r * Update openstackdocstheme configuration * Consume horizon master * Prepare initial documentationn * DevStack plugin for neutron-vpnaas-dashboard * Add .gitreview * Change the hirarchy of vpn panel * Setup release notes * Setup documentation build * Cleanup test env * Import API tests * Pass unit tests * Update flake8 and hacking rules * Import VPNaaS test data * Use horizon local fork w/o VPNaaS dashboard * Setup test environment * Add some required python files * Initial commit ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2604258 neutron_vpnaas_dashboard-15.0.0/HACKING.rst0000664000175000017500000000073115257164532017301 0ustar00zuulzuul=========================================== Neutron VPNaaS 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. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2604258 neutron_vpnaas_dashboard-15.0.0/LICENSE0000664000175000017500000002363715257164532016522 0ustar00zuulzuul 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. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3870573 neutron_vpnaas_dashboard-15.0.0/PKG-INFO0000644000175000017500000000335715257164617016611 0ustar00zuulzuulMetadata-Version: 2.4 Name: neutron-vpnaas-dashboard Version: 15.0.0 Summary: Neutron VPNaaS UI for Horizon Author-email: OpenStack License-Expression: Apache-2.0 Project-URL: Bug Tracker, https://bugs.launchpad.net/neutron-vpnaas-dashboard Project-URL: Documentation, https://docs.openstack.org/neutron-vpnaas-dashboard/latest/ Project-URL: Source Code, https://opendev.org/openstack/neutron-vpnaas-dashboard Classifier: Environment :: OpenStack Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: System Administrators Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: Implementation :: CPython Requires-Python: >=3.11 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: pbr!=2.1.0,>=2.0.0 Requires-Dist: horizon>=24.0.0 Requires-Dist: openstacksdk>=4.5.0 Dynamic: license-file Dynamic: requires-dist ======================== Neutron VPNaaS Dashboard ======================== .. image:: https://governance.openstack.org/tc/badges/neutron-vpnaas-dashboard.svg .. Change things from this point on OpenStack Dashboard panels for Neutron VPNaaS * Documentation: https://docs.openstack.org/neutron-vpnaas-dashboard/latest/ * Source: https://opendev.org/openstack/neutron-vpnaas-dashboard * Bugs: https://bugs.launchpad.net/neutron-vpnaas-dashboard * Release Notes: https://docs.openstack.org/releasenotes/neutron-vpnaas-dashboard/ ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.261426 neutron_vpnaas_dashboard-15.0.0/README.rst0000664000175000017500000000102115257164532017163 0ustar00zuulzuul======================== Neutron VPNaaS Dashboard ======================== .. image:: https://governance.openstack.org/tc/badges/neutron-vpnaas-dashboard.svg .. Change things from this point on OpenStack Dashboard panels for Neutron VPNaaS * Documentation: https://docs.openstack.org/neutron-vpnaas-dashboard/latest/ * Source: https://opendev.org/openstack/neutron-vpnaas-dashboard * Bugs: https://bugs.launchpad.net/neutron-vpnaas-dashboard * Release Notes: https://docs.openstack.org/releasenotes/neutron-vpnaas-dashboard/ ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.261426 neutron_vpnaas_dashboard-15.0.0/babel-django.cfg0000664000175000017500000000016715257164532020474 0ustar00zuulzuul[python: **.py] [django: **/templates/**.html] [extractors] django = horizon.utils.babel_extract_django:extract_django ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2624261 neutron_vpnaas_dashboard-15.0.0/babel-djangojs.cfg0000664000175000017500000000017415257164532021027 0ustar00zuulzuul[javascript: **.js] [angular: **/static/**.html] [extractors] angular = horizon.utils.babel_extract_angular:extract_angular ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3590555 neutron_vpnaas_dashboard-15.0.0/devstack/0000775000175000017500000000000015257164617017312 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2624261 neutron_vpnaas_dashboard-15.0.0/devstack/README.rst0000664000175000017500000000174215257164532021001 0ustar00zuulzuul============================================ DevStack plugin for neutron-vpnaas-dashboard ============================================ This is setup as a DevStack plugin. For more information on DevStack plugins, see the `DevStack Plugins documentation `__. How to enable VPNaaS dashboard ------------------------------ Add the following to the localrc section of your local.conf. You need to configure VPNaaS DevStack plugin as well. DevStack plugin for VPNaaS dashaboard is configured, ``neutron-vpnaas-dashboard`` service is automatically enabled. It is suggested to enable the DevStack plugin for neutron-vpnaas, if you run horizon and neutron-server on a same server like all-in-one environment. .. code-block:: none [[local|localrc]] enable_plugin neutron-vpnaas https://opendev.org/openstack/neutron-vpnaas master enable_plugin neutron-vpnaas-dashboard https://opendev.org/openstack/neutron-vpnaas-dashboard master ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2624261 neutron_vpnaas_dashboard-15.0.0/devstack/plugin.sh0000664000175000017500000000412315257164532021140 0ustar00zuulzuul# plugin.sh - DevStack plugin.sh dispatch script neutron-vpnaas-dashboard VPNAAS_DASHBOARD_DIR=$(cd $(dirname $BASH_SOURCE)/.. && pwd) VPNAAS_ENABLED_DIR=$VPNAAS_DASHBOARD_DIR/neutron_vpnaas_dashboard/enabled HORIZON_ENABLED_DIR=$DEST/horizon/openstack_dashboard/local/enabled function install_neutron_vpnaas_dashboard { setup_develop $VPNAAS_DASHBOARD_DIR } function configure_neutron_vpnaas_dashboard { cp -a $VPNAAS_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 $VPNAAS_DASHBOARD_DIR/neutron_vpnaas_dashboard/locale ]; then (cd $VPNAAS_DASHBOARD_DIR/neutron_vpnaas_dashboard; \ DJANGO_SETTINGS_MODULE=openstack_dashboard.settings $PYTHON ../manage.py compilemessages) fi } # check for service enabled if is_service_enabled neutron-vpnaas-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 VPNaaS Dashboard" install_neutron_vpnaas_dashboard elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then # Configure after the other layer 1 and 2 services have been configured echo_summary "Configurng Neutron VPNaaS Dashboard" configure_neutron_vpnaas_dashboard elif [[ "$1" == "stack" && "$2" == "extra" ]]; then # no-op : fi if [[ "$1" == "unstack" ]]; then # Remove enabled file(s) for _enabled_file in $VPNAAS_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 # no-op : fi fi ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2624261 neutron_vpnaas_dashboard-15.0.0/devstack/settings0000664000175000017500000000013415257164532021067 0ustar00zuulzuul# settings file for neutron-vpnaas-dashboard plugin enable_service neutron-vpnaas-dashboard ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3590555 neutron_vpnaas_dashboard-15.0.0/doc/0000775000175000017500000000000015257164617016253 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2624261 neutron_vpnaas_dashboard-15.0.0/doc/requirements.txt0000664000175000017500000000045715257164532021541 0ustar00zuulzuul# The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. sphinx>=2.0.0,!=2.1.0 # BSD openstackdocstheme>=2.2.1 # Apache-2.0 reno>=3.1.0 # Apache-2.0 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3590555 neutron_vpnaas_dashboard-15.0.0/doc/source/0000775000175000017500000000000015257164617017553 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2634263 neutron_vpnaas_dashboard-15.0.0/doc/source/conf.py0000664000175000017500000001524615257164532021056 0ustar00zuulzuul# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # 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 PROJECT = 'neutron-vpnaas-dashboard' BASE_DIR = os.path.dirname(os.path.abspath(__file__)) ROOT = os.path.abspath(os.path.join(BASE_DIR, "..", "..")) sys.path.insert(0, ROOT) # 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-vpnaas-dashboard' openstackdocs_pdf_link = True openstackdocs_auto_name = False openstackdocs_bug_project = 'neutron-vpnaas-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 = 'Neutron VPNaaS Dashboard' copyright = '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_vpnaas_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 = '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 # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = [] # If 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 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 = 'neutronvpnaasdashboarddoc' # -- Options for LaTeX output ------------------------------------------------ latex_documents = [ ('index', 'doc-neutron-vpnaas-dashboard.tex', 'Neutron VPNaaS Dashboard Documentation', 'Neutron Contributors', 'howto'), ] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3600557 neutron_vpnaas_dashboard-15.0.0/doc/source/configuration/0000775000175000017500000000000015257164617022422 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2634263 neutron_vpnaas_dashboard-15.0.0/doc/source/configuration/index.rst0000664000175000017500000000177615257164532024272 0ustar00zuulzuul.. 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 VPNaaS dashboard has no configuration option. It checks if Neutron VPNaaS service is enabled in your neutron server and the VPNaaS panel is displayed if enabled. For more configurations, see `Deployment & Configuration `__ in the Horizon documentation. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3600557 neutron_vpnaas_dashboard-15.0.0/doc/source/contributor/0000775000175000017500000000000015257164617022125 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2634263 neutron_vpnaas_dashboard-15.0.0/doc/source/contributor/devstack-plugin.rst0000664000175000017500000000005215257164532025750 0ustar00zuulzuul.. include:: ../../../devstack/README.rst ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2634263 neutron_vpnaas_dashboard-15.0.0/doc/source/contributor/index.rst0000664000175000017500000000175715257164532023774 0ustar00zuulzuul.. 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-vpnaas-dashboard now. See `Horizon Developer Documents `__ for general topic on developing a dashboard on horizon. ---- .. toctree:: :maxdepth: 1 DevStack plugin ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2634263 neutron_vpnaas_dashboard-15.0.0/doc/source/index.rst0000664000175000017500000000174215257164532021414 0ustar00zuulzuul.. 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 VPNaaS Dashboard Project ================================ Neutron VPNaaS Dashboard is a horizon plugin for Neutron VPNaaS. .. toctree:: :maxdepth: 1 install/index configuration/index contributor/index Release Notes ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3600557 neutron_vpnaas_dashboard-15.0.0/doc/source/install/0000775000175000017500000000000015257164617021221 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2644265 neutron_vpnaas_dashboard-15.0.0/doc/source/install/index.rst0000664000175000017500000000505215257164532023060 0ustar00zuulzuul.. 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-vpnaas-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-vpnaas-dashboard into the same python environment where horizon is installed. .. code-block:: console $ git clone https://opendev.org/openstack/neutron-vpnaas-dashboard $ cd neutron-vpnaas-dashboard $ sudo pip install . Enable the horizon plugin. .. code-block:: console $ cp neutron_vpnaas_dashboard/enabled/_7100_project_vpn_panel.py \ /opt/stack/horizon/openstack_dashboard/local/enabled/_7100_project_vpn_panel.py .. 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 VPNaaS dashboard, change the number of the file. .. note:: For more detail of the horizon plugin settings, see `Pluggable Settings `__ in the horizon documentation. Compile the message catalogs of Neutron VPNaaS dashboard. .. code-block:: console $ cd neutron-vpnaas-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 (for RHEL/CentOS Stream): .. code-block:: console $ sudo systemctl restart httpd Restart Apache (for Ubuntu): .. code-block:: console $ sudo systemctl restart apache2 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2644265 neutron_vpnaas_dashboard-15.0.0/manage.py0000775000175000017500000000152015257164532017305 0ustar00zuulzuul#!/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_vpnaas_dashboard.test.settings") execute_from_command_line(sys.argv) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3610556 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/0000775000175000017500000000000015257164617022557 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2644265 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/__init__.py0000664000175000017500000000000015257164532024652 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3630557 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/api/0000775000175000017500000000000015257164617023330 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2644265 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/api/__init__.py0000664000175000017500000000000015257164532025423 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2654266 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/api/vpn.py0000664000175000017500000004323015257164532024503 0ustar00zuulzuul# Copyright 2013, Mirantis Inc # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from collections import OrderedDict from horizon.utils.memoized import memoized from openstack_dashboard.api import neutron from openstack_dashboard.contrib.developer.profiler import api as profiler networkclient = neutron.networkclient class IKEPolicy(neutron.NeutronAPIDictWrapper): """Wrapper for neutron VPN IKE policy.""" class IPsecPolicy(neutron.NeutronAPIDictWrapper): """Wrapper for neutron VPN IPsec policy.""" class AdminStateDictWrapper(neutron.NeutronAPIDictWrapper): """Wrapper restoring the ``admin_state_up`` key openstacksdk renamed. openstacksdk exposes the admin state as ``is_admin_state_up`` while the dashboard views, forms and templates read ``admin_state_up``. Restore the legacy key, like NeutronAPIDictWrapper does for ``port_security_enabled``. """ def __init__(self, apidict): if 'is_admin_state_up' in apidict and 'admin_state_up' not in apidict: apidict['admin_state_up'] = apidict['is_admin_state_up'] super().__init__(apidict) class IPsecSiteConnection(AdminStateDictWrapper): """Wrapper for neutron IPsec site connection.""" class VPNService(AdminStateDictWrapper): """Wrapper for neutron VPN service.""" class EndpointGroup(neutron.NeutronAPIDictWrapper): """Wrapper for neutron Endpoint Group.""" @profiler.trace def vpnservice_create(request, **kwargs): """Create VPN service :param request: request context :param admin_state_up: admin state (default on) :param name: name for VPN service :param description: description for VPN service :param router_id: router id for router of VPN service :param subnet_id: subnet id for subnet of VPN service """ body = {'admin_state_up': kwargs['admin_state_up'], 'name': kwargs['name'], 'description': kwargs['description'], 'router_id': kwargs['router_id']} if kwargs.get('subnet_id'): body['subnet_id'] = kwargs['subnet_id'] vpnservice = networkclient(request).create_vpn_service(**body) return VPNService(vpnservice.to_dict()) @profiler.trace def vpnservice_list(request, **kwargs): return _vpnservice_list(request, expand_subnet=True, expand_router=True, expand_conns=True, **kwargs) def _vpnservice_list(request, expand_subnet=False, expand_router=False, expand_conns=False, **kwargs): vpnservices = networkclient(request).vpn_services(**kwargs) vpns_dicts = [vpn.to_dict() for vpn in vpnservices] if expand_subnet: subnets = neutron.subnet_list(request) subnet_dict = OrderedDict((s.id, s) for s in subnets) for s in vpns_dicts: if s.get('subnet_id'): s['subnet_name'] = subnet_dict.get(s['subnet_id']).cidr if expand_router: routers = neutron.router_list(request) router_dict = OrderedDict((r.id, r) for r in routers) for s in vpns_dicts: s['router_name'] = router_dict.get(s['router_id']).name_or_id if expand_conns: ipsecsiteconns = _ipsecsiteconnection_list(request, **kwargs) for s in vpns_dicts: s['ipsecsiteconns'] = [c.id for c in ipsecsiteconns if c.vpnservice_id == s['id']] return [VPNService(v) for v in vpns_dicts] @profiler.trace def vpnservice_get(request, vpnservice_id): return _vpnservice_get(request, vpnservice_id, expand_subnet=True, expand_router=True, expand_conns=True) def _vpnservice_get(request, vpnservice_id, expand_subnet=False, expand_router=False, expand_conns=False): vpnservice = networkclient(request).get_vpn_service( vpnservice_id).to_dict() if expand_subnet and ('subnet_id' in vpnservice): if vpnservice['subnet_id'] is not None: vpnservice['subnet'] = neutron.subnet_get( request, vpnservice['subnet_id']) if expand_router: vpnservice['router'] = neutron.router_get( request, vpnservice['router_id']) if expand_conns: ipsecsiteconns = _ipsecsiteconnection_list(request) vpnservice['ipsecsiteconns'] = [c for c in ipsecsiteconns if c.vpnservice_id == vpnservice['id']] return VPNService(vpnservice) @profiler.trace def vpnservice_update(request, vpnservice_id, **kwargs): vpnservice = networkclient(request).update_vpn_service( vpnservice_id, **kwargs).to_dict() return VPNService(vpnservice) @profiler.trace def vpnservice_delete(request, vpnservice_id): networkclient(request).delete_vpn_service(vpnservice_id) @profiler.trace def endpointgroup_create(request, **kwargs): """Create Endpoint Group :param request: request context :param name: name for Endpoint Group :param description: description for Endpoint Group :param type: type of Endpoint Group :param endpoints: endpoint(s) of Endpoint Group """ body = {'name': kwargs['name'], 'description': kwargs['description'], 'type': kwargs['type'], 'endpoints': kwargs['endpoints'] } endpointgroup = networkclient(request).create_vpn_endpoint_group(**body) return EndpointGroup(endpointgroup.to_dict()) @profiler.trace def endpointgroup_list(request, **kwargs): return _endpointgroup_list(request, expand_conns=True, **kwargs) def _endpointgroup_list(request, expand_conns=False, **kwargs): endpointgroups = networkclient(request).vpn_endpoint_groups(**kwargs) vpn_epg_dicts = [epg.to_dict() for epg in endpointgroups] if expand_conns: ipsecsiteconns = _ipsecsiteconnection_list(request) for g in vpn_epg_dicts: g['ipsecsiteconns'] = [ c.id for c in ipsecsiteconns if (c.get('local_ep_group_id') == g['id'] or c.get('peer_ep_group_id') == g['id'])] return [EndpointGroup(v) for v in vpn_epg_dicts] @profiler.trace def endpointgroup_get(request, endpoint_group_id): return _endpointgroup_get(request, endpoint_group_id, expand_conns=True) def _endpointgroup_get(request, endpoint_group_id, expand_conns=False): endpointgroup = networkclient(request).get_vpn_endpoint_group( endpoint_group_id).to_dict() if expand_conns: ipsecsiteconns = _ipsecsiteconnection_list(request) endpointgroup['ipsecsiteconns'] = [ c for c in ipsecsiteconns if (c.get('local_ep_group_id') == endpointgroup['id'] or c.get('peer_ep_group_id') == endpointgroup['id'])] return EndpointGroup(endpointgroup) @profiler.trace def endpointgroup_update(request, endpoint_group_id, **kwargs): endpointgroup = networkclient(request).update_vpn_endpoint_group( endpoint_group_id, **kwargs).to_dict() return EndpointGroup(endpointgroup) @profiler.trace def endpointgroup_delete(request, endpoint_group_id): networkclient(request).delete_vpn_endpoint_group(endpoint_group_id) @profiler.trace def ikepolicy_create(request, **kwargs): """Create IKE policy :param request: request context :param name: name for IKE policy :param description: description for IKE policy :param auth_algorithm: authorization algorithm for IKE policy :param encryption_algorithm: encryption algorithm for IKE policy :param ike_version: IKE version for IKE policy :param lifetime: Lifetime Units and Value for IKE policy :param pfs: Perfect Forward Secrecy for IKE policy :param phase1_negotiation_mode: IKE Phase1 negotiation mode for IKE policy """ body = {'name': kwargs['name'], 'description': kwargs['description'], 'auth_algorithm': kwargs['auth_algorithm'], 'encryption_algorithm': kwargs['encryption_algorithm'], 'ike_version': kwargs['ike_version'], 'lifetime': kwargs['lifetime'], 'pfs': kwargs['pfs'], 'phase1_negotiation_mode': kwargs['phase1_negotiation_mode']} ikepolicy = networkclient(request).create_vpn_ike_policy(**body).to_dict() return IKEPolicy(ikepolicy) @profiler.trace def ikepolicy_list(request, **kwargs): return _ikepolicy_list(request, expand_conns=True, **kwargs) def _ikepolicy_list(request, expand_conns=False, **kwargs): ikepolicies = networkclient(request).vpn_ike_policies( **kwargs) vpn_ikep_dicts = [ikep.to_dict() for ikep in ikepolicies] if expand_conns: ipsecsiteconns = _ipsecsiteconnection_list(request, **kwargs) for p in vpn_ikep_dicts: p['ipsecsiteconns'] = [c.id for c in ipsecsiteconns if c.ikepolicy_id == p['id']] return [IKEPolicy(v) for v in vpn_ikep_dicts] @profiler.trace def ikepolicy_get(request, ikepolicy_id): return _ikepolicy_get(request, ikepolicy_id, expand_conns=True) def _ikepolicy_get(request, ikepolicy_id, expand_conns=False): ikepolicy = networkclient(request).get_vpn_ike_policy( ikepolicy_id).to_dict() if expand_conns: ipsecsiteconns = _ipsecsiteconnection_list(request) ikepolicy['ipsecsiteconns'] = [c for c in ipsecsiteconns if c.ikepolicy_id == ikepolicy['id']] return IKEPolicy(ikepolicy) @profiler.trace def ikepolicy_update(request, ikepolicy_id, **kwargs): ikepolicy = networkclient(request).update_vpn_ike_policy( ikepolicy_id, **kwargs).to_dict() return IKEPolicy(ikepolicy) @profiler.trace def ikepolicy_delete(request, ikepolicy_id): networkclient(request).delete_vpn_ike_policy(ikepolicy_id) @profiler.trace def ipsecpolicy_create(request, **kwargs): """Create IPsec policy :param request: request context :param name: name for IPsec policy :param description: description for IPsec policy :param auth_algorithm: authorization algorithm for IPsec policy :param encapsulation_mode: encapsulation mode for IPsec policy :param encryption_algorithm: encryption algorithm for IPsec policy :param lifetime: Lifetime Units and Value for IPsec policy :param pfs: Perfect Forward Secrecy for IPsec policy :param transform_protocol: Transform Protocol for IPsec policy """ body = {'name': kwargs['name'], 'description': kwargs['description'], 'auth_algorithm': kwargs['auth_algorithm'], 'encapsulation_mode': kwargs['encapsulation_mode'], 'encryption_algorithm': kwargs['encryption_algorithm'], 'lifetime': kwargs['lifetime'], 'pfs': kwargs['pfs'], 'transform_protocol': kwargs['transform_protocol'] } ipsecpolicy = networkclient(request).create_vpn_ipsec_policy(**body) return IPsecPolicy(ipsecpolicy.to_dict()) @profiler.trace def ipsecpolicy_list(request, **kwargs): return _ipsecpolicy_list(request, expand_conns=True, **kwargs) def _ipsecpolicy_list(request, expand_conns=False, **kwargs): ipsecpolicies = networkclient(request).vpn_ipsec_policies( **kwargs) ipsec_dicts = [ipsec.to_dict() for ipsec in ipsecpolicies] if expand_conns: ipsecsiteconns = _ipsecsiteconnection_list(request, **kwargs) for p in ipsec_dicts: p['ipsecsiteconns'] = [c.id for c in ipsecsiteconns if c.ipsecpolicy_id == p['id']] return [IPsecPolicy(v) for v in ipsec_dicts] @profiler.trace def ipsecpolicy_get(request, ipsecpolicy_id): return _ipsecpolicy_get(request, ipsecpolicy_id, expand_conns=True) def _ipsecpolicy_get(request, ipsecpolicy_id, expand_conns=False): ipsecpolicy = networkclient(request).get_vpn_ipsec_policy( ipsecpolicy_id).to_dict() if expand_conns: ipsecsiteconns = _ipsecsiteconnection_list(request) ipsecpolicy['ipsecsiteconns'] = [c for c in ipsecsiteconns if (c.ipsecpolicy_id == ipsecpolicy['id'])] return IPsecPolicy(ipsecpolicy) @profiler.trace def ipsecpolicy_update(request, ipsecpolicy_id, **kwargs): ipsecpolicy = networkclient(request).update_vpn_ipsec_policy( ipsecpolicy_id, **kwargs).to_dict() return IPsecPolicy(ipsecpolicy) @profiler.trace def ipsecpolicy_delete(request, ipsecpolicy_id): networkclient(request).delete_vpn_ipsec_policy(ipsecpolicy_id) @profiler.trace def ipsecsiteconnection_create(request, **kwargs): """Create IPsec site connection :param request: request context :param name: name for IPsec site connection :param description: description for IPsec site connection :param dpd: dead peer detection action, interval and timeout :param ikepolicy_id: IKE policy associated with this connection :param initiator: initiator state :param ipsecpolicy_id: IPsecPolicy associated with this connection :param mtu: MTU size for the connection :param peer_address: Peer gateway public address :param peer_cidrs: remote subnet(s) in CIDR format :param peer_id: Peer router identity for authentication" :param psk: Pre-Shared Key string :param vpnservice_id: VPN service associated with this connection :param admin_state_up: admin state (default on) """ body = { 'name': kwargs['name'], 'description': kwargs['description'], 'dpd': kwargs['dpd'], 'ikepolicy_id': kwargs['ikepolicy_id'], 'initiator': kwargs['initiator'], 'ipsecpolicy_id': kwargs['ipsecpolicy_id'], 'mtu': kwargs['mtu'], 'peer_address': kwargs['peer_address'], 'peer_id': kwargs['peer_id'], 'psk': kwargs['psk'], 'vpnservice_id': kwargs['vpnservice_id'], 'admin_state_up': kwargs['admin_state_up'] } cidrs = kwargs.get('peer_cidrs', []) if not cidrs: body['local_ep_group_id'] = kwargs['local_ep_group_id'] body['peer_ep_group_id'] = kwargs['peer_ep_group_id'] else: body['peer_cidrs'] = kwargs['peer_cidrs'] ipsecsiteconnection = networkclient( request).create_vpn_ipsec_site_connection(**body).to_dict() return IPsecSiteConnection(ipsecsiteconnection) @profiler.trace @memoized def ipsecsiteconnection_list(request, **kwargs): return _ipsecsiteconnection_list(request, expand_ikepolicies=True, expand_ipsecpolicies=True, expand_vpnservices=True, **kwargs) @memoized def _ipsecsiteconnection_list(request, expand_ikepolicies=False, expand_ipsecpolicies=False, expand_vpnservices=False, **kwargs): ipsecsiteconnections = networkclient(request).vpn_ipsec_site_connections( **kwargs) ipsec_dicts = [ipsec.to_dict() for ipsec in ipsecsiteconnections] if expand_ikepolicies: ikepolicies = _ikepolicy_list(request) policy_dict = OrderedDict((p.id, p) for p in ikepolicies) for c in ipsec_dicts: c['ikepolicy_name'] = policy_dict.get(c['ikepolicy_id']).name_or_id if expand_ipsecpolicies: ipsecpolicies = _ipsecpolicy_list(request) policy_dict = OrderedDict((p.id, p) for p in ipsecpolicies) for c in ipsec_dicts: c['ipsecpolicy_name'] = policy_dict.get(c['ipsecpolicy_id'] ).name_or_id if expand_vpnservices: vpnservices = _vpnservice_list(request) service_dict = OrderedDict((s.id, s) for s in vpnservices) for c in ipsec_dicts: c['vpnservice_name'] = service_dict.get(c['vpnservice_id'] ).name_or_id return [IPsecSiteConnection(v) for v in ipsec_dicts] @profiler.trace def ipsecsiteconnection_get(request, ipsecsiteconnection_id): return _ipsecsiteconnection_get(request, ipsecsiteconnection_id, expand_ikepolicies=True, expand_ipsecpolicies=True, expand_vpnservices=True) def _ipsecsiteconnection_get(request, ipsecsiteconnection_id, expand_ikepolicies, expand_ipsecpolicies, expand_vpnservices): ipsecsiteconnection = networkclient( request).get_vpn_ipsec_site_connection( ipsecsiteconnection_id).to_dict() if expand_ikepolicies: ipsecsiteconnection['ikepolicy'] = _ikepolicy_get( request, ipsecsiteconnection['ikepolicy_id']) if expand_ipsecpolicies: ipsecsiteconnection['ipsecpolicy'] = _ipsecpolicy_get( request, ipsecsiteconnection['ipsecpolicy_id']) if expand_vpnservices: ipsecsiteconnection['vpnservice'] = _vpnservice_get( request, ipsecsiteconnection['vpnservice_id']) return IPsecSiteConnection(ipsecsiteconnection) @profiler.trace def ipsecsiteconnection_update(request, ipsecsiteconnection_id, **kwargs): ipsecsiteconnection = networkclient( request).update_vpn_ipsec_site_connection( ipsecsiteconnection_id, **kwargs).to_dict() return IPsecSiteConnection(ipsecsiteconnection) @profiler.trace def ipsecsiteconnection_delete(request, ipsecsiteconnection_id): networkclient(request).delete_vpn_ipsec_site_connection( ipsecsiteconnection_id) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3630557 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/0000775000175000017500000000000015257164617024671 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2654266 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/__init__.py0000664000175000017500000000000015257164532026764 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3640559 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/0000775000175000017500000000000015257164617026337 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2654266 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/__init__.py0000664000175000017500000000000015257164532030432 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.366056 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/0000775000175000017500000000000015257164617027142 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2654266 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/__init__.py0000664000175000017500000000000015257164532031235 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2664268 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/forms.py0000664000175000017500000004553515257164532030652 0ustar00zuulzuul# Copyright 2013, Mirantis Inc # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import logging from django.urls import reverse from django.utils.translation import gettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import messages from neutron_vpnaas_dashboard.api import vpn as api_vpn LOG = logging.getLogger(__name__) class UpdateVPNService(forms.SelfHandlingForm): name = forms.CharField(max_length=80, label=_("Name"), required=False) description = forms.CharField( required=False, max_length=80, label=_("Description")) admin_state_up = forms.BooleanField(label=_("Enable Admin State"), required=False) failure_url = 'horizon:project:vpn:index' def handle(self, request, context): try: data = {'name': context['name'], 'description': context['description'], 'admin_state_up': context['admin_state_up'], } vpnservice = api_vpn.vpnservice_update( request, self.initial['vpnservice_id'], **data) msg = (_('VPN service %s was successfully updated.') % context['name']) messages.success(request, msg) return vpnservice except Exception as e: LOG.info('Failed to update VPN service %(id)s: %(exc)s', {'id': self.initial['vpnservice_id'], 'exc': e}) msg = _('Failed to update VPN service %s') % context['name'] redirect = reverse(self.failure_url) exceptions.handle(request, msg, redirect=redirect) class UpdateEndpointGroup(forms.SelfHandlingForm): name = forms.CharField( max_length=80, label=_("Name"), required=False) description = forms.CharField( required=False, max_length=80, label=_("Description")) failure_url = 'horizon:project:vpn:index' def handle(self, request, context): try: data = {'name': context['name'], 'description': context['description']} endpointgroup = api_vpn.endpointgroup_update( request, self.initial['endpoint_group_id'], **data) msg = (_('Endpoint group %s was successfully updated.') % context['name']) messages.success(request, msg) return endpointgroup except Exception as e: LOG.info('Failed to update endpoint group %(id)s: %(exc)s', {'id': self.initial['endpoint_group_id'], 'exc': e}) msg = _('Failed to update endpoint group %s') % context['name'] redirect = reverse(self.failure_url) exceptions.handle(request, msg, redirect=redirect) class UpdateIKEPolicy(forms.SelfHandlingForm): name = forms.CharField(max_length=80, label=_("Name"), required=False) description = forms.CharField( required=False, max_length=80, label=_("Description")) auth_algorithm = forms.ThemableChoiceField( label=_("Authorization algorithm"), choices=[('sha1', _('SHA-1')), ('sha256', _('SHA-256')), ('sha384', _('SHA-384')), ('sha512', _('SHA-512')), ('aes-xcbc', _('AES-XCBC')), ('aes-cmac', _('AES-CMAC'))], required=False) encryption_algorithm = forms.ThemableChoiceField( label=_("Encryption algorithm"), choices=[('3des', _('3DES')), ('aes-128', _('AES-128')), ('aes-192', _('AES-192')), ('aes-256', _('AES-256')), ('aes-128-ctr', _('AES-128-CTR')), ('aes-192-ctr', _('AES-192-CTR')), ('aes-256-ctr', _('AES-256-CTR')), ('aes-128-ccm-8', _('AES-128-CCM-8')), ('aes-192-ccm-8', _('AES-192-CCM-8')), ('aes-256-ccm-8', _('AES-256-CCM-8')), ('aes-128-ccm-12', _('AES-128-CCM-12')), ('aes-192-ccm-12', _('AES-192-CCM-12')), ('aes-256-ccm-12', _('AES-256-CCM-12')), ('aes-128-ccm-16', _('AES-128-CCM-16')), ('aes-192-ccm-16', _('AES-192-CCM-16')), ('aes-256-ccm-16', _('AES-256-CCM-16')), ('aes-128-gcm-8', _('AES-128-GCM-8')), ('aes-192-gcm-8', _('AES-192-GCM-8')), ('aes-256-gcm-8', _('AES-256-GCM-8')), ('aes-128-gcm-12', _('AES-128-GCM-12')), ('aes-192-gcm-12', _('AES-192-GCM-12')), ('aes-256-gcm-12', _('AES-256-GCM-12')), ('aes-128-gcm-16', _('AES-128-GCM-16')), ('aes-192-gcm-16', _('AES-192-GCM-16')), ('aes-256-gcm-16', _('AES-256-GCM-16'))], required=False) ike_version = forms.ThemableChoiceField( label=_("IKE version"), choices=[('v1', _('v1')), ('v2', _('v2'))], required=False) # Currently this field has only one choice, so mark it as readonly. lifetime_units = forms.ThemableChoiceField( label=_("Lifetime units for IKE keys"), choices=[('seconds', _('seconds'))], widget=forms.TextInput(attrs={'readonly': 'readonly'}), required=False) lifetime_value = forms.IntegerField( min_value=60, label=_("Lifetime value for IKE keys"), help_text=_("Equal to or greater than 60"), required=False) pfs = forms.ThemableChoiceField( label=_("Perfect Forward Secrecy"), choices=[('group2', _('group2')), ('group5', _('group5')), ('group14', _('group14')), ('group15', _('group15')), ('group16', _('group16')), ('group17', _('group17')), ('group18', _('group18')), ('group19', _('group19')), ('group20', _('group20')), ('group21', _('group21')), ('group22', _('group22')), ('group23', _('group23')), ('group24', _('group24')), ('group25', _('group25')), ('group26', _('group26')), ('group27', _('group27')), ('group28', _('group28')), ('group29', _('group29')), ('group30', _('group30')), ('group31', _('group31'))], required=False) phase1_negotiation_mode = forms.ThemableChoiceField( label=_("IKE Phase1 negotiation mode"), choices=[('main', 'main'), ('aggressive', 'aggressive')], required=False) failure_url = 'horizon:project:vpn:index' def handle(self, request, context): try: data = {'name': context['name'], 'description': context['description'], 'auth_algorithm': context['auth_algorithm'], 'encryption_algorithm': context['encryption_algorithm'], 'ike_version': context['ike_version'], 'lifetime': {'units': context['lifetime_units'], 'value': context['lifetime_value']}, 'pfs': context['pfs'], 'phase1_negotiation_mode': context['phase1_negotiation_mode'], } ikepolicy = api_vpn.ikepolicy_update( request, self.initial['ikepolicy_id'], **data) msg = (_('IKE policy %s was successfully updated.') % context['name']) messages.success(request, msg) return ikepolicy except Exception as e: LOG.info('Failed to update IKE policy %(id)s: %(exc)s', {'id': self.initial['ikepolicy_id'], 'exc': e}) msg = _('Failed to update IKE policy %s') % context['name'] redirect = reverse(self.failure_url) exceptions.handle(request, msg, redirect=redirect) class UpdateIPsecPolicy(forms.SelfHandlingForm): name = forms.CharField(max_length=80, label=_("Name"), required=False) description = forms.CharField( required=False, max_length=80, label=_("Description")) # Currently this field has only one choice, so mark it as readonly. auth_algorithm = forms.ThemableChoiceField( label=_("Authorization algorithm"), choices=[('sha1', _('SHA-1')), ('sha256', _('SHA-256')), ('sha384', _('SHA-384')), ('sha512', _('SHA-512')), ('aes-xcbc', _('AES-XCBC')), ('aes-cmac', _('AES-CMAC'))], required=False) encapsulation_mode = forms.ThemableChoiceField( label=_("Encapsulation mode"), choices=[('tunnel', _('tunnel')), ('transport', _('transport'))], required=False) encryption_algorithm = forms.ThemableChoiceField( label=_("Encryption algorithm"), choices=[('3des', _('3DES')), ('aes-128', _('AES-128')), ('aes-192', _('AES-192')), ('aes-256', _('AES-256')), ('aes-128-ctr', _('AES-128-CTR')), ('aes-192-ctr', _('AES-192-CTR')), ('aes-256-ctr', _('AES-256-CTR')), ('aes-128-ccm-8', _('AES-128-CCM-8')), ('aes-192-ccm-8', _('AES-192-CCM-8')), ('aes-256-ccm-8', _('AES-256-CCM-8')), ('aes-128-ccm-12', _('AES-128-CCM-12')), ('aes-192-ccm-12', _('AES-192-CCM-12')), ('aes-256-ccm-12', _('AES-256-CCM-12')), ('aes-128-ccm-16', _('AES-128-CCM-16')), ('aes-192-ccm-16', _('AES-192-CCM-16')), ('aes-256-ccm-16', _('AES-256-CCM-16')), ('aes-128-gcm-8', _('AES-128-GCM-8')), ('aes-192-gcm-8', _('AES-192-GCM-8')), ('aes-256-gcm-8', _('AES-256-GCM-8')), ('aes-128-gcm-12', _('AES-128-GCM-12')), ('aes-192-gcm-12', _('AES-192-GCM-12')), ('aes-256-gcm-12', _('AES-256-GCM-12')), ('aes-128-gcm-16', _('AES-128-GCM-16')), ('aes-192-gcm-16', _('AES-192-GCM-16')), ('aes-256-gcm-16', _('AES-256-GCM-16'))], required=False) # Currently this field has only one choice, so mark it as readonly. lifetime_units = forms.ThemableChoiceField( label=_("Lifetime units"), choices=[('seconds', _('seconds'))], widget=forms.TextInput(attrs={'readonly': 'readonly'}), required=False) lifetime_value = forms.IntegerField( min_value=60, label=_("Lifetime value"), help_text=_("Equal to or greater than 60"), required=False) pfs = forms.ThemableChoiceField( label=_("Perfect Forward Secrecy"), choices=[('group2', _('group2')), ('group5', _('group5')), ('group14', _('group14')), ('group15', _('group15')), ('group16', _('group16')), ('group17', _('group17')), ('group18', _('group18')), ('group19', _('group19')), ('group20', _('group20')), ('group21', _('group21')), ('group22', _('group22')), ('group23', _('group23')), ('group24', _('group24')), ('group25', _('group25')), ('group26', _('group26')), ('group27', _('group27')), ('group28', _('group28')), ('group29', _('group29')), ('group30', _('group30')), ('group31', _('group31'))], required=False) transform_protocol = forms.ThemableChoiceField( label=_("Transform Protocol"), choices=[('esp', _('ESP')), ('ah', _('AH')), ('ah-esp', _('AH-ESP'))], required=False) failure_url = 'horizon:project:vpn:index' def handle(self, request, context): try: data = {'name': context['name'], 'description': context['description'], 'auth_algorithm': context['auth_algorithm'], 'encapsulation_mode': context['encapsulation_mode'], 'encryption_algorithm': context['encryption_algorithm'], 'lifetime': {'units': context['lifetime_units'], 'value': context['lifetime_value']}, 'pfs': context['pfs'], 'transform_protocol': context['transform_protocol'], } ipsecpolicy = api_vpn.ipsecpolicy_update( request, self.initial['ipsecpolicy_id'], **data) msg = (_('IPsec policy %s was successfully updated.') % context['name']) messages.success(request, msg) return ipsecpolicy except Exception as e: LOG.info('Failed to update IPsec policy %(id)s: %(exc)s', {'id': self.initial['ipsecpolicy_id'], 'exc': e}) msg = _('Failed to update IPsec policy %s') % context['name'] redirect = reverse(self.failure_url) exceptions.handle(request, msg, redirect=redirect) class UpdateIPsecSiteConnection(forms.SelfHandlingForm): name = forms.CharField(max_length=80, label=_("Name"), required=False) description = forms.CharField( required=False, max_length=80, label=_("Description")) peer_address = forms.CharField( label=_("Peer gateway public IPv4/IPv6 Address or FQDN"), help_text=_("Peer gateway public IPv4/IPv6 address or FQDN for " "the VPN Connection"),) peer_id = forms.CharField( label=_("Peer router identity for authentication (Peer ID)"), help_text=_("Peer router identity for authentication. " "Can be IPv4/IPv6 address, e-mail, key ID, or FQDN"),) peer_cidrs = forms.MultiIPField( required=False, label=_("Remote peer subnet(s)"), help_text=_("Remote peer subnet(s) address(es) " "with mask(s) in CIDR format " "separated with commas if needed " "(e.g. 20.1.0.0/24, 21.1.0.0/24)"), version=forms.IPv4 | forms.IPv6, mask=True) local_ep_group_id = forms.CharField( required=False, label=_("Local Endpoint Group(s)"), help_text=_("IPsec connection validation requires " "that local endpoints are subnets")) peer_ep_group_id = forms.CharField( required=False, label=_("Peer Endpoint Group(s)"), help_text=_("IPsec connection validation requires " "that peer endpoints are CIDRs")) psk = forms.CharField( widget=forms.PasswordInput(render_value=True), max_length=80, label=_("Pre-Shared Key (PSK) string")) mtu = forms.IntegerField( min_value=68, required=False, label=_("Maximum Transmission Unit size for the connection"), help_text=_("Equal to or greater than 68 if the local subnet is IPv4. " "Equal to or greater than 1280 if the local subnet " "is IPv6.")) dpd_action = forms.ThemableChoiceField( label=_("Dead peer detection actions"), required=False, choices=[('hold', _('hold')), ('clear', _('clear')), ('disabled', _('disabled')), ('restart', _('restart')), ('restart-by-peer', _('restart-by-peer'))]) dpd_interval = forms.IntegerField( min_value=1, required=False, label=_("Dead peer detection interval"), help_text=_("Valid integer lesser than the DPD timeout")) dpd_timeout = forms.IntegerField( min_value=1, required=False, label=_("Dead peer detection timeout"), help_text=_("Valid integer greater than the DPD interval")) initiator = forms.ThemableChoiceField( label=_("Initiator state"), required=False, choices=[('bi-directional', _('bi-directional')), ('response-only', _('response-only'))]) admin_state_up = forms.BooleanField(label=_("Enable Admin State"), required=False) failure_url = 'horizon:project:vpn:index' def clean(self): cleaned_data = super(UpdateIPsecSiteConnection, self).clean() interval = cleaned_data.get('dpd_interval') timeout = cleaned_data.get('dpd_timeout') if not interval < timeout: msg = _("DPD Timeout must be greater than DPD Interval") self._errors['dpd_timeout'] = self.error_class([msg]) return cleaned_data def handle(self, request, context): try: data = { 'name': context['name'], 'description': context['description'], 'peer_address': context['peer_address'], 'peer_id': context['peer_id'], 'psk': context['psk'], 'mtu': context['mtu'], 'dpd': {'action': context['dpd_action'], 'interval': context['dpd_interval'], 'timeout': context['dpd_timeout']}, 'initiator': context['initiator'], 'admin_state_up': context['admin_state_up'] } if not context['peer_cidrs']: data['local_ep_group_id'] = context['local_ep_group_id'] data['peer_ep_group_id'] = context['peer_ep_group_id'] else: cidrs = context['peer_cidrs'] data['peer_cidrs'] = [cidr.strip() for cidr in cidrs.split(',') if cidr.strip()] ipsecsiteconnection = api_vpn.ipsecsiteconnection_update( request, self.initial['ipsecsiteconnection_id'], **data) msg = (_('IPsec site connection %s was successfully updated.') % context['name']) messages.success(request, msg) return ipsecsiteconnection except Exception as e: LOG.info('Failed to update IPsec site connection %(id)s: %(exc)s', {'id': self.initial['ipsecsiteconnection_id'], 'exc': e}) msg = (_('Failed to update IPsec site connection %s') % context['name']) redirect = reverse(self.failure_url) exceptions.handle(request, msg, redirect=redirect) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2664268 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/panel.py0000664000175000017500000000314615257164532030613 0ustar00zuulzuul# Copyright 2013, Mirantis Inc # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import logging from django.utils.translation import gettext_lazy as _ import horizon from openstack_dashboard.api import neutron LOG = logging.getLogger(__name__) class VPN(horizon.Panel): name = _("VPN") slug = 'vpn' 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_service_enabled(request, config_name='enable_vpn', ext_name='vpnaas'): return False except Exception: LOG.error("Call to list enabled services failed. This is likely " "due to a problem communicating with the Neutron " "endpoint. VPN panel will not be displayed.") return False if not super(VPN, self).allowed(context): return False return True ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2664268 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/tables.py0000664000175000017500000004531015257164532030765 0ustar00zuulzuul# Copyright 2013, Mirantis Inc # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django import template from django.urls import reverse from django.utils.translation import gettext_lazy as _ from django.utils.translation import ngettext_lazy from django.utils.translation import pgettext_lazy from horizon import exceptions from horizon import tables from openstack_dashboard import policy from neutron_vpnaas_dashboard.api import vpn as api_vpn forbid_updates = set(["PENDING_CREATE", "PENDING_UPDATE", "PENDING_DELETE"]) class AddIKEPolicyLink(tables.LinkAction): name = "addikepolicy" verbose_name = _("Add IKE Policy") url = "horizon:project:vpn:addikepolicy" classes = ("ajax-modal",) icon = "plus" policy_rules = (("network", "create_ikepolicy"),) class AddIPsecPolicyLink(tables.LinkAction): name = "addipsecpolicy" verbose_name = _("Add IPsec Policy") url = "horizon:project:vpn:addipsecpolicy" classes = ("ajax-modal",) icon = "plus" policy_rules = (("network", "create_ipsecpolicy"),) class AddVPNServiceLink(tables.LinkAction): name = "addvpnservice" verbose_name = _("Add VPN Service") url = "horizon:project:vpn:addvpnservice" classes = ("ajax-modal",) icon = "plus" policy_rules = (("network", "create_vpnservice"),) class AddEndpointGroupLink(tables.LinkAction): name = "addendpointgroup" verbose_name = _("Add Endpoint Group") url = "horizon:project:vpn:addendpointgroup" classes = ("ajax-modal",) icon = "plus" policy_rules = (("network", "create_endpointgroup"),) class AddIPsecSiteConnectionLink(tables.LinkAction): name = "addipsecsiteconnection" verbose_name = _("Add IPsec Site Connection") url = "horizon:project:vpn:addipsecsiteconnection" classes = ("ajax-modal",) icon = "plus" policy_rules = (("network", "create_ipsec_site_connection"),) class DeleteVPNServiceLink(policy.PolicyTargetMixin, tables.DeleteAction): name = "deletevpnservice" policy_rules = (("network", "delete_vpnservice"),) @staticmethod def action_present(count): return ngettext_lazy( "Delete VPN Service", "Delete VPN Services", count ) @staticmethod def action_past(count): return ngettext_lazy( "Scheduled deletion of VPN service", "Scheduled deletion of VPN services", count ) def allowed(self, request, datum=None): if datum and datum.ipsecsiteconns: return False return True def delete(self, request, obj_id): try: api_vpn.vpnservice_delete(request, obj_id) except Exception: exceptions.handle( request, _('Unable to delete VPN service.')) class DeleteEndpointGroupLink(policy.PolicyTargetMixin, tables.DeleteAction): name = "deleteendpointgroup" policy_rules = (("network", "delete_endpointgroup"),) @staticmethod def action_present(count): return ngettext_lazy( "Delete Endpoint Group", "Delete Endpoint Groups", count ) @staticmethod def action_past(count): return ngettext_lazy( "Scheduled deletion of endpoint group", "Scheduled deletion of endpoint groups", count ) def delete(self, request, obj_id): try: api_vpn.endpointgroup_delete(request, obj_id) except Exception: exceptions.handle( request, _('Unable to delete endpoint group.')) class DeleteIKEPolicyLink(policy.PolicyTargetMixin, tables.DeleteAction): name = "deleteikepolicy" policy_rules = (("network", "delete_ikepolicy"),) @staticmethod def action_present(count): return ngettext_lazy( "Delete IKE Policy", "Delete IKE Policies", count ) @staticmethod def action_past(count): return ngettext_lazy( "Scheduled deletion of IKE policy", "Scheduled deletion of IKE policies", count ) def allowed(self, request, datum=None): if datum and datum.ipsecsiteconns: return False return True def delete(self, request, obj_id): try: api_vpn.ikepolicy_delete(request, obj_id) except Exception: exceptions.handle( request, _('Unable to delete IKE policy.')) class DeleteIPsecPolicyLink(policy.PolicyTargetMixin, tables.DeleteAction): name = "deleteipsecpolicy" policy_rules = (("network", "delete_ipsecpolicy"),) @staticmethod def action_present(count): return ngettext_lazy( "Delete IPsec Policy", "Delete IPsec Policies", count ) @staticmethod def action_past(count): return ngettext_lazy( "Scheduled deletion of IPsec policy", "Scheduled deletion of IPsec policies", count ) def allowed(self, request, datum=None): if datum and datum.ipsecsiteconns: return False return True def delete(self, request, obj_id): try: api_vpn.ipsecpolicy_delete(request, obj_id) except Exception: exceptions.handle( request, _('Unable to delete IPsec policy.')) class DeleteIPsecSiteConnectionLink(policy.PolicyTargetMixin, tables.DeleteAction): name = "deleteipsecsiteconnection" policy_rules = (("network", "delete_ipsec_site_connection"),) @staticmethod def action_present(count): return ngettext_lazy( "Delete IPsec Site Connection", "Delete IPsec Site Connections", count ) @staticmethod def action_past(count): return ngettext_lazy( "Scheduled deletion of IPsec site connection", "Scheduled deletion of IPsec site connections", count ) def delete(self, request, obj_id): try: api_vpn.ipsecsiteconnection_delete(request, obj_id) except Exception: exceptions.handle(request, _('Unable to delete IPsec site connection.')) class UpdateVPNServiceLink(tables.LinkAction): name = "update_vpnservice" verbose_name = _("Edit VPN Service") classes = ("ajax-modal", "btn-update",) policy_rules = (("network", "update_vpnservice"),) def get_link_url(self, vpnservice): return reverse("horizon:project:vpn:update_vpnservice", kwargs={'vpnservice_id': vpnservice.id}) def allowed(self, request, datum=None): if datum and datum.status not in forbid_updates: return True return False class UpdateEndpointGroupLink(tables.LinkAction): name = "updateendpointgroup" verbose_name = _("Edit Endpoint Group") classes = ("ajax-modal", "btn-update",) policy_rules = (("network", "update_endpointgroup"),) def get_link_url(self, endpoint_group): return reverse("horizon:project:vpn:update_endpointgroup", kwargs={'endpoint_group_id': endpoint_group.id}) class UpdateIKEPolicyLink(tables.LinkAction): name = "updateikepolicy" verbose_name = _("Edit IKE Policy") classes = ("ajax-modal", "btn-update",) policy_rules = (("network", "update_ikepolicy"),) def get_link_url(self, ikepolicy): return reverse("horizon:project:vpn:update_ikepolicy", kwargs={'ikepolicy_id': ikepolicy.id}) def allowed(self, request, datum=None): return not datum['ipsecsiteconns'] class UpdateIPsecPolicyLink(tables.LinkAction): name = "updateipsecpolicy" verbose_name = _("Edit IPsec Policy") classes = ("ajax-modal", "btn-update",) policy_rules = (("network", "update_ipsecpolicy"),) def get_link_url(self, ipsecpolicy): return reverse("horizon:project:vpn:update_ipsecpolicy", kwargs={'ipsecpolicy_id': ipsecpolicy.id}) def allowed(self, request, datum=None): return not datum['ipsecsiteconns'] class UpdateIPsecSiteConnectionLink(tables.LinkAction): name = "updateipsecsiteconnection" verbose_name = _("Edit Connection") classes = ("ajax-modal", "btn-update",) policy_rules = (("network", "update_ipsec_site_connection"),) def get_link_url(self, ipsecsiteconnection): return reverse("horizon:project:vpn:update_ipsecsiteconnection", kwargs={'ipsecsiteconnection_id': ipsecsiteconnection.id}) def allowed(self, request, datum=None): if datum and datum.status not in forbid_updates: return True return False STATUS_CHOICES = ( ("active", True), ("down", True), ("created", True), ("error", False), ("inactive", False), ) STATUS_DISPLAY_CHOICES = ( ("active", pgettext_lazy("Current status of an IPsec site connection " "and VPN service", "Active")), ("down", pgettext_lazy("Current status of an IPsec site connection " "and VPN service", "Down")), ("error", pgettext_lazy("Current status of an IPsec site connection " "and VPN service", "Error")), ("created", pgettext_lazy("Current status of an IPsec site connection " "and VPN service", "Created")), ("pending_create", pgettext_lazy("Current status of an " "IPsec site connection and VPN service", "Pending Create")), ("pending_update", pgettext_lazy("Current status of an " "IPsec site connection and VPN service", "Pending Update")), ("pending_delete", pgettext_lazy("Current status of an " "IPsec site connection and VPN service", "Pending Delete")), ("inactive", pgettext_lazy("Current status of an IPsec site connection " "and VPN service", "Inactive")), ) class UpdateIPsecSiteConnectionRow(tables.Row): ajax = True def get_data(self, request, conn_id): conn = api_vpn.ipsecsiteconnection_get(request, conn_id) conn.ikepolicy_name = conn['ikepolicy'].get('name', conn['ikepolicy_id']) conn.ipsecpolicy_name = conn['ipsecpolicy'].get('name', conn['ipsecpolicy_id']) conn.vpnservice_name = conn['vpnservice'].get('name', conn['vpnservice_id']) return conn class IPSSCFilterAction(tables.FilterAction): name = 'IPSSC_project_IKEPolicies' filter_type = 'server' filter_choices = ( ('name', _("Name ="), True), ('vpnservice', _("VPN Service ="), True), ('vpnservice_id', _("VPN Service ID ="), True), ('ikepolicy', _("IKE Policy ="), True), ('ikepolicy_id', _("IKE Policy ID ="), True), ('ipsecpolicy', _("IPsec Policy ="), True), ('ipsecpolicy_id', _("IPsec Policy ID ="), True), ('status', _("Status ="), True) ) class IPsecSiteConnectionsTable(tables.DataTable): name = tables.Column('name_or_id', verbose_name=_('Name'), link="horizon:project:vpn:ipsecsiteconnectiondetails") description = tables.Column('description', verbose_name=_('Description')) vpnservice_name = tables.Column('vpnservice_name', verbose_name=_('VPN Service')) ikepolicy_name = tables.Column('ikepolicy_name', verbose_name=_('IKE Policy')) ipsecpolicy_name = tables.Column('ipsecpolicy_name', verbose_name=_('IPsec Policy')) status = tables.Column("status", verbose_name=_("Status"), status=True, status_choices=STATUS_CHOICES, display_choices=STATUS_DISPLAY_CHOICES) def get_object_display(self, ipsecsiteconnection): return ipsecsiteconnection.name_or_id class Meta(object): name = "ipsecsiteconnectionstable" verbose_name = _("IPsec Site Connections") status_columns = ['status'] row_class = UpdateIPsecSiteConnectionRow table_actions = (AddIPsecSiteConnectionLink, DeleteIPsecSiteConnectionLink, IPSSCFilterAction) row_actions = (UpdateIPsecSiteConnectionLink, DeleteIPsecSiteConnectionLink) def get_local_ips(vpn): template_name = 'project/vpn/_vpn_ips.html' context = {"external_v4_ip": vpn.get('external_v4_ip'), "external_v6_ip": vpn.get('external_v6_ip')} return template.loader.render_to_string(template_name, context) def get_subnet_name(vpn): try: return vpn.subnet_name except AttributeError: return _("-") class UpdateVPNServiceRow(tables.Row): ajax = True def get_data(self, request, vpn_id): vpn = api_vpn.vpnservice_get(request, vpn_id) vpn.router_name = vpn['router'].get('name', vpn['router_id']) if 'subnet' in vpn: vpn.subnet_name = vpn['subnet'].get('cidr', vpn['subnet_id']) return vpn class VPNServicesFilterAction(tables.FilterAction): name = 'vpnservices_project_IKEPolicies' filter_type = 'server' filter_choices = ( ('name', _("Name ="), True), ('subnet_id', _("Subnet ID ="), True), ('subnet_name', _("Subnet ="), True), ('router_id', _("Router ID ="), True), ('router_name', _("Router ="), True), ) class VPNServicesTable(tables.DataTable): name = tables.Column("name_or_id", verbose_name=_('Name'), link="horizon:project:vpn:vpnservicedetails") description = tables.Column('description', verbose_name=_('Description')) local_ips = tables.Column(get_local_ips, verbose_name=_("Local Side Public IPs")) subnet_name = tables.Column(get_subnet_name, verbose_name=_('Subnet')) router_name = tables.Column('router_name', verbose_name=_('Router')) status = tables.Column("status", verbose_name=_("Status")) def get_object_display(self, vpnservice): return vpnservice.name_or_id class Meta(object): name = "vpnservicestable" verbose_name = _("VPN Services") status_columns = ['status'] row_class = UpdateVPNServiceRow table_actions = (AddVPNServiceLink, DeleteVPNServiceLink, VPNServicesFilterAction) row_actions = (UpdateVPNServiceLink, DeleteVPNServiceLink) class EndpointGroupFilterAction(tables.FilterAction): name = 'endpointgroups_project' filter_type = 'server' filter_choices = ( ('name', _("Name ="), True), ('type', _("Type ="), True), ('endpoints', _("Endpoints ="), True), ) def _get_endpoints(epg): return ', '.join(epg.endpoints) class EndpointGroupTable(tables.DataTable): name = tables.Column("name_or_id", verbose_name=_('Name'), link="horizon:project:vpn:endpointgroupdetails") description = tables.Column('description', verbose_name=_('Description')) type = tables.Column('type', verbose_name=_('Type')) endpoints = tables.Column(_get_endpoints, verbose_name=_('Endpoints')) class Meta(object): name = "endpointgroupstable" verbose_name = _("Endpoint Groups") table_actions = (AddEndpointGroupLink, DeleteEndpointGroupLink, EndpointGroupFilterAction) row_actions = (UpdateEndpointGroupLink, DeleteEndpointGroupLink) def get_object_display(self, endpoitgroup): return endpoitgroup.name_or_id class PoliciesFilterAction(tables.FilterAction): name = 'filter_project_IKEPolicies' filter_type = 'server' filter_choices = ( ('name', _("Name ="), True), ('auth_algorithm', _("Authorization algorithm ="), True), ('encryption_algorithm', _("Encryption algorithm ="), True), ('pfs', _("PFS ="), True), ) class IKEPoliciesTable(tables.DataTable): name = tables.Column("name_or_id", verbose_name=_('Name'), link="horizon:project:vpn:ikepolicydetails") description = tables.Column('description', verbose_name=_('Description')) auth_algorithm = tables.Column('auth_algorithm', verbose_name=_('Authorization algorithm')) encryption_algorithm = tables.Column( 'encryption_algorithm', verbose_name=_('Encryption algorithm')) pfs = tables.Column("pfs", verbose_name=_('PFS')) def get_object_display(self, ikepolicy): return ikepolicy.name_or_id class Meta(object): name = "ikepoliciestable" verbose_name = _("IKE Policies") table_actions = (AddIKEPolicyLink, DeleteIKEPolicyLink, PoliciesFilterAction) row_actions = (UpdateIKEPolicyLink, DeleteIKEPolicyLink) class IPsecPoliciesTable(tables.DataTable): name = tables.Column("name_or_id", verbose_name=_('Name'), link="horizon:project:vpn:ipsecpolicydetails") description = tables.Column('description', verbose_name=_('Description')) auth_algorithm = tables.Column('auth_algorithm', verbose_name=_('Authorization algorithm')) encryption_algorithm = tables.Column( 'encryption_algorithm', verbose_name=_('Encryption algorithm')) pfs = tables.Column("pfs", verbose_name=_('PFS')) def get_object_display(self, ipsecpolicy): return ipsecpolicy.name_or_id class Meta(object): name = "ipsecpoliciestable" verbose_name = _("IPsec Policies") table_actions = (AddIPsecPolicyLink, DeleteIPsecPolicyLink, PoliciesFilterAction) row_actions = (UpdateIPsecPolicyLink, DeleteIPsecPolicyLink) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.267427 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/tabs.py0000664000175000017500000002415515257164532030450 0ustar00zuulzuul# Copyright 2013, Mirantis Inc # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.utils.translation import gettext_lazy as _ from horizon import exceptions from horizon import tables as htables from horizon import tabs from openstack_dashboard import api from neutron_vpnaas_dashboard.api import vpn as api_vpn from neutron_vpnaas_dashboard.dashboards.project.vpn import tables class IPsecSiteConnectionsTab(tabs.TableTab, htables.DataTableView): table_classes = (tables.IPsecSiteConnectionsTable,) name = _("IPsec Site Connections") slug = "ipsecsiteconnections" template_name = ("horizon/common/_detail_table.html") FILTERS_MAPPING = {'admin_state_up': {_("up"): True, _("down"): False}} def get_ipsecsiteconnectionstable_data(self): try: filters = self.get_filters() tenant_id = self.request.user.tenant_id if 'vpnservice' in filters: filters['vpnservice_id'] = \ [v.id for v in api_vpn.vpnservice_list( self.tab_group.request, tenant_id=tenant_id, name=filters['vpnservice'])] del filters['vpnservice'] if 'ikepolicy' in filters: filters['ikepolicy_id'] = \ [i.id for i in api_vpn.ikepolicy_list( self.tab_group.request, tenant_id=tenant_id, name=filters['ikepolicy'])] del filters['ikepolicy'] if 'ipsecpolicy' in filters: filters['ipsecpolicy_id'] = \ [i.id for i in api_vpn.ipsecpolicy_list( self.tab_group.request, tenant_id=tenant_id, name=filters['ipsecpolicy'])] del filters['ipsecpolicy'] ipsecsiteconnections = api_vpn.ipsecsiteconnection_list( self.tab_group.request, tenant_id=tenant_id, **filters) except Exception: ipsecsiteconnections = [] exceptions.handle( self.tab_group.request, _('Unable to retrieve IPsec site connections list.')) return ipsecsiteconnections def get_filters(self): self.table = self._tables['ipsecsiteconnectionstable'] self.handle_server_filter(self.request, table=self.table) self.update_server_filter_action(self.request, table=self.table) return super(IPsecSiteConnectionsTab, self).get_filters(filters_map=self.FILTERS_MAPPING) class VPNServicesTab(tabs.TableTab, htables.DataTableView): table_classes = (tables.VPNServicesTable,) name = _("VPN Services") slug = "vpnservices" template_name = ("horizon/common/_detail_table.html") def get_vpnservicestable_data(self): try: filters = self.get_filters() tenant_id = self.request.user.tenant_id if 'subnet_name' in filters: subnets = api.neutron.subnet_list(self.tab_group.request, tenant_id=tenant_id, cidr=filters['subnet_name']) subnets_ids = [n.id for n in subnets] del filters['subnet_name'] if not subnets_ids: return [] filters['subnet_id'] = subnets_ids if 'router_name' in filters: routers = api.neutron.router_list(self.tab_group.request, tenant_id=tenant_id, name=filters['router_name']) routers_ids = [r.id for r in routers] if not routers: return [] filters['router_id'] = routers_ids vpnservices = api_vpn.vpnservice_list( self.tab_group.request, tenant_id=tenant_id, **filters) except Exception: vpnservices = [] exceptions.handle(self.tab_group.request, _('Unable to retrieve VPN services list.')) return vpnservices def get_filters(self): self.table = self._tables['vpnservicestable'] self.handle_server_filter(self.request, table=self.table) self.update_server_filter_action(self.request, table=self.table) return super(VPNServicesTab, self).get_filters() class EndpointGroupTab(tabs.TableTab, htables.DataTableView): table_classes = (tables.EndpointGroupTable,) name = _("Endpoint Groups") slug = "endpointgroups" template_name = ("horizon/common/_detail_table.html") def get_endpointgroupstable_data(self): try: filters = self.get_filters() tenant_id = self.request.user.tenant_id endpointgroups = api_vpn.endpointgroup_list( self.tab_group.request, tenant_id=tenant_id, **filters) except Exception: endpointgroups = [] exceptions.handle(self.tab_group.request, _('Unable to retrieve endpoint group list.')) return endpointgroups def get_filters(self): self.table = self._tables['endpointgroupstable'] self.handle_server_filter(self.request, table=self.table) self.update_server_filter_action(self.request, table=self.table) return super(EndpointGroupTab, self).get_filters() class IKEPoliciesTab(tabs.TableTab, htables.DataTableView): table_classes = (tables.IKEPoliciesTable,) name = _("IKE Policies") slug = "ikepolicies" template_name = ("horizon/common/_detail_table.html") def get_ikepoliciestable_data(self): try: filters = self.get_filters() tenant_id = self.request.user.tenant_id ikepolicies = api_vpn.ikepolicy_list( self.tab_group.request, tenant_id=tenant_id, **filters) except Exception: ikepolicies = [] exceptions.handle(self.tab_group.request, _('Unable to retrieve IKE policies list.')) return ikepolicies def get_filters(self): self.table = self._tables['ikepoliciestable'] self.handle_server_filter(self.request, table=self.table) self.update_server_filter_action(self.request, table=self.table) return super(IKEPoliciesTab, self).get_filters() class IPsecPoliciesTab(tabs.TableTab, htables.DataTableView): table_classes = (tables.IPsecPoliciesTable,) name = _("IPsec Policies") slug = "ipsecpolicies" template_name = ("horizon/common/_detail_table.html") def get_ipsecpoliciestable_data(self): try: filters = self.get_filters() tenant_id = self.request.user.tenant_id ipsecpolicies = api_vpn.ipsecpolicy_list( self.tab_group.request, tenant_id=tenant_id, **filters) except Exception: ipsecpolicies = [] exceptions.handle(self.tab_group.request, _('Unable to retrieve IPsec policy list.')) return ipsecpolicies def get_filters(self): self.table = self._tables['ipsecpoliciestable'] self.handle_server_filter(self.request, table=self.table) self.update_server_filter_action(self.request, table=self.table) return super(IPsecPoliciesTab, self).get_filters() class VPNTabs(tabs.TabGroup): slug = "vpntabs" tabs = (IKEPoliciesTab, IPsecPoliciesTab, VPNServicesTab, EndpointGroupTab, IPsecSiteConnectionsTab,) sticky = True class IKEPolicyDetailsTab(tabs.Tab): name = _("IKE Policy Details") slug = "ikepolicydetails" template_name = "project/vpn/_ikepolicy_details.html" def get_context_data(self, request): ikepolicy = self.tab_group.kwargs['ikepolicy'] return {'ikepolicy': ikepolicy} class IKEPolicyDetailsTabs(tabs.TabGroup): slug = "ikepolicytabs" tabs = (IKEPolicyDetailsTab,) class IPsecPolicyDetailsTab(tabs.Tab): name = _("IPsec Policy Details") slug = "ipsecpolicydetails" template_name = "project/vpn/_ipsecpolicy_details.html" def get_context_data(self, request): ipsecpolicy = self.tab_group.kwargs['ipsecpolicy'] return {'ipsecpolicy': ipsecpolicy} class IPsecPolicyDetailsTabs(tabs.TabGroup): slug = "ipsecpolicytabs" tabs = (IPsecPolicyDetailsTab,) class VPNServiceDetailsTab(tabs.Tab): name = _("VPN Service Details") slug = "vpnservicedetails" template_name = "project/vpn/_vpnservice_details.html" def get_context_data(self, request): vpnservice = self.tab_group.kwargs['vpnservice'] return {'vpnservice': vpnservice} class VPNServiceDetailsTabs(tabs.TabGroup): slug = "vpnservicetabs" tabs = (VPNServiceDetailsTab,) class EndpointGroupDetailsTab(tabs.Tab): name = _("Endpoint Groups Details") slug = "endpointgroupdetails" template_name = "project/vpn/_endpointgroup_details.html" def get_context_data(self, request): endpointgroup = self.tab_group.kwargs['endpointgroup'] return {'endpointgroup': endpointgroup} class EndpointGroupDetailsTabs(tabs.TabGroup): slug = "endpointgrouptabs" tabs = (EndpointGroupDetailsTab,) class IPsecSiteConnectionDetailsTab(tabs.Tab): name = _("IPsec Site Connection Details") slug = "ipsecsiteconnectiondetails" template_name = "project/vpn/_ipsecsiteconnection_details.html" def get_context_data(self, request): ipsecsiteconnection = self.tab_group.kwargs['ipsecsiteconnection'] return {'ipsecsiteconnection': ipsecsiteconnection} class IPsecSiteConnectionDetailsTabs(tabs.TabGroup): slug = "ipsecsiteconnectiontabs" tabs = (IPsecSiteConnectionDetailsTab,) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3470547 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/0000775000175000017500000000000015257164617031140 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3710563 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/0000775000175000017500000000000015257164617031743 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000024000000000000010211 xustar00133 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_endpoint_group_help.html 27 mtime=1790765402.267427 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_e0000664000175000017500000000012115257164532033047 0ustar00zuulzuul{% load i18n %}

{% trans "Create endpoint group for current project." %}

././@PaxHeader0000000000000000000000000000023400000000000010214 xustar00129 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_ike_policy_help.html 27 mtime=1790765402.267427 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_i0000664000175000017500000000214215257164532033060 0ustar00zuulzuul{% load i18n %}

{% trans "Create IKE policy for current project." %}

{% trans "An IKE policy is an association of the following attributes:" %}

{% trans 'Authorization algorithm' %}
{% trans 'Valid algorithms are SHA-1, SHA-256, SHA-384, SHA-512, AES-XCBC and AES-CMAC.' %}
{% trans 'Encryption algorithm' %}
{% trans 'Valid algorithms are 3DES and AES-128/192/256 including CTR, CCM (ICV 8/12/16) and GCM (ICV 8/12/16) variants.' %}
{% trans 'IKE version' %}
{% trans 'The type of version (v1/v2) that needs to be filtered.' %}
{% trans 'Lifetime' %}
{% trans "Life time consists of units and value. Units in 'seconds' and the default value is 3600." %}
{% trans 'Perfect Forward Secrecy' %}
{% trans 'PFS supports Diffie-Hellman groups 2, 5 (default), 14 through 31.' %}
{% trans 'IKE Phase 1 negotiation mode' %}
{% trans "Phase 1 negotiation mode limited to using 'main' and 'aggressive'." %}

{% trans "All fields are optional." %}

././@PaxHeader0000000000000000000000000000023700000000000010217 xustar00131 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_ipsec_policy_help.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_i0000664000175000017500000000213415257164532033061 0ustar00zuulzuul{% load i18n %}

{% trans 'Create IPsec policy for current project.' %}

{% trans 'An IPsec policy is an association of the following attributes' %}

{% trans 'Authorization algorithm' %}
{% trans 'Valid algorithms are SHA-1, SHA-256, SHA-384, SHA-512, AES-XCBC and AES-CMAC.' %}
{% trans 'Encapsulation mode' %}
{% trans 'The type of IPsec tunnel (tunnel/transport) to be used.' %}
{% trans 'Encryption algorithm' %}
{% trans 'Valid algorithms are 3DES and AES-128/192/256 including CTR, CCM (ICV 8/12/16) and GCM (ICV 8/12/16) variants.' %}
{% trans 'Lifetime' %}
{% trans "Life time consists of units and value. Units in 'seconds' and the default value is 3600." %}
{% trans 'Perfect Forward Secrecy' %}
{% trans 'PFS supports Diffie-Hellman groups 2, 5 (default), 14 through 31.' %}
{% trans 'Transform Protocol' %}
{% trans 'The type of protocol (ESP, AH, AH-ESP) used in IPsec policy.' %}

{% trans 'All fields are optional.' %}

././@PaxHeader0000000000000000000000000000023600000000000010216 xustar00130 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_vpn_service_help.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_v0000664000175000017500000000144015257164532033075 0ustar00zuulzuul{% load i18n %}

{% trans "Create VPN service for current project." %}

{% blocktrans trimmed %} The VPN service is attached to a router and references to endpoint group or a single subnet to push to a remote site. {% endblocktrans %}

{% trans "Specify a name, description, router, and subnet (optional) for the VPN service." %}

{% trans "Admin State is enabled by default." %}

{% trans "The router and admin state fields require to be enabled. All others are optional." %}

{% blocktrans trimmed %} Note: The recommended way to specify local subnets is to use endpoint groups in IPsec site connection. It is deprecated to specify subnet in VPN service. For a new VPN service or IPsec site connection, using endpoint group is recommended. {% endblocktrans %}

././@PaxHeader0000000000000000000000000000023700000000000010217 xustar00131 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_endpointgroup_details.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_endpo0000664000175000017500000000164215257164532033131 0ustar00zuulzuul{% load i18n sizeformat parse_date %}
{% trans "Name" %}
{{ endpointgroup.name|default:_("-") }}
{% trans "Description" %}
{{ endpointgroup.description|default:_("-") }}
{% trans "ID" %}
{{ endpointgroup.id }}
{% trans "Project ID" %}
{{ endpointgroup.tenant_id }}
{% trans "Type" %}
{{ endpointgroup.type }}
{% trans "Endpoints" %}
{% if endpointgroup.type == 'subnet' %} {% for ep in endpointgroup.endpoints %} {% url 'horizon:project:networks:subnets:detail' ep as subnet_url %}
{{ ep }}
{% endfor %} {% else %} {% for cidr in endpointgroup.endpoints %}
{{ cidr }}
{% endfor %} {% endif %}
././@PaxHeader0000000000000000000000000000023300000000000010213 xustar00127 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_ikepolicy_details.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_ikepo0000664000175000017500000000212415257164532033127 0ustar00zuulzuul{% load i18n sizeformat parse_date %}
{% trans "Name" %}
{{ ikepolicy.name|default:_("-") }}
{% trans "Description" %}
{{ ikepolicy.description|default:_("-") }}
{% trans "ID" %}
{{ ikepolicy.id }}
{% trans "Project ID" %}
{{ ikepolicy.tenant_id }}
{% trans "Authorization algorithm" %}
{{ ikepolicy.auth_algorithm }}
{% trans "Encryption algorithm" %}
{{ ikepolicy.encryption_algorithm }}
{% trans "IKE version" %}
{{ ikepolicy.ike_version }}
{% trans "Lifetime Units" %}
{{ ikepolicy.lifetime.units }}
{% trans "Lifetime Value" %}
{{ ikepolicy.lifetime.value }}
{% trans "Perfect Forward Secrecy" %}
{{ ikepolicy.pfs }}
{% trans "IKE Phase1 negotiation mode" %}
{{ ikepolicy.phase1_negotiation_mode }}
././@PaxHeader0000000000000000000000000000023500000000000010215 xustar00129 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_ipsecpolicy_details.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_ipsec0000664000175000017500000000215415257164532033126 0ustar00zuulzuul{% load i18n sizeformat parse_date %}
{% trans "Name" %}
{{ ipsecpolicy.name|default:_("-") }}
{% trans "Description" %}
{{ ipsecpolicy.description|default:_("-") }}
{% trans "ID" %}
{{ ipsecpolicy.id }}
{% trans "Project ID" %}
{{ ipsecpolicy.tenant_id }}
{% trans "Authorization algorithm" %}
{{ ipsecpolicy.auth_algorithm }}
{% trans "Encapsulation mode" %}
{{ ipsecpolicy.encapsulation_mode }}
{% trans "Encryption algorithm" %}
{{ ipsecpolicy.encryption_algorithm }}
{% trans "Lifetime Units" %}
{{ ipsecpolicy.lifetime.units }}
{% trans "Lifetime Value" %}
{{ ipsecpolicy.lifetime.value }}
{% trans "Perfect Forward Secrecy" %}
{{ ipsecpolicy.pfs }}
{% trans "Transform Protocol" %}
{{ ipsecpolicy.transform_protocol }}
././@PaxHeader0000000000000000000000000000024500000000000010216 xustar00137 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_ipsecsiteconnection_details.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_ipsec0000664000175000017500000000570215257164532033130 0ustar00zuulzuul{% load i18n sizeformat parse_date %}
{% trans "Name" %}
{{ ipsecsiteconnection.name|default:_("-") }}
{% trans "Description" %}
{{ ipsecsiteconnection.description|default:_("-") }}
{% trans "ID" %}
{{ ipsecsiteconnection.id }}
{% trans "Project ID" %}
{{ ipsecsiteconnection.tenant_id }}
{% trans "VPN Service" %}
{% url 'horizon:project:vpn:vpnservicedetails' ipsecsiteconnection.vpnservice_id as vpnservice_url %}
{{ ipsecsiteconnection.vpnservice.name_or_id }}
{% trans "Local Endpoint Group" %}
{% url 'horizon:project:vpn:endpointgroupdetails' ipsecsiteconnection.local_ep_group_id as local_epg_url %}
{{ ipsecsiteconnection.local_ep_group_id }}
{% trans "IKE Policy" %}
{% url 'horizon:project:vpn:ikepolicydetails' ipsecsiteconnection.ikepolicy_id as ikepolicy_url %}
{{ ipsecsiteconnection.ikepolicy.name_or_id }}
{% trans "IPsec Policy" %}
{% url 'horizon:project:vpn:ipsecpolicydetails' ipsecsiteconnection.ipsecpolicy_id as ipsecpolicy_url %}
{{ ipsecsiteconnection.ipsecpolicy.name_or_id }}
{% trans "Peer gateway public IPv4/IPv6 Address or FQDN" %}
{{ ipsecsiteconnection.peer_address }}
{% trans "Peer router identity for authentication (Peer ID)" %}
{{ ipsecsiteconnection.peer_id }}
{% trans "Remote peer subnet" %}
{% for peer_cidr in ipsecsiteconnection.peer_cidrs %} {{ peer_cidr }}
{% endfor %}
{% trans "Peer Endpoint Group" %}
{% url 'horizon:project:vpn:endpointgroupdetails' ipsecsiteconnection.peer_ep_group_id as peer_epg_url %}
{{ ipsecsiteconnection.peer_ep_group_id }}
{% trans "MTU" %}
{{ ipsecsiteconnection.mtu }}
{% trans "Initiator state" %}
{{ ipsecsiteconnection.initiator }}
{% trans "Dead peer detection action" %}
{{ ipsecsiteconnection.dpd.action }}
{% trans "Dead peer detection interval" %}
{{ ipsecsiteconnection.dpd.interval }}
{% trans "Dead peer detection timeout" %}
{{ ipsecsiteconnection.dpd.timeout }}
{% trans "Authorization mode" %}
{{ ipsecsiteconnection.auth_mode }}
{% trans "Route mode" %}
{{ ipsecsiteconnection.route_mode }}
{% trans "Admin State" %}
{{ ipsecsiteconnection.admin_state_up }}
{% trans "Status" %}
{{ ipsecsiteconnection.status }}
././@PaxHeader0000000000000000000000000000023600000000000010216 xustar00130 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_endpointgroup.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_updat0000664000175000017500000000032615257164532033137 0ustar00zuulzuul{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block modal-body-right %}

{% trans "Description:" %}

{% trans "You may update endpoint group details here." %}

{% endblock %} ././@PaxHeader0000000000000000000000000000023200000000000010212 xustar00126 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_ikepolicy.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_updat0000664000175000017500000000032215257164532033133 0ustar00zuulzuul{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block modal-body-right %}

{% trans "Description:" %}

{% trans "You may update IKE policy details here." %}

{% endblock %} ././@PaxHeader0000000000000000000000000000023400000000000010214 xustar00128 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecpolicy.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_updat0000664000175000017500000000032415257164532033135 0ustar00zuulzuul{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block modal-body-right %}

{% trans "Description:" %}

{% trans "You may update IPsec policy details here." %}

{% endblock %} ././@PaxHeader0000000000000000000000000000024400000000000010215 xustar00136 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecsiteconnection.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_updat0000664000175000017500000000033515257164532033137 0ustar00zuulzuul{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block modal-body-right %}

{% trans "Description:" %}

{% trans "You may update IPsec site connection details here." %}

{% endblock %} ././@PaxHeader0000000000000000000000000000023300000000000010213 xustar00127 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_vpnservice.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_updat0000664000175000017500000000032315257164532033134 0ustar00zuulzuul{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block modal-body-right %}

{% trans "Description:" %}

{% trans "You may update VPN service details here." %}

{% endblock %} ././@PaxHeader0000000000000000000000000000022100000000000010210 xustar00117 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_vpn_ips.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_vpn_i0000664000175000017500000000043015257164532033131 0ustar00zuulzuul{% load i18n %} {% if external_v4_ip or external_v6_ip %}
  • {% trans "IPv4:" %} {{ external_v4_ip }}
  • {% trans "IPv6:" %} {{ external_v6_ip }}
{% else %} {% trans "-" %} {% endif %} ././@PaxHeader0000000000000000000000000000023400000000000010214 xustar00128 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_vpnservice_details.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_vpnse0000664000175000017500000000361115257164532033155 0ustar00zuulzuul{% load i18n sizeformat parse_date %}
{% trans "Name" %}
{{ vpnservice.name|default:_("-") }}
{% trans "Description" %}
{{ vpnservice.description|default:_("-") }}
{% trans "ID" %}
{{ vpnservice.id }}
{% trans "Project ID" %}
{{ vpnservice.tenant_id }}
{% trans "Router" %}
{% url 'horizon:project:routers:detail' vpnservice.router_id as router_url %}
{{ vpnservice.router.name_or_id }}
{% trans "Subnet" %}
{% if vpnservice.subnet_id %} {% url 'horizon:project:networks:subnets:detail' vpnservice.subnet_id as subnet_url %}
{{ vpnservice.subnet.name_or_id }} {{ vpnservice.subnet.cidr }}
{% else %}
{% trans "-" %}
{% endif %}
{% trans "VPN Connections" %}
{% if vpnservice.ipsecsiteconns %} {% for conn in vpnservice.ipsecsiteconns %} {% url 'horizon:project:vpn:ipsecsiteconnectiondetails' conn.id as conn_url %} {{ conn.name_or_id }}
{% endfor %} {% else %} {% trans "-" %} {% endif %}
{% trans "Admin State" %}
{{ vpnservice.admin_state_up }}
{% trans "Status" %}
{{ vpnservice.status }}
{% if vpnservice.external_v4_ip or vpnservice.external_v6_ip %}

Local Side Public IP Addresses


{% trans "IPv4" %}
{{ vpnservice.external_v4_ip|default:_("-") }}
{% trans "IPv6" %}
{{ vpnservice.external_v6_ip|default:_("-") }}
{% endif %}
././@PaxHeader0000000000000000000000000000021600000000000010214 xustar00114 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/index.html 28 mtime=1790765402.2684271 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/index.0000664000175000017500000000034715257164532033053 0ustar00zuulzuul{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Virtual Private Network" %}{% endblock %} {% block main %}
{{ tab_group.render }}
{% endblock %} ././@PaxHeader0000000000000000000000000000023500000000000010215 xustar00129 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_endpointgroup.html 28 mtime=1790765402.2694273 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update0000664000175000017500000000030515257164532033142 0ustar00zuulzuul{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Edit Endpoint Group" %}{% endblock %} {% block main %} {% include 'project/vpn/_update_endpointgroup.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000023100000000000010211 xustar00125 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_ikepolicy.html 28 mtime=1790765402.2694273 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update0000664000175000017500000000027515257164532033150 0ustar00zuulzuul{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Edit IKE Policy" %}{% endblock %} {% block main %} {% include 'project/vpn/_update_ikepolicy.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000023300000000000010213 xustar00127 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_ipsecpolicy.html 28 mtime=1790765402.2694273 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update0000664000175000017500000000030115257164532033136 0ustar00zuulzuul{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Edit IPsec policy" %}{% endblock %} {% block main %} {% include 'project/vpn/_update_ipsecpolicy.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000024300000000000010214 xustar00135 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_ipsecsiteconnection.html 28 mtime=1790765402.2694273 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update0000664000175000017500000000032215257164532033141 0ustar00zuulzuul{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Edit IPsec site connection" %}{% endblock %} {% block main %} {% include 'project/vpn/_update_ipsecsiteconnection.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000023200000000000010212 xustar00126 path=neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_vpnservice.html 28 mtime=1790765402.2694273 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update0000664000175000017500000000027715257164532033152 0ustar00zuulzuul{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Edit VPN Service" %}{% endblock %} {% block main %} {% include 'project/vpn/_update_vpnservice.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2704275 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/tests.py0000664000175000017500000012601715257164532030661 0ustar00zuulzuul# Copyright 2013, Mirantis Inc # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.urls import reverse from horizon.workflows import views from openstack_dashboard import api from openstack_dashboard.test import helpers from neutron_vpnaas_dashboard.api import vpn as api_vpn from neutron_vpnaas_dashboard.dashboards.project.vpn import workflows from neutron_vpnaas_dashboard.test import helpers as test class VPNTests(test.TestCase): class AttributeDict(dict): def __getattr__(self, attr): return self[attr] def __setattr__(self, attr, value): self[attr] = value DASHBOARD = 'project' INDEX_URL = reverse('horizon:%s:vpn:index' % DASHBOARD) ADDIKEPOLICY_PATH = 'horizon:%s:vpn:addikepolicy' % DASHBOARD ADDIPSECPOLICY_PATH = 'horizon:%s:vpn:addipsecpolicy' % DASHBOARD ADDVPNSERVICE_PATH = 'horizon:%s:vpn:addvpnservice' % DASHBOARD ADDENDPOINTGROUP_PATH = 'horizon:%s:vpn:addendpointgroup' % DASHBOARD ADDVPNCONNECTION_PATH = 'horizon:%s:vpn:addipsecsiteconnection' % DASHBOARD IKEPOLICY_DETAIL_PATH = 'horizon:%s:vpn:ikepolicydetails' % DASHBOARD IPSECPOLICY_DETAIL_PATH = 'horizon:%s:vpn:ipsecpolicydetails' % DASHBOARD VPNSERVICE_DETAIL_PATH = 'horizon:%s:vpn:vpnservicedetails' % DASHBOARD ENDPOINTGROUP_DETAIL_PATH = 'horizon:%s:vpn:endpointgroupdetails' %\ DASHBOARD VPNCONNECTION_DETAIL_PATH = 'horizon:%s:vpn:ipsecsiteconnectiondetails' %\ DASHBOARD UPDATEIKEPOLICY_PATH = 'horizon:%s:vpn:update_ikepolicy' % DASHBOARD UPDATEIPSECPOLICY_PATH = 'horizon:%s:vpn:update_ipsecpolicy' % DASHBOARD UPDATEVPNSERVICE_PATH = 'horizon:%s:vpn:update_vpnservice' % DASHBOARD UPDATEENDPOINTGROUP_PATH = 'horizon:%s:vpn:update_endpointgroup' %\ DASHBOARD UPDATEVPNCONNECTION_PATH = 'horizon:%s:vpn:update_ipsecsiteconnection' %\ DASHBOARD def setup_mocks(self): self.mock_vpnservice_list.return_value = self.vpnservices.list() self.mock_endpointgroup_list.return_value = self.endpointgroups.list() self.mock_ikepolicy_list.return_value = self.ikepolicies.list() self.mock_ipsecpolicy_list.return_value = self.ipsecpolicies.list() self.mock_ipsecsiteconnection_list.return_value = \ self.ipsecsiteconnections.list() def setup_mocks_with_exception(self): self.mock_vpnservice_list.side_effect = self.exceptions.neutron self.mock_endpointgroup_list.side_effect = self.exceptions.neutron self.mock_ikepolicy_list.side_effect = self.exceptions.neutron self.mock_ipsecpolicy_list.side_effect = self.exceptions.neutron self.mock_ipsecsiteconnection_list.side_effect = \ self.exceptions.neutron def check_mocks(self): self.mock_vpnservice_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_endpointgroup_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_ikepolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_ipsecpolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_ipsecsiteconnection_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_vpnservices(self): self.setup_mocks() res = self.client.get(self.INDEX_URL + '?tab=vpntabs__vpnservices') self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual(len(res.context['vpnservicestable_table'].data), len(self.vpnservices.list())) self.check_mocks() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_endpointgroups(self): self.setup_mocks() res = self.client.get(self.INDEX_URL + '?tab=vpntabs__endpointgroups') self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual(len(res.context['endpointgroupstable_table'].data), len(self.endpointgroups.list())) self.check_mocks() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_ikepolicies(self): self.setup_mocks() res = self.client.get(self.INDEX_URL + '?tab=vpntabs__ikepolicies') self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual(len(res.context['ikepoliciestable_table'].data), len(self.ikepolicies.list())) self.check_mocks() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_ipsecpolicies(self): self.setup_mocks() res = self.client.get(self.INDEX_URL + '?tab=vpntabs__ipsecpolicies') self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual(len(res.context['ipsecpoliciestable_table'].data), len(self.ipsecpolicies.list())) self.check_mocks() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_ipsecsiteconnections(self): self.setup_mocks() res = self.client.get( self.INDEX_URL + '?tab=vpntabs__ipsecsiteconnections') self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual( len(res.context['ipsecsiteconnectionstable_table'].data), len(self.ipsecsiteconnections.list())) self.check_mocks() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_exception_vpnservices(self): self.setup_mocks_with_exception() res = self.client.get(self.INDEX_URL) self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual(len(res.context['table'].data), 0) self.check_mocks() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_exception_endpointgroups(self): self.setup_mocks_with_exception() res = self.client.get(self.INDEX_URL + '?tab=vpntabs__endpointgroups') self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual(len(res.context['table'].data), 0) self.check_mocks() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_exception_ikepolicies(self): self.setup_mocks_with_exception() res = self.client.get(self.INDEX_URL + '?tab=vpntabs__ikepolicies') self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual(len(res.context['table'].data), 0) self.check_mocks() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_exception_ipsecpolicies(self): self.setup_mocks_with_exception() res = self.client.get(self.INDEX_URL + '?tab=vpntabs__ipsecpolicies') self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual(len(res.context['table'].data), 0) self.check_mocks() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_list')}) def test_index_exception_ipsecsiteconnections(self): self.setup_mocks_with_exception() res = self.client.get( self.INDEX_URL + '?tab=vpntabs__ipsecsiteconnections') self.assertTemplateUsed(res, '%s/vpn/index.html' % self.DASHBOARD) self.assertTemplateUsed(res, 'horizon/common/_detail_table.html') self.assertEqual(len(res.context['table'].data), 0) self.check_mocks() @helpers.create_mocks({api.neutron: ('network_list_for_tenant', 'router_list')}) def test_add_vpnservice_get(self): networks = [{'subnets': [self.subnets.first(), ]}, ] routers = self.routers.list() self.mock_network_list_for_tenant.return_value = networks self.mock_router_list.return_value = routers res = self.client.get(reverse(self.ADDVPNSERVICE_PATH)) workflow = res.context['workflow'] self.assertTemplateUsed(res, views.WorkflowView.template_name) self.assertEqual(workflow.name, workflows.AddVPNService.name) expected_objs = ['', ] steps = [repr(step) for step in workflow.steps] self.assertQuerySetEqual(steps, expected_objs) self.mock_network_list_for_tenant.assert_called_once_with( helpers.IsHttpRequest(), self.tenant.id) self.mock_router_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) @helpers.create_mocks({api.neutron: ('router_list', 'network_list_for_tenant'), api_vpn: ('vpnservice_create', )}) def test_add_vpnservice_post(self): vpnservice = self.vpnservices.first() networks = [{'subnets': [self.subnets.first(), ]}, ] routers = self.routers.list() self.mock_network_list_for_tenant.return_value = networks self.mock_router_list.return_value = routers form_data = {'name': vpnservice['name'], 'description': vpnservice['description'], 'subnet_id': vpnservice['subnet_id'], 'router_id': vpnservice['router_id'], 'admin_state_up': vpnservice['admin_state_up']} self.mock_vpnservice_create.return_value = vpnservice res = self.client.post(reverse(self.ADDVPNSERVICE_PATH), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) self.mock_network_list_for_tenant.assert_called_once_with( helpers.IsHttpRequest(), self.tenant.id) self.mock_router_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_vpnservice_create.assert_called_once_with( helpers.IsHttpRequest(), **form_data) @helpers.create_mocks({api.neutron: ('router_list', 'network_list_for_tenant')}) def test_add_vpnservice_post_error(self): vpnservice = self.vpnservices.first() networks = [{'subnets': [self.subnets.first(), ]}, ] routers = self.routers.list() self.mock_network_list_for_tenant.return_value = networks self.mock_router_list.return_value = routers form_data = {'name': vpnservice['name'], 'description': vpnservice['description'], 'subnet_id': '', 'router_id': '', 'admin_state_up': vpnservice['admin_state_up']} res = self.client.post(reverse(self.ADDVPNSERVICE_PATH), form_data) self.assertFormErrors(res, 1) self.mock_network_list_for_tenant.assert_called_once_with( helpers.IsHttpRequest(), self.tenant.id) self.mock_router_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) @helpers.create_mocks({api.neutron: ('network_list_for_tenant', )}) def test_add_endpointgroup_get(self): networks = [{'subnets': [self.subnets.first(), ]}, ] self.mock_network_list_for_tenant.return_value = networks res = self.client.get(reverse(self.ADDENDPOINTGROUP_PATH)) workflow = res.context['workflow'] self.assertTemplateUsed(res, views.WorkflowView.template_name) self.assertEqual(workflow.name, workflows.AddEndpointGroup.name) expected_objs = ['', ] steps = [repr(step) for step in workflow.steps] self.assertQuerySetEqual(steps, expected_objs) self.mock_network_list_for_tenant.assert_called_once_with( helpers.IsHttpRequest(), self.tenant.id) @helpers.create_mocks({api.neutron: ('network_list_for_tenant', ), api_vpn: ('endpointgroup_create', )}) def test_add_endpointgroup_post(self): endpointgroup = self.endpointgroups.first() networks = [{'subnets': [self.subnets.first(), ]}, ] self.mock_network_list_for_tenant.return_value = networks form_data = {'name': endpointgroup['name'], 'description': endpointgroup['description'], 'subnets': endpointgroup['endpoints'], 'type': endpointgroup['type']} self.mock_endpointgroup_create.return_value = endpointgroup res = self.client.post(reverse(self.ADDENDPOINTGROUP_PATH), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) self.mock_network_list_for_tenant.assert_called_once_with( helpers.IsHttpRequest(), self.tenant.id) data = form_data.copy() data['endpoints'] = data['subnets'] del data['subnets'] self.mock_endpointgroup_create.assert_called_once_with( helpers.IsHttpRequest(), **data) @helpers.create_mocks({api.neutron: ('network_list_for_tenant', )}) def test_add_endpointgroup_post_error(self): endpointgroup = self.endpointgroups.first() networks = [{'subnets': [self.subnets.first(), ]}, ] self.mock_network_list_for_tenant.return_value = networks form_data = {'name': endpointgroup['name'], 'description': endpointgroup['description'], 'endpoints': endpointgroup['endpoints'], 'type': ''} res = self.client.post(reverse(self.ADDENDPOINTGROUP_PATH), form_data) self.assertFormErrors(res, 1) self.mock_network_list_for_tenant.assert_called_once_with( helpers.IsHttpRequest(), self.tenant.id) def test_add_ikepolicy_get(self): res = self.client.get(reverse(self.ADDIKEPOLICY_PATH)) workflow = res.context['workflow'] self.assertTemplateUsed(res, views.WorkflowView.template_name) self.assertEqual(workflow.name, workflows.AddIKEPolicy.name) expected_objs = ['', ] steps = [repr(step) for step in workflow.steps] self.assertQuerySetEqual(steps, expected_objs) @helpers.create_mocks({api_vpn: ('ikepolicy_create', )}) def test_add_ikepolicy_post(self): ikepolicy = self.ikepolicies.first() form_data = {'name': ikepolicy['name'], 'description': ikepolicy['description'], 'auth_algorithm': ikepolicy['auth_algorithm'], 'encryption_algorithm': ikepolicy[ 'encryption_algorithm'], 'ike_version': ikepolicy['ike_version'], 'lifetime_units': ikepolicy['lifetime']['units'], 'lifetime_value': ikepolicy['lifetime']['value'], 'phase1_negotiation_mode': ikepolicy[ 'phase1_negotiation_mode'], 'pfs': ikepolicy['pfs']} self.mock_ikepolicy_create.return_value = ikepolicy res = self.client.post(reverse(self.ADDIKEPOLICY_PATH), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) data = form_data.copy() data['lifetime'] = {'units': data['lifetime_units'], 'value': data['lifetime_value']} del data['lifetime_units'] del data['lifetime_value'] self.mock_ikepolicy_create.assert_called_once_with( helpers.IsHttpRequest(), **data) def test_add_ikepolicy_post_error(self): ikepolicy = self.ikepolicies.first() form_data = {'name': ikepolicy['name'], 'description': ikepolicy['description'], 'auth_algorithm': ikepolicy['auth_algorithm'], 'encryption_algorithm': ikepolicy[ 'encryption_algorithm'], 'ike_version': ikepolicy['ike_version'], 'lifetime_units': ikepolicy['lifetime']['units'], 'lifetime_value': 10, 'phase1_negotiation_mode': ikepolicy[ 'phase1_negotiation_mode'], 'pfs': ikepolicy['pfs']} res = self.client.post(reverse(self.ADDIKEPOLICY_PATH), form_data) self.assertFormErrors(res, 1) def test_add_ipsecpolicy_get(self): res = self.client.get(reverse(self.ADDIPSECPOLICY_PATH)) workflow = res.context['workflow'] self.assertTemplateUsed(res, views.WorkflowView.template_name) self.assertEqual(workflow.name, workflows.AddIPsecPolicy.name) expected_objs = ['', ] steps = [repr(step) for step in workflow.steps] self.assertQuerySetEqual(steps, expected_objs) @helpers.create_mocks({api_vpn: ('ipsecpolicy_create', )}) def test_add_ipsecpolicy_post(self): ipsecpolicy = self.ipsecpolicies.first() form_data = {'name': ipsecpolicy['name'], 'description': ipsecpolicy['description'], 'auth_algorithm': ipsecpolicy['auth_algorithm'], 'encryption_algorithm': ipsecpolicy[ 'encryption_algorithm'], 'encapsulation_mode': ipsecpolicy[ 'encapsulation_mode'], 'lifetime_units': ipsecpolicy['lifetime']['units'], 'lifetime_value': ipsecpolicy['lifetime']['value'], 'pfs': ipsecpolicy['pfs'], 'transform_protocol': ipsecpolicy[ 'transform_protocol']} self.mock_ipsecpolicy_create.return_value = ipsecpolicy res = self.client.post(reverse(self.ADDIPSECPOLICY_PATH), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) data = form_data.copy() data['lifetime'] = {'units': data['lifetime_units'], 'value': data['lifetime_value']} del data['lifetime_units'] del data['lifetime_value'] self.mock_ipsecpolicy_create.assert_called_once_with( helpers.IsHttpRequest(), **data) def test_add_ipsecpolicy_post_error(self): ipsecpolicy = self.ipsecpolicies.first() form_data = {'name': ipsecpolicy['name'], 'description': ipsecpolicy['description'], 'auth_algorithm': ipsecpolicy['auth_algorithm'], 'encryption_algorithm': ipsecpolicy[ 'encryption_algorithm'], 'encapsulation_mode': ipsecpolicy[ 'encapsulation_mode'], 'lifetime_units': ipsecpolicy['lifetime']['units'], 'lifetime_value': 10, 'pfs': ipsecpolicy['pfs'], 'transform_protocol': ipsecpolicy[ 'transform_protocol']} res = self.client.post(reverse(self.ADDIPSECPOLICY_PATH), form_data) self.assertFormErrors(res, 1) @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list',)}) def test_add_ipsecsiteconnection_get(self): ikepolicies = self.ikepolicies.list() ipsecpolicies = self.ipsecpolicies.list() vpnservices = self.vpnservices.list() self.mock_ikepolicy_list.return_value = ikepolicies self.mock_ipsecpolicy_list.return_value = ipsecpolicies self.mock_vpnservice_list.return_value = vpnservices res = self.client.get(reverse(self.ADDVPNCONNECTION_PATH)) workflow = res.context['workflow'] self.assertTemplateUsed(res, views.WorkflowView.template_name) self.assertEqual(workflow.name, workflows.AddIPsecSiteConnection.name) expected_objs = ['', '', ] steps = [repr(step) for step in workflow.steps] self.assertQuerySetEqual(steps, expected_objs) self.mock_ikepolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_ipsecpolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_vpnservice_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_create')}) def test_add_ipsecsiteconnection_post(self): self._test_add_ipsecsiteconnection_post() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_create')}) def test_add_ipsecsiteconnection_post_single_subnet(self): self._test_add_ipsecsiteconnection_post(subnet_list=False) def _test_add_ipsecsiteconnection_post(self, subnet_list=True): if subnet_list: ipsecsiteconnection = self.ipsecsiteconnections.first() else: ipsecsiteconnection = self.ipsecsiteconnections.list()[1] ikepolicies = self.ikepolicies.list() ipsecpolicies = self.ipsecpolicies.list() vpnservices = self.vpnservices.list() form_data = { 'name': ipsecsiteconnection['name'], 'description': ipsecsiteconnection['description'], 'dpd_action': ipsecsiteconnection['dpd']['action'], 'dpd_interval': ipsecsiteconnection['dpd']['interval'], 'dpd_timeout': ipsecsiteconnection['dpd']['timeout'], 'ikepolicy_id': ipsecsiteconnection['ikepolicy_id'], 'initiator': ipsecsiteconnection['initiator'], 'ipsecpolicy_id': ipsecsiteconnection['ipsecpolicy_id'], 'mtu': ipsecsiteconnection['mtu'], 'peer_address': ipsecsiteconnection['peer_address'], 'peer_cidrs': ', '.join(ipsecsiteconnection['peer_cidrs']), 'peer_id': ipsecsiteconnection['peer_id'], 'psk': ipsecsiteconnection['psk'], 'vpnservice_id': ipsecsiteconnection['vpnservice_id'], 'admin_state_up': ipsecsiteconnection['admin_state_up'], } self.mock_ikepolicy_list.return_value = ikepolicies self.mock_ipsecpolicy_list.return_value = ipsecpolicies self.mock_vpnservice_list.return_value = vpnservices self.mock_ipsecsiteconnection_create.return_value = ipsecsiteconnection res = self.client.post(reverse(self.ADDVPNCONNECTION_PATH), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) self.mock_ikepolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_ipsecpolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_vpnservice_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) data = form_data.copy() data['peer_cidrs'] = ipsecsiteconnection['peer_cidrs'] data['dpd'] = {'action': data['dpd_action'], 'interval': data['dpd_interval'], 'timeout': data['dpd_timeout']} del data['dpd_action'] del data['dpd_interval'] del data['dpd_timeout'] data['local_ep_group_id'] = '' data['peer_ep_group_id'] = '' self.mock_ipsecsiteconnection_create.assert_called_once_with( helpers.IsHttpRequest(), **data) @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_create')}) def test_add_ipsecsiteconnection_post_required_fields_error(self): self._test_add_ipsecsiteconnection_post_error() @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ipsecpolicy_list', 'vpnservice_list', 'endpointgroup_list', 'ipsecsiteconnection_create')}) def test_add_ipsecsiteconnection_post_peer_cidrs_error(self): self._test_add_ipsecsiteconnection_post_error(subnets=True) def _test_add_ipsecsiteconnection_post_error(self, subnets=False): ipsecsiteconnection = self.ipsecsiteconnections.first() ikepolicies = self.ikepolicies.list() ipsecpolicies = self.ipsecpolicies.list() vpnservices = self.vpnservices.list() self.mock_ikepolicy_list.return_value = ikepolicies self.mock_ipsecpolicy_list.return_value = ipsecpolicies self.mock_vpnservice_list.return_value = vpnservices form_data = {'name': '', 'description': ipsecsiteconnection['description'], 'dpd_action': ipsecsiteconnection['dpd']['action'], 'dpd_interval': ipsecsiteconnection['dpd']['interval'], 'dpd_timeout': ipsecsiteconnection['dpd']['timeout'], 'ikepolicy_id': '', 'initiator': ipsecsiteconnection['initiator'], 'ipsecpolicy_id': '', 'mtu': ipsecsiteconnection['mtu'], 'peer_address': '', 'peer_cidrs': '', 'peer_id': '', 'psk': '', 'vpnservice_id': '', 'admin_state_up': ipsecsiteconnection[ 'admin_state_up']} if subnets: form_data['peer_cidrs'] = '20.1.0.0/24; 21.1.0.0/24' res = self.client.post(reverse(self.ADDVPNCONNECTION_PATH), form_data) if subnets: self.assertFormErrors(res, 7) else: self.assertFormErrors(res, 6) self.mock_ikepolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_ipsecpolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_vpnservice_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) @helpers.create_mocks({api_vpn: ('vpnservice_get', )}) def test_update_vpnservice_get(self): vpnservice = self.vpnservices.first() self.mock_vpnservice_get.return_value = vpnservice res = self.client.get( reverse(self.UPDATEVPNSERVICE_PATH, args=(vpnservice.id,))) self.assertTemplateUsed( res, 'project/vpn/update_vpnservice.html') self.mock_vpnservice_get.assert_called_once_with( helpers.IsHttpRequest(), vpnservice.id) @helpers.create_mocks({api_vpn: ('vpnservice_get', 'vpnservice_update')}) def test_update_vpnservice_post(self): vpnservice = self.vpnservices.first() self.mock_vpnservice_get.return_value = vpnservice data = {'name': vpnservice.name, 'description': vpnservice.description, 'admin_state_up': vpnservice.admin_state_up} self.mock_vpnservice_update.return_value = vpnservice form_data = data.copy() form_data['vpnservice_id'] = vpnservice.id res = self.client.post(reverse( self.UPDATEVPNSERVICE_PATH, args=(vpnservice.id,)), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) self.mock_vpnservice_get.assert_called_once_with( helpers.IsHttpRequest(), vpnservice.id) self.mock_vpnservice_update.assert_called_once_with( helpers.IsHttpRequest(), vpnservice.id, **data) @helpers.create_mocks({api_vpn: ('endpointgroup_get', )}) def test_update_endpointgroup_get(self): endpointgroup = self.endpointgroups.first() self.mock_endpointgroup_get.return_value = endpointgroup res = self.client.get( reverse(self.UPDATEENDPOINTGROUP_PATH, args=(endpointgroup.id,))) self.assertTemplateUsed( res, 'project/vpn/update_endpointgroup.html') self.mock_endpointgroup_get.assert_called_once_with( helpers.IsHttpRequest(), endpointgroup.id) @helpers.create_mocks({api_vpn: ('endpointgroup_get', 'endpointgroup_update')}) def test_update_endpointgroup_post(self): endpointgroup = self.endpointgroups.first() data = {'name': endpointgroup.name, 'description': endpointgroup.description} self.mock_endpointgroup_get.return_value = endpointgroup self.mock_endpointgroup_update.return_value = endpointgroup form_data = data.copy() form_data['endpoint_group_id'] = endpointgroup.id res = self.client.post(reverse(self.UPDATEENDPOINTGROUP_PATH, args=(endpointgroup.id, ) ), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) self.mock_endpointgroup_get.assert_called_once_with( helpers.IsHttpRequest(), endpointgroup.id) self.mock_endpointgroup_update.assert_called_once_with( helpers.IsHttpRequest(), endpointgroup.id, **data) @helpers.create_mocks({api_vpn: ('ikepolicy_get', )}) def test_update_ikepolicy_get(self): ikepolicy = self.ikepolicies.first() self.mock_ikepolicy_get.return_value = ikepolicy res = self.client.get( reverse(self.UPDATEIKEPOLICY_PATH, args=(ikepolicy.id,))) self.assertTemplateUsed( res, 'project/vpn/update_ikepolicy.html') self.mock_ikepolicy_get.assert_called_once_with( helpers.IsHttpRequest(), ikepolicy.id) @helpers.create_mocks({api_vpn: ('ikepolicy_get', 'ikepolicy_update')}) def test_update_ikepolicy_post(self): ikepolicy = self.ikepolicies.first() data = {'name': ikepolicy.name, 'description': ikepolicy.description, 'auth_algorithm': ikepolicy.auth_algorithm, 'encryption_algorithm': ikepolicy.encryption_algorithm, 'ike_version': ikepolicy.ike_version, 'lifetime': ikepolicy.lifetime, 'pfs': ikepolicy.pfs, 'phase1_negotiation_mode': ikepolicy.phase1_negotiation_mode} self.mock_ikepolicy_get.return_value = ikepolicy self.mock_ikepolicy_update.return_value = ikepolicy form_data = data.copy() form_data.update({'lifetime_units': form_data['lifetime']['units'], 'lifetime_value': form_data['lifetime']['value'], 'ikepolicy_id': ikepolicy.id}) form_data.pop('lifetime') res = self.client.post(reverse( self.UPDATEIKEPOLICY_PATH, args=(ikepolicy.id,)), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) self.mock_ikepolicy_get.assert_called_once_with( helpers.IsHttpRequest(), ikepolicy.id) self.mock_ikepolicy_update.assert_called_once_with( helpers.IsHttpRequest(), ikepolicy.id, **data) @helpers.create_mocks({api_vpn: ('ipsecpolicy_get', )}) def test_update_ipsecpolicy_get(self): ipsecpolicy = self.ipsecpolicies.first() self.mock_ipsecpolicy_get.return_value = ipsecpolicy res = self.client.get( reverse(self.UPDATEIPSECPOLICY_PATH, args=(ipsecpolicy.id,))) self.assertTemplateUsed( res, 'project/vpn/update_ipsecpolicy.html') self.mock_ipsecpolicy_get.assert_called_once_with( helpers.IsHttpRequest(), ipsecpolicy.id) @helpers.create_mocks({api_vpn: ('ipsecpolicy_get', 'ipsecpolicy_update')}) def test_update_ipsecpolicy_post(self): ipsecpolicy = self.ipsecpolicies.first() self.mock_ipsecpolicy_get.return_value = ipsecpolicy data = {'name': ipsecpolicy.name, 'description': ipsecpolicy.description, 'auth_algorithm': ipsecpolicy.auth_algorithm, 'encapsulation_mode': ipsecpolicy.encapsulation_mode, 'encryption_algorithm': ipsecpolicy.encryption_algorithm, 'lifetime': ipsecpolicy.lifetime, 'pfs': ipsecpolicy.pfs, 'transform_protocol': ipsecpolicy.transform_protocol} self.mock_ipsecpolicy_update.return_value = ipsecpolicy form_data = data.copy() form_data.update({'lifetime_units': form_data['lifetime']['units'], 'lifetime_value': form_data['lifetime']['value'], 'ipsecpolicy_id': ipsecpolicy.id}) form_data.pop('lifetime') res = self.client.post(reverse( self.UPDATEIPSECPOLICY_PATH, args=(ipsecpolicy.id,)), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) self.mock_ipsecpolicy_get.assert_called_once_with( helpers.IsHttpRequest(), ipsecpolicy.id) self.mock_ipsecpolicy_update.assert_called_once_with( helpers.IsHttpRequest(), ipsecpolicy.id, **data) @helpers.create_mocks({api_vpn: ('ipsecsiteconnection_get', )}) def test_update_ipsecsiteconnection_get(self): ipsecsiteconnection = self.ipsecsiteconnections.first() self.mock_ipsecsiteconnection_get.return_value = ipsecsiteconnection res = self.client.get( reverse(self.UPDATEVPNCONNECTION_PATH, args=(ipsecsiteconnection.id,))) self.assertTemplateUsed( res, 'project/vpn/update_ipsecsiteconnection.html') self.mock_ipsecsiteconnection_get.assert_called_once_with( helpers.IsHttpRequest(), ipsecsiteconnection.id) @helpers.create_mocks({api_vpn: ('ipsecsiteconnection_get', 'ipsecsiteconnection_update')}) def test_update_ipsecsiteconnection_post(self): ipsecsiteconnection = self.ipsecsiteconnections.first() self.mock_ipsecsiteconnection_get.return_value = ipsecsiteconnection data = {'name': ipsecsiteconnection.name, 'description': ipsecsiteconnection.description, 'peer_address': ipsecsiteconnection.peer_address, 'peer_id': ipsecsiteconnection.peer_id, 'peer_cidrs': ipsecsiteconnection.peer_cidrs, 'psk': ipsecsiteconnection.psk, 'mtu': ipsecsiteconnection.mtu, 'dpd': ipsecsiteconnection.dpd, 'initiator': ipsecsiteconnection.initiator, 'admin_state_up': ipsecsiteconnection.admin_state_up} self.mock_ipsecsiteconnection_update.return_value = ipsecsiteconnection form_data = data.copy() form_data.update({ 'dpd_action': form_data['dpd']['action'], 'dpd_interval': form_data['dpd']['interval'], 'dpd_timeout': form_data['dpd']['timeout'], 'peer_cidrs': ", ".join(ipsecsiteconnection['peer_cidrs']), 'ipsecsiteconnection_id': ipsecsiteconnection.id, }) form_data.pop('dpd') res = self.client.post( reverse(self.UPDATEVPNCONNECTION_PATH, args=(ipsecsiteconnection.id,)), form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, str(self.INDEX_URL)) self.mock_ipsecsiteconnection_get.assert_called_once_with( helpers.IsHttpRequest(), ipsecsiteconnection.id) self.mock_ipsecsiteconnection_update.assert_called_once_with( helpers.IsHttpRequest(), ipsecsiteconnection.id, **data) @helpers.create_mocks({api_vpn: ('vpnservice_list', 'vpnservice_delete',)}) def test_delete_vpnservice(self): vpnservice = self.vpnservices.list()[1] self.mock_vpnservice_list.return_value = self.vpnservices.list() self.mock_vpnservice_delete.return_value = None form_data = {"action": "vpnservicestable__deletevpnservice__%s" % vpnservice.id} res = self.client.post(self.INDEX_URL, form_data) self.assertNoFormErrors(res) self.mock_vpnservice_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_vpnservice_delete.assert_called_once_with( helpers.IsHttpRequest(), vpnservice.id) @helpers.create_mocks({api_vpn: ('endpointgroup_list', 'endpointgroup_delete',)}) def test_delete_endpointgroup(self): endpointgroup = self.endpointgroups.list()[0] self.mock_endpointgroup_list.return_value = self.endpointgroups.list() self.mock_endpointgroup_delete.return_value = None form_data = {"action": "endpointgroupstable__deleteendpointgroup__%s" % endpointgroup.id} res = self.client.post(self.INDEX_URL, form_data) self.assertNoFormErrors(res) self.mock_endpointgroup_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_endpointgroup_delete.assert_called_once_with( helpers.IsHttpRequest(), endpointgroup.id) @helpers.create_mocks({api_vpn: ('ikepolicy_list', 'ikepolicy_delete',)}) def test_delete_ikepolicy(self): ikepolicy = self.ikepolicies.list()[1] self.mock_ikepolicy_list.return_value = self.ikepolicies.list() self.mock_ikepolicy_delete.return_value = None form_data = {"action": "ikepoliciestable__deleteikepolicy__%s" % ikepolicy.id} res = self.client.post(self.INDEX_URL, form_data) self.assertNoFormErrors(res) self.mock_ikepolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_ikepolicy_delete.assert_called_once_with( helpers.IsHttpRequest(), ikepolicy.id) @helpers.create_mocks({api_vpn: ('ipsecpolicy_list', 'ipsecpolicy_delete',)}) def test_delete_ipsecpolicy(self): ipsecpolicy = self.ipsecpolicies.list()[1] self.mock_ipsecpolicy_list.return_value = self.ipsecpolicies.list() self.mock_ipsecpolicy_delete.return_value = None form_data = {"action": "ipsecpoliciestable__deleteipsecpolicy__%s" % ipsecpolicy.id} res = self.client.post(self.INDEX_URL, form_data) self.assertNoFormErrors(res) self.mock_ipsecpolicy_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_ipsecpolicy_delete.assert_called_once_with( helpers.IsHttpRequest(), ipsecpolicy.id) @helpers.create_mocks({api_vpn: ('ipsecsiteconnection_list', 'ipsecsiteconnection_delete',)}) def test_delete_ipsecsiteconnection(self): ipsecsiteconnection = self.ipsecsiteconnections.first() self.mock_ipsecsiteconnection_list.return_value = \ self.ipsecsiteconnections.list() self.mock_ipsecsiteconnection_delete.return_value = None form_data = {"action": "ipsecsiteconnectionstable__deleteipsecsiteconnection__%s" % ipsecsiteconnection.id} res = self.client.post(self.INDEX_URL, form_data) self.assertNoFormErrors(res) self.mock_ipsecsiteconnection_list.assert_called_once_with( helpers.IsHttpRequest(), tenant_id=self.tenant.id) self.mock_ipsecsiteconnection_delete.assert_called_once_with( helpers.IsHttpRequest(), ipsecsiteconnection.id) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2704275 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/urls.py0000664000175000017500000000544115257164532030501 0ustar00zuulzuul# Copyright 2013, Mirantis Inc # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.urls import re_path from neutron_vpnaas_dashboard.dashboards.project.vpn import views urlpatterns = [ re_path(r'^$', views.IndexView.as_view(), name='index'), re_path(r'^addikepolicy$', views.AddIKEPolicyView.as_view(), name='addikepolicy'), re_path(r'^update_ikepolicy/(?P[^/]+)/$', views.UpdateIKEPolicyView.as_view(), name='update_ikepolicy'), re_path(r'^addipsecpolicy$', views.AddIPsecPolicyView.as_view(), name='addipsecpolicy'), re_path(r'^update_ipsecpolicy/(?P[^/]+)/$', views.UpdateIPsecPolicyView.as_view(), name='update_ipsecpolicy'), re_path(r'^addipsecsiteconnection$', views.AddIPsecSiteConnectionView.as_view(), name='addipsecsiteconnection'), re_path(r'^update_ipsecsiteconnection/(?P[^/]+)/$', views.UpdateIPsecSiteConnectionView.as_view(), name='update_ipsecsiteconnection'), re_path(r'^addvpnservice$', views.AddVPNServiceView.as_view(), name='addvpnservice'), re_path(r'^update_vpnservice/(?P[^/]+)/$', views.UpdateVPNServiceView.as_view(), name='update_vpnservice'), re_path(r'^addendpointgroup$', views.AddEndpointGroupView.as_view(), name='addendpointgroup'), re_path(r'^update_endpointgroup/(?P[^/]+)/$', views.UpdateEndpointGroupView.as_view(), name='update_endpointgroup'), re_path(r'^ikepolicy/(?P[^/]+)/$', views.IKEPolicyDetailsView.as_view(), name='ikepolicydetails'), re_path(r'^ipsecpolicy/(?P[^/]+)/$', views.IPsecPolicyDetailsView.as_view(), name='ipsecpolicydetails'), re_path(r'^vpnservice/(?P[^/]+)/$', views.VPNServiceDetailsView.as_view(), name='vpnservicedetails'), re_path(r'^endpointgroup/(?P[^/]+)/$', views.EndpointGroupDetailsView.as_view(), name='endpointgroupdetails'), re_path(r'^ipsecsiteconnection/(?P[^/]+)/$', views.IPsecSiteConnectionDetailsView.as_view(), name='ipsecsiteconnectiondetails'), ] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2704275 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/views.py0000664000175000017500000004354215257164532030655 0ustar00zuulzuul# Copyright 2013, Mirantis Inc # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.urls import reverse from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ from horizon import exceptions from horizon import forms as horizon_forms from horizon import tabs as horizon_tabs from horizon.utils import memoized from horizon import workflows as horizon_workflows from neutron_vpnaas_dashboard.api import vpn as api_vpn from neutron_vpnaas_dashboard.dashboards.project.vpn import forms from neutron_vpnaas_dashboard.dashboards.project.vpn import tables from neutron_vpnaas_dashboard.dashboards.project.vpn import tabs from neutron_vpnaas_dashboard.dashboards.project.vpn import workflows class IndexView(horizon_tabs.TabbedTableView): tab_group_class = tabs.VPNTabs template_name = 'project/vpn/index.html' page_title = _("Virtual Private Network") class AddVPNServiceView(horizon_workflows.WorkflowView): workflow_class = workflows.AddVPNService class AddEndpointGroupView(horizon_workflows.WorkflowView): workflow_class = workflows.AddEndpointGroup class AddIPsecSiteConnectionView(horizon_workflows.WorkflowView): workflow_class = workflows.AddIPsecSiteConnection class AddIKEPolicyView(horizon_workflows.WorkflowView): workflow_class = workflows.AddIKEPolicy class AddIPsecPolicyView(horizon_workflows.WorkflowView): workflow_class = workflows.AddIPsecPolicy class IKEPolicyDetailsView(horizon_tabs.TabView): tab_group_class = tabs.IKEPolicyDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ ikepolicy.name|default:ikepolicy.id }}" @memoized.memoized_method def get_data(self): pid = self.kwargs['ikepolicy_id'] try: return api_vpn.ikepolicy_get(self.request, pid) except Exception: msg = _('Unable to retrieve IKE policy details.') exceptions.handle(self.request, msg, redirect=self.get_redirect_url()) def get_context_data(self, **kwargs): context = super(IKEPolicyDetailsView, self).get_context_data(**kwargs) ikepolicy = self.get_data() table = tables.IKEPoliciesTable(self.request) context["ikepolicy"] = ikepolicy context["url"] = self.get_redirect_url() context["actions"] = table.render_row_actions(ikepolicy) return context def get_tabs(self, request, *args, **kwargs): ikepolicy = self.get_data() return self.tab_group_class(request, ikepolicy=ikepolicy, **kwargs) @staticmethod def get_redirect_url(): return reverse('horizon:project:vpn:index') class IPsecPolicyDetailsView(horizon_tabs.TabView): tab_group_class = tabs.IPsecPolicyDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ ipsecpolicy.name|default:ipsecpolicy.id }}" @memoized.memoized_method def get_data(self): pid = self.kwargs['ipsecpolicy_id'] try: return api_vpn.ipsecpolicy_get(self.request, pid) except Exception: msg = _('Unable to retrieve IPsec policy details.') exceptions.handle(self.request, msg, redirect=self.get_redirect_url()) def get_context_data(self, **kwargs): context = super(IPsecPolicyDetailsView, self).get_context_data( **kwargs) ipsecpolicy = self.get_data() table = tables.IPsecPoliciesTable(self.request) context["ipsecpolicy"] = ipsecpolicy context["url"] = self.get_redirect_url() context["actions"] = table.render_row_actions(ipsecpolicy) return context def get_tabs(self, request, *args, **kwargs): ipsecpolicy = self.get_data() return self.tab_group_class(request, ipsecpolicy=ipsecpolicy, **kwargs) @staticmethod def get_redirect_url(): return reverse('horizon:project:vpn:index') class VPNServiceDetailsView(horizon_tabs.TabView): tab_group_class = tabs.VPNServiceDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ vpnservice.name|default:vpnservice.id }}" @memoized.memoized_method def get_data(self): sid = self.kwargs['vpnservice_id'] try: vpnservice = api_vpn.vpnservice_get(self.request, sid) except Exception: vpnservice = [] msg = _('Unable to retrieve VPN service details.') exceptions.handle(self.request, msg, redirect=self.get_redirect_url()) try: connections = api_vpn.ipsecsiteconnection_list( self.request, vpnservice_id=sid) vpnservice.vpnconnections = connections except Exception: vpnservice.vpnconnections = [] return vpnservice def get_context_data(self, **kwargs): context = super(VPNServiceDetailsView, self).get_context_data(**kwargs) vpnservice = self.get_data() table = tables.VPNServicesTable(self.request) context["vpnservice"] = vpnservice context["url"] = self.get_redirect_url() context["actions"] = table.render_row_actions(vpnservice) return context def get_tabs(self, request, *args, **kwargs): vpnservice = self.get_data() return self.tab_group_class(request, vpnservice=vpnservice, **kwargs) @staticmethod def get_redirect_url(): return reverse('horizon:project:vpn:index') class EndpointGroupDetailsView(horizon_tabs.TabView): tab_group_class = tabs.EndpointGroupDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ endpointgroup.name|default:endpointgroup.id }}" @memoized.memoized_method def get_data(self): gid = self.kwargs['endpoint_group_id'] try: endpointgroup = api_vpn.endpointgroup_get(self.request, gid) except Exception: msg = _('Unable to retrieve endpoint group details.') exceptions.handle(self.request, msg, redirect=self.get_redirect_url()) try: connections = api_vpn.ipsecsiteconnection_list( self.request, endpoint_group_id=gid) endpointgroup.vpnconnections = connections except Exception: endpointgroup.vpnconnections = [] return endpointgroup def get_context_data(self, **kwargs): context = super(EndpointGroupDetailsView, self).get_context_data( **kwargs) endpointgroup = self.get_data() table = tables.EndpointGroupTable(self.request) context["endpointgroup"] = endpointgroup context["url"] = self.get_redirect_url() context["actions"] = table.render_row_actions(endpointgroup) return context def get_tabs(self, request, *args, **kwargs): endpointgroup = self.get_data() return self.tab_group_class(request, endpointgroup=endpointgroup, **kwargs) @staticmethod def get_redirect_url(): return reverse('horizon:project:vpn:index') class IPsecSiteConnectionDetailsView(horizon_tabs.TabView): tab_group_class = tabs.IPsecSiteConnectionDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ ipsecsiteconnection.name|default:ipsecsiteconnection.id}}" @memoized.memoized_method def get_data(self): cid = self.kwargs['ipsecsiteconnection_id'] try: return api_vpn.ipsecsiteconnection_get(self.request, cid) except Exception: msg = _('Unable to retrieve IPsec site connection details.') exceptions.handle(self.request, msg, redirect=self.get_redirect_url()) def get_context_data(self, **kwargs): context = super(IPsecSiteConnectionDetailsView, self).get_context_data( **kwargs) ipsecsiteconnection = self.get_data() table = tables.IPsecSiteConnectionsTable(self.request) context["ipsecsiteconnection"] = ipsecsiteconnection context["url"] = self.get_redirect_url() context["actions"] = table.render_row_actions(ipsecsiteconnection) return context def get_tabs(self, request, *args, **kwargs): ipsecsiteconnection = self.get_data() return self.tab_group_class(request, ipsecsiteconnection=ipsecsiteconnection, **kwargs) @staticmethod def get_redirect_url(): return reverse('horizon:project:vpn:index') class UpdateVPNServiceView(horizon_forms.ModalFormView): form_class = forms.UpdateVPNService form_id = "update_vpnservice_form" template_name = "project/vpn/update_vpnservice.html" context_object_name = 'vpnservice' submit_label = _("Save Changes") submit_url = "horizon:project:vpn:update_vpnservice" success_url = reverse_lazy("horizon:project:vpn:index") page_title = _("Edit VPN Service") def get_context_data(self, **kwargs): context = super(UpdateVPNServiceView, self).get_context_data(**kwargs) context["vpnservice_id"] = self.kwargs['vpnservice_id'] args = (self.kwargs['vpnservice_id'],) context['submit_url'] = reverse(self.submit_url, args=args) return context @memoized.memoized_method def _get_object(self, *args, **kwargs): vpnservice_id = self.kwargs['vpnservice_id'] try: return api_vpn.vpnservice_get(self.request, vpnservice_id) except Exception: redirect = self.success_url msg = _('Unable to retrieve VPN service details.') exceptions.handle(self.request, msg, redirect=redirect) def get_initial(self): vpnservice = self._get_object() return {'name': vpnservice['name'], 'vpnservice_id': vpnservice['id'], 'description': vpnservice['description'], 'admin_state_up': vpnservice['admin_state_up']} class UpdateEndpointGroupView(horizon_forms.ModalFormView): form_class = forms.UpdateEndpointGroup form_id = "update_endpointgroup_form" template_name = "project/vpn/update_endpointgroup.html" context_object_name = 'endpointgroup' submit_label = _("Save Changes") submit_url = "horizon:project:vpn:update_endpointgroup" success_url = reverse_lazy("horizon:project:vpn:index") page_title = _("Edit Endpoint Group") def get_context_data(self, **kwargs): context = super(UpdateEndpointGroupView, self).get_context_data( **kwargs) context["endpoint_group_id"] = self.kwargs['endpoint_group_id'] args = (self.kwargs['endpoint_group_id'],) context['submit_url'] = reverse(self.submit_url, args=args) return context @memoized.memoized_method def _get_object(self, *args, **kwargs): endpoint_group_id = self.kwargs['endpoint_group_id'] try: return api_vpn.endpointgroup_get(self.request, endpoint_group_id) except Exception: redirect = self.success_url msg = _('Unable to retrieve endpoint group details.') exceptions.handle(self.request, msg, redirect=redirect) def get_initial(self): endpointgroup = self._get_object() return {'name': endpointgroup['name'], 'endpoint_group_id': endpointgroup['id'], 'description': endpointgroup['description']} class UpdateIKEPolicyView(horizon_forms.ModalFormView): form_class = forms.UpdateIKEPolicy form_id = "update_ikepolicy_form" template_name = "project/vpn/update_ikepolicy.html" context_object_name = 'ikepolicy' submit_label = _("Save Changes") submit_url = "horizon:project:vpn:update_ikepolicy" success_url = reverse_lazy("horizon:project:vpn:index") page_title = _("Edit IKE Policy") def get_context_data(self, **kwargs): context = super(UpdateIKEPolicyView, self).get_context_data(**kwargs) context["ikepolicy_id"] = self.kwargs['ikepolicy_id'] args = (self.kwargs['ikepolicy_id'],) context['submit_url'] = reverse(self.submit_url, args=args) return context @memoized.memoized_method def _get_object(self, *args, **kwargs): ikepolicy_id = self.kwargs['ikepolicy_id'] try: return api_vpn.ikepolicy_get(self.request, ikepolicy_id) except Exception: redirect = self.success_url msg = _('Unable to retrieve IKE policy details.') exceptions.handle(self.request, msg, redirect=redirect) def get_initial(self): ikepolicy = self._get_object() return {'name': ikepolicy['name'], 'ikepolicy_id': ikepolicy['id'], 'description': ikepolicy['description'], 'auth_algorithm': ikepolicy['auth_algorithm'], 'encryption_algorithm': ikepolicy['encryption_algorithm'], 'ike_version': ikepolicy['ike_version'], 'lifetime_units': ikepolicy['lifetime']['units'], 'lifetime_value': ikepolicy['lifetime']['value'], 'pfs': ikepolicy['pfs'], 'phase1_negotiation_mode': ikepolicy[ 'phase1_negotiation_mode']} class UpdateIPsecPolicyView(horizon_forms.ModalFormView): form_class = forms.UpdateIPsecPolicy form_id = "update_ipsecpolicy_form" template_name = "project/vpn/update_ipsecpolicy.html" context_object_name = 'ipsecpolicy' submit_label = _("Save Changes") submit_url = "horizon:project:vpn:update_ipsecpolicy" success_url = reverse_lazy("horizon:project:vpn:index") page_title = _("Edit IPsec Policy") def get_context_data(self, **kwargs): context = super(UpdateIPsecPolicyView, self).get_context_data(**kwargs) context["ipsecpolicy_id"] = self.kwargs['ipsecpolicy_id'] args = (self.kwargs['ipsecpolicy_id'],) context['submit_url'] = reverse(self.submit_url, args=args) return context @memoized.memoized_method def _get_object(self, *args, **kwargs): ipsecpolicy_id = self.kwargs['ipsecpolicy_id'] try: return api_vpn.ipsecpolicy_get(self.request, ipsecpolicy_id) except Exception: redirect = self.success_url msg = _('Unable to retrieve IPsec policy details.') exceptions.handle(self.request, msg, redirect=redirect) def get_initial(self): ipsecpolicy = self._get_object() return {'name': ipsecpolicy['name'], 'ipsecpolicy_id': ipsecpolicy['id'], 'description': ipsecpolicy['description'], 'auth_algorithm': ipsecpolicy['auth_algorithm'], 'encapsulation_mode': ipsecpolicy['encapsulation_mode'], 'encryption_algorithm': ipsecpolicy['encryption_algorithm'], 'lifetime_units': ipsecpolicy['lifetime']['units'], 'lifetime_value': ipsecpolicy['lifetime']['value'], 'pfs': ipsecpolicy['pfs'], 'transform_protocol': ipsecpolicy['transform_protocol']} class UpdateIPsecSiteConnectionView(horizon_forms.ModalFormView): form_class = forms.UpdateIPsecSiteConnection form_id = "update_ipsecsiteconnection_form" template_name = "project/vpn/update_ipsecsiteconnection.html" context_object_name = 'ipsecsiteconnection' submit_label = _("Save Changes") submit_url = "horizon:project:vpn:update_ipsecsiteconnection" success_url = reverse_lazy("horizon:project:vpn:index") page_title = _("Edit IPsec Site Connection") def get_context_data(self, **kwargs): context = super( UpdateIPsecSiteConnectionView, self).get_context_data(**kwargs) context["ipsecsiteconnection_id"] = self.kwargs[ 'ipsecsiteconnection_id'] args = (self.kwargs['ipsecsiteconnection_id'],) context['submit_url'] = reverse(self.submit_url, args=args) return context @memoized.memoized_method def _get_object(self, *args, **kwargs): connection_id = self.kwargs['ipsecsiteconnection_id'] try: return api_vpn.ipsecsiteconnection_get(self.request, connection_id) except Exception: redirect = self.success_url msg = _('Unable to retrieve IPsec site connection details.') exceptions.handle(self.request, msg, redirect=redirect) def get_initial(self): ipsecsiteconnection = self._get_object() data = { 'name': ipsecsiteconnection['name'], 'ipsecsiteconnection_id': ipsecsiteconnection['id'], 'description': ipsecsiteconnection['description'], 'peer_address': ipsecsiteconnection['peer_address'], 'peer_id': ipsecsiteconnection['peer_id'], 'psk': ipsecsiteconnection['psk'], 'mtu': ipsecsiteconnection['mtu'], 'dpd_action': ipsecsiteconnection['dpd']['action'], 'dpd_interval': ipsecsiteconnection['dpd']['interval'], 'dpd_timeout': ipsecsiteconnection['dpd']['timeout'], 'initiator': ipsecsiteconnection['initiator'], 'admin_state_up': ipsecsiteconnection['admin_state_up'] } if 'local_ep_group_id' in ipsecsiteconnection: data['local_ep_group_id'] = \ ipsecsiteconnection['local_ep_group_id'] data['peer_ep_group_id'] = ipsecsiteconnection['peer_ep_group_id'] return data else: data['peer_cidrs'] = ", ".join(ipsecsiteconnection['peer_cidrs']) return data ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2714276 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/dashboards/project/vpn/workflows.py0000664000175000017500000010247315257164532031554 0ustar00zuulzuul# Copyright 2013, Mirantis Inc # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.utils.translation import gettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import workflows from openstack_dashboard import api from neutron_vpnaas_dashboard.api import vpn as api_vpn class AddVPNServiceAction(workflows.Action): name = forms.CharField(max_length=80, label=_("Name"), required=False) description = forms.CharField( initial="", required=False, max_length=80, label=_("Description")) router_id = forms.ThemableChoiceField(label=_("Router")) subnet_id = forms.ThemableChoiceField( label=_("Subnet"), help_text=_("Optional. No need to be specified " "when you use endpoint groups."), required=False) admin_state_up = forms.BooleanField( label=_("Enable Admin State"), help_text=_("The state of VPN service to start in. If disabled " "(not checked), VPN service does not forward packets."), initial=True, required=False) def __init__(self, request, *args, **kwargs): super(AddVPNServiceAction, self).__init__(request, *args, **kwargs) def populate_subnet_id_choices(self, request, context): subnet_id_choices = [('', _("Select a Subnet"))] try: tenant_id = request.user.tenant_id networks = api.neutron.network_list_for_tenant(request, tenant_id) except Exception: exceptions.handle(request, _('Unable to retrieve networks list.')) networks = [] for n in networks: for s in n['subnets']: subnet_id_choices.append((s.id, s.cidr)) self.fields['subnet_id'].choices = subnet_id_choices return subnet_id_choices def populate_router_id_choices(self, request, context): router_id_choices = [('', _("Select a Router"))] try: tenant_id = request.user.tenant_id routers = api.neutron.router_list(request, tenant_id=tenant_id) except Exception: exceptions.handle(request, _('Unable to retrieve routers list.')) routers = [] for r in routers: if not r.external_gateway_info: continue router_id_choices.append((r.id, r.name)) self.fields['router_id'].choices = router_id_choices return router_id_choices class Meta(object): name = _("Add New VPN Service") permissions = ('openstack.services.network',) help_text_template = "project/vpn/_add_vpn_service_help.html" class AddVPNServiceStep(workflows.Step): action_class = AddVPNServiceAction contributes = ("name", "description", "subnet_id", "router_id", "admin_state_up") def contribute(self, data, context): context = super(AddVPNServiceStep, self).contribute(data, context) if data: return context class AddVPNService(workflows.Workflow): slug = "addvpnservice" name = _("Add VPN Service") finalize_button_name = _("Add") success_message = _('Added VPN service "%s".') failure_message = _('Unable to add VPN service "%s".') success_url = "horizon:project:vpn:index" default_steps = (AddVPNServiceStep,) def format_status_message(self, message): return message % self.context.get('name') def handle(self, request, context): try: api_vpn.vpnservice_create(request, **context) return True except Exception: return False class AddEndpointGroupAction(workflows.Action): name = forms.CharField( max_length=80, label=_("Name"), required=False) description = forms.CharField( initial="", required=False, max_length=80, label=_("Description")) type = forms.ThemableChoiceField( label=_("Type"), help_text=_("IPsec connection validation requires that local " "endpoints are subnets, and peer endpoints are CIDRs."), choices=[('cidr', _('CIDR (for external systems)')), ('subnet', _('Subnet (for local systems)'))], widget=forms.ThemableSelectWidget(attrs={ 'class': 'switchable', 'data-slug': 'type', })) cidrs = forms.MultiIPField( required=False, label=_("External System CIDRs"), widget=forms.TextInput(attrs={ 'class': 'switched', 'data-switch-on': 'type', 'data-type-cidr': _("External System CIDRs"), }), help_text=_("Remote peer subnet(s) address(es) " "with mask(s) in CIDR format " "separated with commas if needed " "(e.g. 20.1.0.0/24, 21.1.0.0/24). " "This field is valid if type is CIDR"), version=forms.IPv4 | forms.IPv6, mask=True) subnets = forms.MultipleChoiceField( required=False, label=_("Local System Subnets"), widget=forms.CheckboxSelectMultiple(attrs={ 'class': 'switched', 'data-switch-on': 'type', 'data-type-subnet': _("External System Subnets"), }), help_text=_("Local subnet(s). " "This field is valid if type is Subnet"),) def populate_subnets_choices(self, request, context): subnets_choices = [] try: tenant_id = request.user.tenant_id networks = api.neutron.network_list_for_tenant(request, tenant_id) except Exception: exceptions.handle(request, _('Unable to retrieve networks list.')) networks = [] for n in networks: for s in n['subnets']: subnets_choices.append((s.id, s.cidr)) self.fields['subnets'].choices = subnets_choices return subnets_choices class Meta(object): name = _("Add New Endpoint Groups") permissions = ('openstack.services.network',) help_text_template = "project/vpn/_add_endpoint_group_help.html" class AddEndpointGroupStep(workflows.Step): action_class = AddEndpointGroupAction contributes = ("name", "description", "type", "cidrs", "subnets", "endpoints") def contribute(self, data, context): context = super(AddEndpointGroupStep, self).contribute(data, context) if context['type'] == 'cidr': cidrs = context['cidrs'] context['endpoints'] = [ cidr.strip() for cidr in cidrs.split(',') if cidr.strip()] else: context['endpoints'] = context['subnets'] if data: return context class AddEndpointGroup(workflows.Workflow): slug = "addendpointgroup" name = _("Add Endpoint Group") finalize_button_name = _("Add") success_message = _('Added endpoint group "%s".') failure_message = _('Unable to add endpoint group "%s".') success_url = "horizon:project:vpn:index" default_steps = (AddEndpointGroupStep,) def format_status_message(self, message): return message % self.context.get('name') def handle(self, request, context): try: api_vpn.endpointgroup_create(request, name=context['name'], description=context['description'], type=context['type'], endpoints=context['endpoints']) return True except Exception: return False class AddIKEPolicyAction(workflows.Action): name = forms.CharField(max_length=80, label=_("Name"), required=False) description = forms.CharField( initial="", required=False, max_length=80, label=_("Description")) auth_algorithm = forms.ThemableChoiceField( label=_("Authorization algorithm"), required=False) encryption_algorithm = forms.ThemableChoiceField( label=_("Encryption algorithm"), required=False) ike_version = forms.ThemableChoiceField( label=_("IKE version"), required=False) lifetime_units = forms.ThemableChoiceField( label=_("Lifetime units for IKE keys"), required=False) lifetime_value = forms.IntegerField( min_value=60, label=_("Lifetime value for IKE keys"), initial=3600, help_text=_("Equal to or greater than 60"), required=False) pfs = forms.ThemableChoiceField( label=_("Perfect Forward Secrecy"), required=False) phase1_negotiation_mode = forms.ThemableChoiceField( label=_("IKE Phase1 negotiation mode"), required=False) def __init__(self, request, *args, **kwargs): super(AddIKEPolicyAction, self).__init__(request, *args, **kwargs) auth_algorithm_choices = [ ("sha1", "SHA-1"), ('sha256', _('SHA-256')), ('sha384', _('SHA-384')), ('sha512', _('SHA-512')), ('aes-xcbc', _('AES-XCBC')), ('aes-cmac', _('AES-CMAC')), ] self.fields['auth_algorithm'].choices = auth_algorithm_choices # Currently this field has only one choice, so mark it as readonly. self.fields['auth_algorithm'].widget.attrs['readonly'] = True encryption_algorithm_choices = [("3des", "3DES"), ("aes-128", "AES-128"), ("aes-192", "AES-192"), ("aes-256", "AES-256"), ("aes-128-ctr", "AES-128-CTR"), ("aes-192-ctr", "AES-192-CTR"), ("aes-256-ctr", "AES-256-CTR"), ("aes-128-ccm-8", "AES-128-CCM-8"), ("aes-192-ccm-8", "AES-192-CCM-8"), ("aes-256-ccm-8", "AES-256-CCM-8"), ("aes-128-ccm-12", "AES-128-CCM-12"), ("aes-192-ccm-12", "AES-192-CCM-12"), ("aes-256-ccm-12", "AES-256-CCM-12"), ("aes-128-ccm-16", "AES-128-CCM-16"), ("aes-192-ccm-16", "AES-192-CCM-16"), ("aes-256-ccm-16", "AES-256-CCM-16"), ("aes-128-gcm-8", "AES-128-GCM-8"), ("aes-192-gcm-8", "AES-192-GCM-8"), ("aes-256-gcm-8", "AES-256-GCM-8"), ("aes-128-gcm-12", "AES-128-GCM-12"), ("aes-192-gcm-12", "AES-192-GCM-12"), ("aes-256-gcm-12", "AES-256-GCM-12"), ("aes-128-gcm-16", "AES-128-GCM-16"), ("aes-192-gcm-16", "AES-192-GCM-16"), ("aes-256-gcm-16", "AES-256-GCM-16")] self.fields[ 'encryption_algorithm'].choices = encryption_algorithm_choices self.fields['encryption_algorithm'].initial = "aes-128" ike_version_choices = [("v1", "v1"), ("v2", "v2")] self.fields['ike_version'].choices = ike_version_choices lifetime_units_choices = [("seconds", "seconds")] self.fields['lifetime_units'].choices = lifetime_units_choices # Currently this field has only one choice, so mark it as readonly. self.fields['lifetime_units'].widget.attrs['readonly'] = True pfs_choices = [("group2", "group2"), ("group5", "group5"), ("group14", "group14"), ("group15", "group15"), ("group16", "group16"), ("group17", "group17"), ("group18", "group18"), ("group19", "group19"), ("group20", "group20"), ("group21", "group21"), ("group22", "group22"), ("group23", "group23"), ("group24", "group24"), ("group25", "group25"), ("group26", "group26"), ("group27", "group27"), ("group28", "group28"), ("group29", "group29"), ("group30", "group30"), ("group31", "group31")] self.fields['pfs'].choices = pfs_choices self.fields['pfs'].initial = "group5" phase1_neg_mode_choices = [("main", "main"), ("aggressive", "aggressive")] self.fields[ 'phase1_negotiation_mode'].choices = phase1_neg_mode_choices class Meta(object): name = _("Add New IKE Policy") permissions = ('openstack.services.network',) help_text_template = "project/vpn/_add_ike_policy_help.html" class AddIKEPolicyStep(workflows.Step): action_class = AddIKEPolicyAction contributes = ("name", "description", "auth_algorithm", "encryption_algorithm", "ike_version", "lifetime_units", "lifetime_value", "pfs", "phase1_negotiation_mode") def contribute(self, data, context): context = super(AddIKEPolicyStep, self).contribute(data, context) context['lifetime'] = {'units': data['lifetime_units'], 'value': data['lifetime_value']} context.pop('lifetime_units') context.pop('lifetime_value') if data: return context class AddIKEPolicy(workflows.Workflow): slug = "addikepolicy" name = _("Add IKE Policy") finalize_button_name = _("Add") success_message = _('Added IKE policy "%s".') failure_message = _('Unable to add IKE policy "%s".') success_url = "horizon:project:vpn:index" default_steps = (AddIKEPolicyStep,) def format_status_message(self, message): return message % self.context.get('name') def handle(self, request, context): try: api_vpn.ikepolicy_create(request, **context) return True except Exception: return False class AddIPsecPolicyAction(workflows.Action): name = forms.CharField(max_length=80, label=_("Name"), required=False) description = forms.CharField( initial="", required=False, max_length=80, label=_("Description")) auth_algorithm = forms.ThemableChoiceField( label=_("Authorization algorithm"), required=False) encapsulation_mode = forms.ThemableChoiceField( label=_("Encapsulation mode"), required=False) encryption_algorithm = forms.ThemableChoiceField( label=_("Encryption algorithm"), required=False) lifetime_units = forms.ThemableChoiceField( label=_("Lifetime units"), required=False) lifetime_value = forms.IntegerField( min_value=60, label=_("Lifetime value for IKE keys "), initial=3600, help_text=_("Equal to or greater than 60"), required=False) pfs = forms.ThemableChoiceField( label=_("Perfect Forward Secrecy"), required=False) transform_protocol = forms.ThemableChoiceField( label=_("Transform Protocol"), required=False) def __init__(self, request, *args, **kwargs): super(AddIPsecPolicyAction, self).__init__(request, *args, **kwargs) auth_algorithm_choices = [ ("sha1", "SHA-1"), ('sha256', _('SHA-256')), ('sha384', _('SHA-384')), ('sha512', _('SHA-512')), ('aes-xcbc', _('AES-XCBC')), ('aes-cmac', _('AES-CMAC')), ] self.fields['auth_algorithm'].choices = auth_algorithm_choices # Currently this field has only one choice, so mark it as readonly. self.fields['auth_algorithm'].widget.attrs['readonly'] = True encapsulation_mode_choices = [("tunnel", "tunnel"), ("transport", "transport")] self.fields['encapsulation_mode'].choices = encapsulation_mode_choices encryption_algorithm_choices = [("3des", "3DES"), ("aes-128", "AES-128"), ("aes-192", "AES-192"), ("aes-256", "AES-256"), ("aes-128-ctr", "AES-128-CTR"), ("aes-192-ctr", "AES-192-CTR"), ("aes-256-ctr", "AES-256-CTR"), ("aes-128-ccm-8", "AES-128-CCM-8"), ("aes-192-ccm-8", "AES-192-CCM-8"), ("aes-256-ccm-8", "AES-256-CCM-8"), ("aes-128-ccm-12", "AES-128-CCM-12"), ("aes-192-ccm-12", "AES-192-CCM-12"), ("aes-256-ccm-12", "AES-256-CCM-12"), ("aes-128-ccm-16", "AES-128-CCM-16"), ("aes-192-ccm-16", "AES-192-CCM-16"), ("aes-256-ccm-16", "AES-256-CCM-16"), ("aes-128-gcm-8", "AES-128-GCM-8"), ("aes-192-gcm-8", "AES-192-GCM-8"), ("aes-256-gcm-8", "AES-256-GCM-8"), ("aes-128-gcm-12", "AES-128-GCM-12"), ("aes-192-gcm-12", "AES-192-GCM-12"), ("aes-256-gcm-12", "AES-256-GCM-12"), ("aes-128-gcm-16", "AES-128-GCM-16"), ("aes-192-gcm-16", "AES-192-GCM-16"), ("aes-256-gcm-16", "AES-256-GCM-16")] self.fields[ 'encryption_algorithm'].choices = encryption_algorithm_choices self.fields['encryption_algorithm'].initial = "aes-128" lifetime_units_choices = [("seconds", "seconds")] self.fields['lifetime_units'].choices = lifetime_units_choices # Currently this field has only one choice, so mark it as readonly. self.fields['lifetime_units'].widget.attrs['readonly'] = True pfs_choices = [("group2", "group2"), ("group5", "group5"), ("group14", "group14"), ("group15", "group15"), ("group16", "group16"), ("group17", "group17"), ("group18", "group18"), ("group19", "group19"), ("group20", "group20"), ("group21", "group21"), ("group22", "group22"), ("group23", "group23"), ("group24", "group24"), ("group25", "group25"), ("group26", "group26"), ("group27", "group27"), ("group28", "group28"), ("group29", "group29"), ("group30", "group30"), ("group31", "group31")] self.fields['pfs'].choices = pfs_choices self.fields['pfs'].initial = "group5" transform_protocol_choices = [("esp", "ESP"), ("ah", "AH"), ("ah-esp", "AH-ESP")] self.fields['transform_protocol'].choices = transform_protocol_choices class Meta(object): name = _("Add New IPsec Policy") permissions = ('openstack.services.network',) help_text_template = 'project/vpn/_add_ipsec_policy_help.html' class AddIPsecPolicyStep(workflows.Step): action_class = AddIPsecPolicyAction contributes = ("name", "description", "auth_algorithm", "encapsulation_mode", "encryption_algorithm", "lifetime_units", "lifetime_value", "pfs", "transform_protocol") def contribute(self, data, context): context = super(AddIPsecPolicyStep, self).contribute(data, context) context['lifetime'] = {'units': data['lifetime_units'], 'value': data['lifetime_value']} context.pop('lifetime_units') context.pop('lifetime_value') if data: return context class AddIPsecPolicy(workflows.Workflow): slug = "addipsecpolicy" name = _("Add IPsec Policy") finalize_button_name = _("Add") success_message = _('Added IPsec policy "%s".') failure_message = _('Unable to add IPsec policy "%s".') success_url = "horizon:project:vpn:index" default_steps = (AddIPsecPolicyStep,) def format_status_message(self, message): return message % self.context.get('name') def handle(self, request, context): try: api_vpn.ipsecpolicy_create(request, **context) return True except Exception: return False class AddIPsecSiteConnectionAction(workflows.Action): name = forms.CharField(max_length=80, label=_("Name"), required=False) description = forms.CharField( initial="", required=False, max_length=80, label=_("Description")) vpnservice_id = forms.ThemableChoiceField( label=_("VPN service associated with this connection")) local_ep_group_id = forms.ThemableChoiceField( required=False, label=_("Endpoint group for local subnet(s)"), help_text=_("Local subnets which the new IPsec connection is " "connected to. Required if no subnet is specified " "in a VPN service selected.")) ikepolicy_id = forms.ThemableChoiceField( label=_("IKE policy associated with this connection")) ipsecpolicy_id = forms.ThemableChoiceField( label=_("IPsec policy associated with this connection")) peer_address = forms.CharField( label=_("Peer gateway public IPv4/IPv6 Address or FQDN"), help_text=_("Peer gateway public IPv4/IPv6 address or FQDN for " "the VPN Connection"),) peer_id = forms.CharField( label=_("Peer router identity for authentication (Peer ID)"), help_text=_("Peer router identity for authentication. " "Can be IPv4/IPv6 address, e-mail, key ID, or FQDN"),) peer_ep_group_id = forms.ThemableChoiceField( required=False, label=_("Endpoint group for remote peer CIDR(s)"), help_text=_("Remote peer CIDR(s) connected to the new IPsec " "connection.")) peer_cidrs = forms.MultiIPField( required=False, label=_("Remote peer subnet(s)"), help_text=_("(Deprecated) Remote peer subnet(s) address(es) " "with mask(s) in CIDR format " "separated with commas if needed " "(e.g. 20.1.0.0/24, 21.1.0.0/24)"), version=forms.IPv4 | forms.IPv6, mask=True) psk = forms.CharField( max_length=80, label=_("Pre-Shared Key (PSK) string"), widget=forms.PasswordInput(render_value=False), help_text=_("The pre-defined key string " "between the two peers of the VPN connection")) def populate_ikepolicy_id_choices(self, request, context): ikepolicy_id_choices = [('', _("Select IKE policy"))] try: tenant_id = self.request.user.tenant_id ikepolicies = api_vpn.ikepolicy_list(request, tenant_id=tenant_id) except Exception: exceptions.handle(request, _('Unable to retrieve IKE policies list.')) ikepolicies = [] for p in ikepolicies: ikepolicy_id_choices.append((p.id, p.name_or_id)) self.fields['ikepolicy_id'].choices = ikepolicy_id_choices return ikepolicy_id_choices def populate_ipsecpolicy_id_choices(self, request, context): ipsecpolicy_id_choices = [('', _("Select IPsec Policy"))] try: tenant_id = self.request.user.tenant_id ipsecpolicies = api_vpn.ipsecpolicy_list(request, tenant_id=tenant_id) except Exception: exceptions.handle(request, _('Unable to retrieve IPsec policies list.')) ipsecpolicies = [] for p in ipsecpolicies: ipsecpolicy_id_choices.append((p.id, p.name_or_id)) self.fields['ipsecpolicy_id'].choices = ipsecpolicy_id_choices return ipsecpolicy_id_choices def populate_vpnservice_id_choices(self, request, context): vpnservice_id_choices = [('', _("Select VPN service"))] try: tenant_id = self.request.user.tenant_id vpnservices = api_vpn.vpnservice_list(request, tenant_id=tenant_id) except Exception: exceptions.handle(request, _('Unable to retrieve VPN services list.')) vpnservices = [] for s in vpnservices: vpnservice_id_choices.append((s.id, s.name_or_id)) self.fields['vpnservice_id'].choices = vpnservice_id_choices return vpnservice_id_choices def populate_local_ep_group_id_choices(self, request, context): try: tenant_id = self.request.user.tenant_id endpointgroups = api_vpn.endpointgroup_list(request, tenant_id=tenant_id) except Exception: exceptions.handle(request, _('Unable to retrieve endpoint group list.')) endpointgroups = [] local_ep_group_ids = [(ep.id, ep.name_or_id) for ep in endpointgroups if ep.type == 'subnet'] local_ep_group_ids.insert(0, ('', _("Select local endpoint group"))) self.fields['local_ep_group_id'].choices = local_ep_group_ids return local_ep_group_ids def populate_peer_ep_group_id_choices(self, request, context): try: tenant_id = self.request.user.tenant_id endpointgroups = api_vpn.endpointgroup_list(request, tenant_id=tenant_id) except Exception: exceptions.handle(request, _('Unable to retrieve endpoint group list.')) endpointgroups = [] peer_ep_group_ids = [(ep.id, ep.name_or_id) for ep in endpointgroups if ep.type == 'cidr'] peer_ep_group_ids.insert(0, ('', _("Select peer endpoint group"))) self.fields['peer_ep_group_id'].choices = peer_ep_group_ids return peer_ep_group_ids class Meta(object): name = _("Add New IPsec Site Connection") permissions = ('openstack.services.network',) help_text = _("Create IPsec site connection for current " "project. Assign a name and description for the " "IPsec site connection. " "All fields in this tab are required." ) class AddIPsecSiteConnectionStep(workflows.Step): action_class = AddIPsecSiteConnectionAction contributes = ("name", "description", "vpnservice_id", "ikepolicy_id", "ipsecpolicy_id", "peer_address", "peer_id", "peer_cidrs", "psk", "local_ep_group_id", "peer_ep_group_id") class AddIPsecSiteConnectionOptionalAction(workflows.Action): mtu = forms.IntegerField( min_value=68, label=_("Maximum Transmission Unit size for the connection"), initial=1500, required=False, help_text=_("Equal to or greater than 68 if the local subnet is IPv4. " "Equal to or greater than 1280 if the local subnet " "is IPv6.")) dpd_action = forms.ThemableChoiceField( label=_("Dead peer detection actions"), required=False, help_text=_("1. Hold - ends the connection and waits for the remote " "side to reconnect. 2. Clear - drops the connection and " "does not try to bring it back. 3. Disabled - turns off " "dead peer detection entirely, so no active checks are " "sent. 4. Restart - starts trying to reconnect as soon " "as the timeout happens. 5. Restart-by-peer - the " "connection is re-established because the remote peer " "initiated the restart after a timeout or failure.")) dpd_interval = forms.IntegerField( min_value=1, label=_("Dead peer detection interval"), initial=30, required=False, help_text=_("Valid integer lesser than DPD timeout")) dpd_timeout = forms.IntegerField( min_value=1, label=_("Dead peer detection timeout"), initial=120, required=False, help_text=_("Valid integer greater than the DPD interval")) initiator = forms.ThemableChoiceField( label=_("Initiator state"), required=False, help_text=_("Defines which side of the connection is responsible " "for initiating. Bi-directional - the tunnel can be " "established by either endpoint. Response-only - waits " "until the remote peer sends a request, and only then " "the connection is established.")) admin_state_up = forms.BooleanField( label=_("Enable Admin State"), help_text=_("The state of IPsec site connection to start in. " "If disabled (not checked), IPsec site connection " "does not forward packets."), initial=True, required=False) def __init__(self, request, *args, **kwargs): super(AddIPsecSiteConnectionOptionalAction, self).__init__( request, *args, **kwargs) initiator_choices = [("bi-directional", "bi-directional"), ("response-only", "response-only")] self.fields['initiator'].choices = initiator_choices def populate_dpd_action_choices(self, request, context): dpd_action_choices = [("hold", "hold"), ("clear", "clear"), ("disabled", "disabled"), ("restart", "restart"), ("restart-by-peer", "restart-by-peer")] self.fields['dpd_action'].choices = dpd_action_choices return dpd_action_choices def clean(self): cleaned_data = super(AddIPsecSiteConnectionOptionalAction, self).clean() interval = cleaned_data.get('dpd_interval') timeout = cleaned_data.get('dpd_timeout') if not interval < timeout: msg = _("DPD Timeout must be greater than DPD Interval") self._errors['dpd_timeout'] = self.error_class([msg]) return cleaned_data class Meta(object): name = _("Optional Parameters") permissions = ('openstack.services.network',) help_text = _("Fields in this tab are optional. " "You can configure the detail of " "IPsec site connection created." ) class AddIPsecSiteConnectionOptionalStep(workflows.Step): action_class = AddIPsecSiteConnectionOptionalAction contributes = ("dpd_action", "dpd_interval", "dpd_timeout", "initiator", "mtu", "admin_state_up") def contribute(self, data, context): context = super( AddIPsecSiteConnectionOptionalStep, self).contribute(data, context) context['dpd'] = {'action': data['dpd_action'], 'interval': data['dpd_interval'], 'timeout': data['dpd_timeout']} context.pop('dpd_action') context.pop('dpd_interval') context.pop('dpd_timeout') cidrs = context['peer_cidrs'] context['peer_cidrs'] = [cidr.strip() for cidr in cidrs.split(',') if cidr.strip()] if data: return context class AddIPsecSiteConnection(workflows.Workflow): slug = "addipsecsiteconnection" name = _("Add IPsec Site Connection") finalize_button_name = _("Add") success_message = _('Added IPsec site connection "%s".') failure_message = _('Unable to add IPsec site connection "%s".') success_url = "horizon:project:vpn:index" default_steps = (AddIPsecSiteConnectionStep, AddIPsecSiteConnectionOptionalStep) def format_status_message(self, message): return message % self.context.get('name') def handle(self, request, context): try: api_vpn.ipsecsiteconnection_create(request, **context) return True except Exception: return False ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3720562 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/enabled/0000775000175000017500000000000015257164617024151 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2714276 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/enabled/_7100_project_vpn_panel.py0000664000175000017500000000175015257164532031040 0ustar00zuulzuul# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # 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 = 'vpn' # 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_vpnaas_dashboard.dashboards.project.vpn.panel.VPN' ADD_INSTALLED_APPS = ["neutron_vpnaas_dashboard"] ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2714276 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/enabled/__init__.py0000664000175000017500000000000015257164532026244 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3720562 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/0000775000175000017500000000000015257164617024016 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2714276 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/.placeholder0000664000175000017500000000000015257164532026263 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3470547 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/de/0000775000175000017500000000000015257164617024406 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3720562 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/de/LC_MESSAGES/0000775000175000017500000000000015257164617026173 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2724278 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/de/LC_MESSAGES/django.po0000664000175000017500000005634315257164532030004 0ustar00zuulzuul# Frank Kloeker , 2016. #zanata # Andreas Jaeger , 2018. #zanata # Frank Kloeker , 2018. #zanata # Robert Simai , 2018. #zanata # Andreas Jaeger , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: neutron-vpnaas-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2026-05-08 19:58+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-10-05 06:36+0000\n" "Last-Translator: Andreas Jaeger \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "" "(Deprecated) Remote peer subnet(s) address(es) with mask(s) in CIDR format " "separated with commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "(Veraltet) Entfernte Peer-Subnetz-Adresse(n) mit Maske(n) im CIDR-Format, " "Komma-separiert, wenn nötig (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgid "-" msgstr "-" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Active" msgstr "Aktiv" msgid "Add" msgstr "Hinzufügen" msgid "Add Endpoint Group" msgstr "Endpunktgruppe hinzufügen" msgid "Add IKE Policy" msgstr "IKE Richtlinie hinzufügen" msgid "Add IPsec Policy" msgstr "IPSec Richtlinie hinzufügen" msgid "Add IPsec Site Connection" msgstr "Füge IPSec Site Verbindung hinzu" msgid "Add New Endpoint Groups" msgstr "Neue Endpunktgruppen hinzufügen" msgid "Add New IKE Policy" msgstr "Neue IKE Richtlinie hinzufügen" msgid "Add New IPsec Policy" msgstr "Neue IPsec Richtlinie hinzufügen." msgid "Add New IPsec Site Connection" msgstr "Füge neue IPsec Site Verbindung hinzu" msgid "Add New VPN Service" msgstr "Neuen VPN Dienst hinzufügen." msgid "Add VPN Service" msgstr "VPN Dienst hinzufügen" #, python-format msgid "Added IKE policy \"%s\"." msgstr "IKE Richtlinie \"%s\" hinzugefügt." #, python-format msgid "Added IPsec policy \"%s\"." msgstr "IPsec Richtlinie \"%s\" hinzugefügt." #, python-format msgid "Added IPsec site connection \"%s\"." msgstr "IPsec Site Verbindung \"%s\" wurde hinzugefügt." #, python-format msgid "Added VPN service \"%s\"." msgstr "VPN Dienst \"%s\" wurde hinzugefügt." #, python-format msgid "Added endpoint group \"%s\"." msgstr "Endpunktgruppe \"%s\" hinzugefügt." msgid "Admin State" msgstr "Adminstatus" msgid "Admin State is enabled by default." msgstr "Admin Status ist in der Grundeinstellung aktiviert." msgid "All fields are optional." msgstr "Alle Felder sind optional." msgid "An IKE policy is an association of the following attributes:" msgstr "" "Eine IKE-Richtlinie ist eine Zuordnung bestehend aus den folgenden " "Attributen:" msgid "An IPsec policy is an association of the following attributes" msgstr "" "Eine IPSec-Richtlinie ist eine Zuordnung bestehend aus den folgenden " "Attributen" msgid "Authorization algorithm" msgstr "Authorisierungsalgorithmus" msgid "Authorization algorithm =" msgstr "Authorisierungsalgorithmus =" msgid "Authorization mode" msgstr "Authorisierungsmodus" msgid "CIDR (for external systems)" msgstr "CIDR (für externe Systeme)" msgid "Create IKE policy for current project." msgstr "Erzeugen eiener IKE-Richtlinie für das aktuelle Projekt." msgid "Create IPsec policy for current project." msgstr "Erzeugen eines IPSec-Regelwerks für das aktuelle Projekt." msgid "" "Create IPsec site connection for current project. Assign a name and " "description for the IPsec site connection. All fields in this tab are " "required." msgstr "" "Erzeuge eine IPsec Site-Verbindung für das aktuelle Projekt. Fügen Sie Name " "und Beschreibung hinzu. Alle Felder in diesem Tab sind erforderlich." msgid "Create VPN service for current project." msgstr "VPN Dienst für das aktuelle Projekt erzeugen." msgid "Create endpoint group for current project." msgstr "Endpunkgruppe für das aktuelle Projekt erzeugen." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Created" msgstr "Erstellt" msgid "DPD Timeout must be greater than DPD Interval" msgstr "DPD-Zeitüberschreitung muss größer als das DPD-Intervall sein" msgid "Dead peer detection action" msgstr "Aktion zum Aufspüren von toten Peers" msgid "Dead peer detection actions" msgstr "Aktionen zum Aufspüren von toten Peers" msgid "Dead peer detection interval" msgstr "Intervall zum Aufspüren von toten Peers" msgid "Dead peer detection timeout" msgstr "Zeitüberschreitung zum Aufspüren von toten Peers" msgid "Delete Endpoint Group" msgid_plural "Delete Endpoint Groups" msgstr[0] "Endpunktgruppe löschen" msgstr[1] "Endpunktgruppen löschen" msgid "Delete IKE Policy" msgid_plural "Delete IKE Policies" msgstr[0] "Lösche IKE Richtline" msgstr[1] "Lösche IKE Richtlinien" msgid "Delete IPsec Policy" msgid_plural "Delete IPsec Policies" msgstr[0] "Lösche IPsec Richtlinie" msgstr[1] "Lösche IPsec Richtlinien" msgid "Delete IPsec Site Connection" msgid_plural "Delete IPsec Site Connections" msgstr[0] "IPsec-Seitenverbindung löschen" msgstr[1] "IPsec-Seitenverbindungen löschen" msgid "Delete VPN Service" msgid_plural "Delete VPN Services" msgstr[0] "VPN-Dienst löschen" msgstr[1] "VPN-Dienste löschen" msgid "Description" msgstr "Beschreibung" msgid "Description:" msgstr "Beschreibung:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Down" msgstr "Inaktiv" msgid "Edit Connection" msgstr "Verbindung bearbeiten" msgid "Edit Endpoint Group" msgstr "Endpunktgruppe bearbeiten" msgid "Edit IKE Policy" msgstr "IKE Richtlinie bearbeiten" msgid "Edit IPsec Policy" msgstr "IPsec-Richtlinie bearbeiten" msgid "Edit IPsec Site Connection" msgstr "Bearbeite IPsec Site Verbindung" msgid "Edit IPsec policy" msgstr "IPsec-Richtlinie bearbeiten" msgid "Edit IPsec site connection" msgstr "Bearbeite IPsec Site Verbindung" msgid "Edit VPN Service" msgstr "VPN Dienst bearbeiten" msgid "Enable Admin State" msgstr "Adminstatus aktivieren" msgid "Encapsulation mode" msgstr "Kapselungsmodus" msgid "Encryption algorithm" msgstr "Verschlüsselungsalgorithmus" msgid "Encryption algorithm =" msgstr "Verschlüsselungsalgorithmus =" msgid "Endpoint Groups" msgstr "Endpunktgruppen" msgid "Endpoint Groups Details" msgstr "Endpunktgruppendetails" #, python-format msgid "Endpoint group %s was successfully updated." msgstr "Endpunktgruppe %s wurde erfolgreich aktualisiert." msgid "Endpoint group for local subnet(s)" msgstr "Endpunktgruppe für lokale Subnetze" msgid "Endpoint group for remote peer CIDR(s)" msgstr "Endpunktgruppe für ferne(s) Peer-CIDR(s)" msgid "Endpoints" msgstr "Endpunkte" msgid "Endpoints =" msgstr "Endpunkte =" msgid "Equal to or greater than 60" msgstr "Gleich oder größer als 60" msgid "" "Equal to or greater than 68 if the local subnet is IPv4. Equal to or greater " "than 1280 if the local subnet is IPv6." msgstr "" "Größer oder gleich 68 falls das lokale Subnetz IPv4 ist. Größer oder gleich " "1280 falls das lokale Subnetz IPv6 ist." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Error" msgstr "Fehler" msgid "External System CIDRs" msgstr "Externe System-CIDRs" msgid "External System Subnets" msgstr "Externe System-Subnetze" #, python-format msgid "Failed to update IKE policy %s" msgstr "Fehler beim Aktualisieren der IKE Richtlinie %s" #, python-format msgid "Failed to update IPsec policy %s" msgstr "Fehler beim Aktualisieren der IPSec Richtlinie %s" #, python-format msgid "Failed to update IPsec site connection %s" msgstr "IPSec Site Verbindung %s konnte nicht nicht geändert werden" #, python-format msgid "Failed to update VPN service %s" msgstr "VPN Dienst %s konnte nicht aktualisiert werden" #, python-format msgid "Failed to update endpoint group %s" msgstr "Endpunktgruppe %s konnte nicht aktualisiert werden." msgid "" "Fields in this tab are optional. You can configure the detail of IPsec site " "connection created." msgstr "" "Die Felder in diesem Tab sind optional. Sie können hier die Details der " "erzeugten IPsec Seiten-Verbindung konfigurieren." msgid "ID" msgstr "ID" msgid "IKE Phase 1 negotiation mode" msgstr "IKE Phase1 Verhandlungs-Modus" msgid "IKE Phase1 negotiation mode" msgstr "IKE Phase1 Verhandlungs-Modus" msgid "IKE Policies" msgstr "IKE Richtlinien" msgid "IKE Policy" msgstr "IKE Richtlinie" msgid "IKE Policy =" msgstr "IKE Richtlinie =" msgid "IKE Policy Details" msgstr "IKE Richtlinien Details" msgid "IKE Policy ID =" msgstr "IKE Richtlinie ID =" #, python-format msgid "IKE policy %s was successfully updated." msgstr "IKE-Richtlinie %s wurde erfolgreich aktualisiert." msgid "IKE policy associated with this connection" msgstr "IKE Richtlinie für diese Verbindung" msgid "IKE version" msgstr "IKE Version" msgid "IPsec Policies" msgstr "IPsec Richtlinien" msgid "IPsec Policy" msgstr "IPsec Richtlinie" msgid "IPsec Policy =" msgstr "IPsec Richtlinie =" msgid "IPsec Policy Details" msgstr "IPsec Richtlinien Details" msgid "IPsec Policy ID =" msgstr "IPsec Richtlinie ID =" msgid "IPsec Site Connection Details" msgstr "IPsec Site Verbindungsdetails" msgid "IPsec Site Connections" msgstr "IPsec Site Verbindungen" msgid "IPsec connection validation requires that local endpoints are subnets" msgstr "" "IPsec Verbindungsvalidierung verlangt das lokale Endpunkte Subnetze sind" msgid "" "IPsec connection validation requires that local endpoints are subnets, and " "peer endpoints are CIDRs." msgstr "" "IPsec Verbindungsvalidierung verlangt das lokale Endpunkte Subnetze und Peer-" "Endpunkte CIDRs sind." msgid "IPsec connection validation requires that peer endpoints are CIDRs" msgstr "IPsec Verbindungsvalidierung verlangt das Peer-Endpunkte CIDRs sind" #, python-format msgid "IPsec policy %s was successfully updated." msgstr "IPSec Richtlinie %s wurde erfolgreich aktualisiert." msgid "IPsec policy associated with this connection" msgstr "IPsec Richtline für diese Verbindung" #, python-format msgid "IPsec site connection %s was successfully updated." msgstr "IPSec Site Verbindung %s wurde erfolgreich aktualisiert." msgid "IPv4" msgstr "IPv4" msgid "IPv4:" msgstr "IPv4:" msgid "IPv6" msgstr "IPv6" msgid "IPv6:" msgstr "IPv6:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Inactive" msgstr "Inaktiv" msgid "Initiator state" msgstr "Initiatorstatus" msgid "" "Life time consists of units and value. Units in 'seconds' and the default " "value is 3600." msgstr "" "Die Lebensdauer besteht aus Einheit und Wert. Die Einheit ist Sekunden und " "der Standardwert ist 3600." msgid "Lifetime" msgstr "Lebensdauer" msgid "Lifetime Units" msgstr "Lebensdauer-Einheiten" msgid "Lifetime Value" msgstr "Lebensdauer-Wert" msgid "Lifetime units" msgstr "Lebensdauer-Einheiten" msgid "Lifetime units for IKE keys" msgstr "Lebensdauer der IKE-Schlüssel" msgid "Lifetime value" msgstr "Lebensdauer-Wert" msgid "Lifetime value for IKE keys" msgstr "Lebensdauer der IKE-Schlüssel" msgid "Lifetime value for IKE keys " msgstr "Gültigkeitsdauer der IKE-Schlüssel" msgid "Local Endpoint Group" msgstr "Lokale Endpunktgruppe" msgid "Local Endpoint Group(s)" msgstr "Lokale Endpunktgruppe(n)" msgid "Local Side Public IPs" msgstr "Lokale öffentliche IP" msgid "Local System Subnets" msgstr "Lokale System-Subnetze" msgid "Local subnet(s). This field is valid if type is Subnet" msgstr "Lokale(s) Subnetz(e). Dieses Feld ist gültig für Typ Subnetz" msgid "" "Local subnets which the new IPsec connection is connected to. Required if no " "subnet is specified in a VPN service selected." msgstr "" "Lokale Subnetze, die mit der neuen IPsec Verbindung verbunden sind. " "Erforderlich wenn kein Subnetz im ausgewählten VPN-Dienst definiert ist." msgid "MTU" msgstr "MTU" msgid "Maximum Transmission Unit size for the connection" msgstr "Maximale Übertragungseinheitsgröße für die Verbindung" msgid "Name" msgstr "Name" msgid "Name =" msgstr "Name =" msgid "" "Note: The recommended way to specify local subnets is to use endpoint groups " "in IPsec site connection. It is deprecated to specify subnet in VPN service. " "For a new VPN service or IPsec site connection, using endpoint group is " "recommended." msgstr "" "Anmerkung: Der empfohlene Weg um lokale Subnetze zu definieren ist " "Endpunktgruppen in der IPsec Site Verbindung zu benutzen. Subnetze im VPN-" "Dienst zu definieren ist veraltet. Die Benutzung von Endpunktgruppen ist für " "neue VPN-Dienste oder IPsec Site Verbindungen empfohlen." msgid "Optional Parameters" msgstr "Optionale Parameter" msgid "Optional. No need to be specified when you use endpoint groups." msgstr "" "Optional. Muss nicht spezifiziert werden, wenn Endpunktgruppen genutzt " "werden." msgid "PFS" msgstr "PFS" msgid "PFS =" msgstr "PFS =" msgid "Peer Endpoint Group" msgstr "Ferne Endpunktgruppe" msgid "Peer Endpoint Group(s)" msgstr "Ferne Endpunktgruppe(n)" msgid "Peer gateway public IPv4/IPv6 Address or FQDN" msgstr "Öffentliche IPv4/IPv6-Adresse oder FQDN für das Peer-Gateway" msgid "Peer gateway public IPv4/IPv6 address or FQDN for the VPN Connection" msgstr "" "Öffentliche IPv4/IPv6-Adresse oder FQDN für das Peer-Gateway für die VPN-" "Verbindung" msgid "Peer router identity for authentication (Peer ID)" msgstr "Peer-Router Identität zur Authentifizierung (Peer ID)" msgid "" "Peer router identity for authentication. Can be IPv4/IPv6 address, e-mail, " "key ID, or FQDN" msgstr "" "Peer-Router Identität zur Authentifizierung. Die Identität kann eine IPv4/" "IPv6-Adresse, eine E-Mail oder FQDN sein." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Create" msgstr "Geplante Erstellung" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Delete" msgstr "Geplante Löschung" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Update" msgstr "Geplante Aktualisierung" msgid "Perfect Forward Secrecy" msgstr "Perfect Forward Secrecy: perfekte vorwärts gerichtete Geheimhaltung" msgid "Pre-Shared Key (PSK) string" msgstr "Pre-Shared Schlüssel (PSK) Zeichenkette" msgid "Project ID" msgstr "Projekt-ID" msgid "Remote peer CIDR(s) connected to the new IPsec connection." msgstr "Ferne(s) peer CIDR(s) mit der der neuen IPsec Verbindung verbunden." msgid "Remote peer subnet" msgstr "Fernes Peer-Subnetz" msgid "Remote peer subnet(s)" msgstr "Ferne(s) Peer-Subnetz(e)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "Entfernte Peer-Subnetz-Adresse(n) mit Maske(n) im CIDR-Format, Komma-" "separiert, wenn nötig (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24). This field is valid if " "type is CIDR" msgstr "" "Entfernte Peer-Subnetz-Adresse(n) mit Maske(n) im CIDR-Format, Komma-" "separiert, wenn nötig (e.g. 20.1.0.0/24, 21.1.0.0/24). Dieses Feld ist " "gültig wenn Typ CIDR ist." msgid "Route mode" msgstr "Routingmodus" msgid "Router" msgstr "Router" msgid "Router =" msgstr "Router =" msgid "Router ID =" msgstr "Router-ID =" msgid "Save Changes" msgstr "Änderungen speichern" msgid "Scheduled deletion of IKE policy" msgid_plural "Scheduled deletion of IKE policies" msgstr[0] "Geplante Löschung von IKE Richtlinie" msgstr[1] "Geplante Löschung von IKE Richtlinien" msgid "Scheduled deletion of IPsec policy" msgid_plural "Scheduled deletion of IPsec policies" msgstr[0] "Geplante Löschung von IPsec Richtlinie" msgstr[1] "Geplante Löschung von IPsec Richtlinien" msgid "Scheduled deletion of IPsec site connection" msgid_plural "Scheduled deletion of IPsec site connections" msgstr[0] "Geplante Löschung der IPsec-Seitenverbindung" msgstr[1] "Geplante Löschung von IPsec-Seitenverbindungen" msgid "Scheduled deletion of VPN service" msgid_plural "Scheduled deletion of VPN services" msgstr[0] "Geplante Löschung des VPN-Dienstes" msgstr[1] "Geplante Löschung von VPN-Diensten" msgid "Scheduled deletion of endpoint group" msgid_plural "Scheduled deletion of endpoint groups" msgstr[0] "Geplante Löschung der Endpunktgruppe" msgstr[1] "Geplante Löschung der Endpunktgruppen" msgid "Select IKE policy" msgstr "IKE Richtlinie auswählen" msgid "Select IPsec Policy" msgstr "IPsec Richtlinien auswählen" msgid "Select VPN service" msgstr "VPN Dienst auswählen" msgid "Select a Router" msgstr "Wählen Sie einen Router" msgid "Select a Subnet" msgstr "Wählen Sie ein Subnetz" msgid "Select local endpoint group" msgstr "Lokale Endpunktgruppe auswählen" msgid "Select peer endpoint group" msgstr "Ferne Endpunktgruppe auswählen" msgid "" "Specify a name, description, router, and subnet (optional) for the VPN " "service." msgstr "" "Geben Sie Name, Beschreibung, Router und Subnetz (optional) für den VPN-" "Dienst an." msgid "Status" msgstr "Status" msgid "Status =" msgstr "Status" msgid "Subnet" msgstr "Subnetz" msgid "Subnet (for local systems)" msgstr "Subnetz (für lokale Systeme)" msgid "Subnet =" msgstr "Subnetz =" msgid "Subnet ID =" msgstr "Subnetz ID =" msgid "" "The VPN service is attached to a router and references to endpoint group or " "a single subnet to push to a remote site." msgstr "" "Der VPN-Dienst wird einem Router zugewiesen und verweist auf eine " "Endpunktgruppe oder ein einzelnes Subnetz, das so für eine entfernte Site " "zugänglich wird." msgid "The pre-defined key string between the two peers of the VPN connection" msgstr "" "Die vordefinierte Schlüssel-Zeichenkette zwischen den beiden Gegenstellen " "der VPN Verbindung" msgid "" "The router and admin state fields require to be enabled. All others are " "optional." msgstr "" "Die Felder für Router und Adminstatus sind erforderlich. Alle anderen sind " "optional." msgid "" "The state of IPsec site connection to start in. If disabled (not checked), " "IPsec site connection does not forward packets." msgstr "" "Der Status, in dem die IPsec Site Verbindung gestartet wird. Wenn " "deaktiviert (nicht markiert), leitet die IPsec Site Verbindung keine Pakete " "weiter." msgid "" "The state of VPN service to start in. If disabled (not checked), VPN service " "does not forward packets." msgstr "" "Der Zustand, in dem der VPN Dienst gestartet wird. Falls deaktiviert (nicht " "markiert), leitet der VPN Dienst keine Pakete weiter." msgid "The type of IPsec tunnel (tunnel/transport) to be used." msgstr "Der zu verwendende Typ des IPSec Tunnels (tunnel/transport)." msgid "The type of version (v1/v2) that needs to be filtered." msgstr "Der Versionstyp (v1/v2) nach dem gefiltert wird." msgid "Transform Protocol" msgstr "Verwandlungsprotokoll" msgid "Type" msgstr "Typ" msgid "Type =" msgstr "Typ =" #, python-format msgid "Unable to add IKE policy \"%s\"." msgstr "IKE Richtlinie \"%s\" konnte nicht hinzugefügt werden." #, python-format msgid "Unable to add IPsec policy \"%s\"." msgstr "IPsec Richtlinie \"%s\" konnte nicht hinzugefügt werden." #, python-format msgid "Unable to add IPsec site connection \"%s\"." msgstr "IPsec Site Verbindung \"%s\" konnte nicht hinzugefügt werden." #, python-format msgid "Unable to add VPN service \"%s\"." msgstr "VPN Dienst \"%s\" konnte nicht hinzugefügt werden." #, python-format msgid "Unable to add endpoint group \"%s\"." msgstr "Endpunktgruppe \"%s\" kann nicht hinzugefügt werden." msgid "Unable to delete IKE policy." msgstr "IKE Richtlinie konnte nicht gelöscht werden." msgid "Unable to delete IPsec policy." msgstr "IPsec Richtlinie konnte nicht gelöscht werden." msgid "Unable to delete IPsec site connection." msgstr "IPsec Site Verbindung konnte nicht gelöscht werden." msgid "Unable to delete VPN service." msgstr "VPN Dienst konnte nicht gelöscht werden." msgid "Unable to delete endpoint group." msgstr "Endpunktgruppe konnte nicht gelöscht werden." msgid "Unable to retrieve IKE policies list." msgstr "Liste der IKE Richtlinien kann nicht abgerufen werden." msgid "Unable to retrieve IKE policy details." msgstr "IKE Richtliniendetails können nicht abgerufen werden." msgid "Unable to retrieve IPsec policies list." msgstr "IPSec Richtlinien Liste kann nicht abgerufen werden." msgid "Unable to retrieve IPsec policy details." msgstr "IPsec Richtliniendetails können nicht abgerufen werden." msgid "Unable to retrieve IPsec policy list." msgstr "IPsec Richtlinienliste kann nicht abgerufen werden." msgid "Unable to retrieve IPsec site connection details." msgstr "IPsec Site Verbindungsdetails können nicht abgerufen werden." msgid "Unable to retrieve IPsec site connections list." msgstr "IPsec Site Verbindungsliste kann nicht abgerufen werden." msgid "Unable to retrieve VPN service details." msgstr "VPN Dienstdetails können nicht abgerufen werden." msgid "Unable to retrieve VPN services list." msgstr "VPN Diensteliste kann nicht abgerufen werden." msgid "Unable to retrieve endpoint group details." msgstr "Endpunktgruppendetails können nicht abgerufen werden." msgid "Unable to retrieve endpoint group list." msgstr "Endpunktgruppenliste kann nicht abgerufen werden." msgid "Unable to retrieve networks list." msgstr "Die Netzwerk-Liste kann nicht abgerufen werden." msgid "Unable to retrieve routers list." msgstr "Liste der Router kann nicht abgerufen werden." msgid "VPN" msgstr "VPN" msgid "VPN Connections" msgstr "VPN Verbindungen" msgid "VPN Service" msgstr "VPN Dienst" msgid "VPN Service =" msgstr "VPN Dienst =" msgid "VPN Service Details" msgstr "VPN Dienstdetails" msgid "VPN Service ID =" msgstr "VPN Dienst ID =" msgid "VPN Services" msgstr "VPN Dienste" #, python-format msgid "VPN service %s was successfully updated." msgstr "VPN Dienst %s erfolgreich aktualisiert." msgid "VPN service associated with this connection" msgstr "VPN Dienst für diese Verbindung" msgid "Valid integer greater than the DPD interval" msgstr "Gültige Ganzzahl größer als das DPD Intervall" msgid "Valid integer lesser than DPD timeout" msgstr "Gültige Ganzzahl kleiner als DPD-Zeitüberschreitung" msgid "Valid integer lesser than the DPD timeout" msgstr "Gültige Ganzzahl kleiner als die DPD-Zeitüberschreitung" msgid "Virtual Private Network" msgstr "Virtuelles privates Netz" msgid "You may update IKE policy details here." msgstr "Hier können Sie die Details der IKE Richtlinie bearbeiten." msgid "You may update IPsec policy details here." msgstr "Hier können Sie die Details der IPSec Richtlinie bearbeiten." msgid "You may update IPsec site connection details here." msgstr "Hier können Sie die Details der IPSec Site Verbindung bearbeiten." msgid "You may update VPN service details here." msgstr "Hier können Sie Details des VPN Services bearbeiten." msgid "You may update endpoint group details here." msgstr "Hier können Sie die Details der Endpunktgruppe aktualisieren." msgid "bi-directional" msgstr "bidirektional" msgid "clear" msgstr "löschen" msgid "disabled" msgstr "inaktiviert" msgid "down" msgstr "Inaktiv" msgid "group14" msgstr "Gruppe14" msgid "group2" msgstr "Gruppe2" msgid "group5" msgstr "Gruppe5" msgid "hold" msgstr "halten" msgid "response-only" msgstr "nur Response" msgid "restart" msgstr "neustarten" msgid "restart-by-peer" msgstr "neustart bei Peer" msgid "seconds" msgstr "Sekunden" msgid "transport" msgstr "Transport" msgid "tunnel" msgstr "Tunnel" msgid "up" msgstr "Aktiv" msgid "v1" msgstr "v1" msgid "v2" msgstr "v2" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.348055 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/en_GB/0000775000175000017500000000000015257164617024770 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3720562 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/en_GB/LC_MESSAGES/0000775000175000017500000000000015257164617026555 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.321436 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/en_GB/LC_MESSAGES/django.po0000664000175000017500000005611615257164532030364 0ustar00zuulzuul# OpenStack Infra , 2015. #zanata # Rob Cresswell , 2015. #zanata # Andi Chandler , 2016. #zanata # Rob Cresswell , 2016. #zanata # Andi Chandler , 2017. #zanata # Jacky Hu , 2017. #zanata # Andi Chandler , 2018. #zanata # Andi Chandler , 2020. #zanata # Andi Chandler , 2026. #zanata msgid "" msgstr "" "Project-Id-Version: neutron-vpnaas-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2026-08-06 10:10+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2026-08-08 09:55+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom)\n" "Language: en_GB\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "" "(Deprecated) Remote peer subnet(s) address(es) with mask(s) in CIDR format " "separated with commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "(Deprecated) Remote peer subnet(s) address(es) with mask(s) in CIDR format " "separated with commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgid "-" msgstr "-" msgid "3DES" msgstr "3DES" msgid "AES-128" msgstr "AES-128" msgid "AES-128-CCM-8" msgstr "AES-128-CCM-8" msgid "AES-128-CTR" msgstr "AES-128-CTR" msgid "AES-192" msgstr "AES-192" msgid "AES-192-CCM-8" msgstr "AES-192-CCM-8" msgid "AES-192-CTR" msgstr "AES-192-CTR" msgid "AES-256" msgstr "AES-256" msgid "AES-256-CCM-8" msgstr "AES-256-CCM-8" msgid "AES-256-CTR" msgstr "AES-256-CTR" msgid "AES-CMAC" msgstr "AES-CMAC" msgid "AES-XCBC" msgstr "AES-XCBC" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Active" msgstr "Active" msgid "Add" msgstr "Add" msgid "Add Endpoint Group" msgstr "Add Endpoint Group" msgid "Add IKE Policy" msgstr "Add IKE Policy" msgid "Add IPsec Policy" msgstr "Add IPsec Policy" msgid "Add IPsec Site Connection" msgstr "Add IPsec Site Connection" msgid "Add New Endpoint Groups" msgstr "Add New Endpoint Groups" msgid "Add New IKE Policy" msgstr "Add New IKE Policy" msgid "Add New IPsec Policy" msgstr "Add New IPsec Policy" msgid "Add New IPsec Site Connection" msgstr "Add New IPsec Site Connection" msgid "Add New VPN Service" msgstr "Add New VPN Service" msgid "Add VPN Service" msgstr "Add VPN Service" #, python-format msgid "Added IKE policy \"%s\"." msgstr "Added IKE policy \"%s\"." #, python-format msgid "Added IPsec policy \"%s\"." msgstr "Added IPsec policy \"%s\"." #, python-format msgid "Added IPsec site connection \"%s\"." msgstr "Added IPsec site connection \"%s\"." #, python-format msgid "Added VPN service \"%s\"." msgstr "Added VPN service \"%s\"." #, python-format msgid "Added endpoint group \"%s\"." msgstr "Added endpoint group \"%s\"." msgid "Admin State" msgstr "Admin State" msgid "Admin State is enabled by default." msgstr "Admin State is enabled by default." msgid "All fields are optional." msgstr "All fields are optional." msgid "An IKE policy is an association of the following attributes:" msgstr "An IKE policy is an association of the following attributes:" msgid "An IPsec policy is an association of the following attributes" msgstr "An IPsec policy is an association of the following attributes" msgid "Authorization algorithm" msgstr "Authorisation algorithm" msgid "Authorization algorithm =" msgstr "Authorisation algorithm =" msgid "Authorization mode" msgstr "Authorisation mode" msgid "CIDR (for external systems)" msgstr "CIDR (for external systems)" msgid "Create IKE policy for current project." msgstr "Create IKE policy for current project." msgid "Create IPsec policy for current project." msgstr "Create IPsec policy for current project." msgid "" "Create IPsec site connection for current project. Assign a name and " "description for the IPsec site connection. All fields in this tab are " "required." msgstr "" "Create IPsec site connection for current project. Assign a name and " "description for the IPsec site connection. All fields in this tab are " "required." msgid "Create VPN service for current project." msgstr "Create VPN service for current project." msgid "Create endpoint group for current project." msgstr "Create endpoint group for current project." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Created" msgstr "Created" msgid "DPD Timeout must be greater than DPD Interval" msgstr "DPD Timeout must be greater than DPD Interval" msgid "Dead peer detection action" msgstr "Dead peer detection action" msgid "Dead peer detection actions" msgstr "Dead peer detection actions" msgid "Dead peer detection interval" msgstr "Dead peer detection interval" msgid "Dead peer detection timeout" msgstr "Dead peer detection timeout" msgid "Delete Endpoint Group" msgid_plural "Delete Endpoint Groups" msgstr[0] "Delete Endpoint Group" msgstr[1] "Delete Endpoint Groups" msgid "Delete IKE Policy" msgid_plural "Delete IKE Policies" msgstr[0] "Delete IKE Policy" msgstr[1] "Delete IKE Policies" msgid "Delete IPsec Policy" msgid_plural "Delete IPsec Policies" msgstr[0] "Delete IPsec Policy" msgstr[1] "Delete IPsec Policies" msgid "Delete IPsec Site Connection" msgid_plural "Delete IPsec Site Connections" msgstr[0] "Delete IPsec Site Connection" msgstr[1] "Delete IPsec Site Connections" msgid "Delete VPN Service" msgid_plural "Delete VPN Services" msgstr[0] "Delete VPN Service" msgstr[1] "Delete VPN Services" msgid "Description" msgstr "Description" msgid "Description:" msgstr "Description:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Down" msgstr "Down" msgid "Edit Connection" msgstr "Edit Connection" msgid "Edit Endpoint Group" msgstr "Edit Endpoint Group" msgid "Edit IKE Policy" msgstr "Edit IKE Policy" msgid "Edit IPsec Policy" msgstr "Edit IPsec Policy" msgid "Edit IPsec Site Connection" msgstr "Edit IPsec Site Connection" msgid "Edit IPsec policy" msgstr "Edit IPsec policy" msgid "Edit IPsec site connection" msgstr "Edit IPsec site connection" msgid "Edit VPN Service" msgstr "Edit VPN Service" msgid "Enable Admin State" msgstr "Enable Admin State" msgid "Encapsulation mode" msgstr "Encapsulation mode" msgid "Encryption algorithm" msgstr "Encryption algorithm" msgid "Encryption algorithm =" msgstr "Encryption algorithm =" msgid "Endpoint Groups" msgstr "Endpoint Groups" msgid "Endpoint Groups Details" msgstr "Endpoint Groups Details" #, python-format msgid "Endpoint group %s was successfully updated." msgstr "Endpoint group %s was successfully updated." msgid "Endpoint group for local subnet(s)" msgstr "Endpoint group for local subnet(s)" msgid "Endpoint group for remote peer CIDR(s)" msgstr "Endpoint group for remote peer CIDR(s)" msgid "Endpoints" msgstr "Endpoints" msgid "Endpoints =" msgstr "Endpoints =" msgid "Equal to or greater than 60" msgstr "Equal to or greater than 60" msgid "" "Equal to or greater than 68 if the local subnet is IPv4. Equal to or greater " "than 1280 if the local subnet is IPv6." msgstr "" "Equal to or greater than 68 if the local subnet is IPv4. Equal to or greater " "than 1280 if the local subnet is IPv6." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Error" msgstr "Error" msgid "External System CIDRs" msgstr "External System CIDRs" msgid "External System Subnets" msgstr "External System Subnets" #, python-format msgid "Failed to update IKE policy %s" msgstr "Failed to update IKE policy %s" #, python-format msgid "Failed to update IPsec policy %s" msgstr "Failed to update IPsec policy %s" #, python-format msgid "Failed to update IPsec site connection %s" msgstr "Failed to update IPsec site connection %s" #, python-format msgid "Failed to update VPN service %s" msgstr "Failed to update VPN service %s" #, python-format msgid "Failed to update endpoint group %s" msgstr "Failed to update endpoint group %s" msgid "" "Fields in this tab are optional. You can configure the detail of IPsec site " "connection created." msgstr "" "Fields in this tab are optional. You can configure the detail of IPsec site " "connection created." msgid "ID" msgstr "ID" msgid "IKE Phase 1 negotiation mode" msgstr "IKE Phase 1 negotiation mode" msgid "IKE Phase1 negotiation mode" msgstr "IKE Phase1 negotiation mode" msgid "IKE Policies" msgstr "IKE Policies" msgid "IKE Policy" msgstr "IKE Policy" msgid "IKE Policy =" msgstr "IKE Policy =" msgid "IKE Policy Details" msgstr "IKE Policy Details" msgid "IKE Policy ID =" msgstr "IKE Policy ID =" #, python-format msgid "IKE policy %s was successfully updated." msgstr "IKE policy %s was successfully updated." msgid "IKE policy associated with this connection" msgstr "IKE policy associated with this connection" msgid "IKE version" msgstr "IKE version" msgid "IPsec Policies" msgstr "IPsec Policies" msgid "IPsec Policy" msgstr "IPsec Policy" msgid "IPsec Policy =" msgstr "IPsec Policy =" msgid "IPsec Policy Details" msgstr "IPsec Policy Details" msgid "IPsec Policy ID =" msgstr "IPsec Policy ID =" msgid "IPsec Site Connection Details" msgstr "IPsec Site Connection Details" msgid "IPsec Site Connections" msgstr "IPsec Site Connections" msgid "IPsec connection validation requires that local endpoints are subnets" msgstr "IPsec connection validation requires that local endpoints are subnets" msgid "" "IPsec connection validation requires that local endpoints are subnets, and " "peer endpoints are CIDRs." msgstr "" "IPsec connection validation requires that local endpoints are subnets, and " "peer endpoints are CIDRs." msgid "IPsec connection validation requires that peer endpoints are CIDRs" msgstr "IPsec connection validation requires that peer endpoints are CIDRs" #, python-format msgid "IPsec policy %s was successfully updated." msgstr "IPsec policy %s was successfully updated." msgid "IPsec policy associated with this connection" msgstr "IPsec policy associated with this connection" #, python-format msgid "IPsec site connection %s was successfully updated." msgstr "IPsec site connection %s was successfully updated." msgid "IPv4" msgstr "IPv4" msgid "IPv4:" msgstr "IPv4:" msgid "IPv6" msgstr "IPv6" msgid "IPv6:" msgstr "IPv6:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Inactive" msgstr "Inactive" msgid "Initiator state" msgstr "Initiator state" msgid "" "Life time consists of units and value. Units in 'seconds' and the default " "value is 3600." msgstr "" "Life time consists of units and value. Units in 'seconds' and the default " "value is 3600." msgid "Lifetime" msgstr "Lifetime" msgid "Lifetime Units" msgstr "Lifetime Units" msgid "Lifetime Value" msgstr "Lifetime Value" msgid "Lifetime units" msgstr "Lifetime units" msgid "Lifetime units for IKE keys" msgstr "Lifetime units for IKE keys" msgid "Lifetime value" msgstr "Lifetime value" msgid "Lifetime value for IKE keys" msgstr "Lifetime value for IKE keys" msgid "Lifetime value for IKE keys " msgstr "Lifetime value for IKE keys " msgid "Local Endpoint Group" msgstr "Local Endpoint Group" msgid "Local Endpoint Group(s)" msgstr "Local Endpoint Group(s)" msgid "Local Side Public IPs" msgstr "Local Side Public IPs" msgid "Local System Subnets" msgstr "Local System Subnets" msgid "Local subnet(s). This field is valid if type is Subnet" msgstr "Local subnet(s). This field is valid if type is Subnet" msgid "" "Local subnets which the new IPsec connection is connected to. Required if no " "subnet is specified in a VPN service selected." msgstr "" "Local subnets which the new IPsec connection is connected to. Required if no " "subnet is specified in a VPN service selected." msgid "MTU" msgstr "MTU" msgid "Maximum Transmission Unit size for the connection" msgstr "Maximum Transmission Unit size for the connection" msgid "Name" msgstr "Name" msgid "Name =" msgstr "Name =" msgid "" "Note: The recommended way to specify local subnets is to use endpoint groups " "in IPsec site connection. It is deprecated to specify subnet in VPN service. " "For a new VPN service or IPsec site connection, using endpoint group is " "recommended." msgstr "" "Note: The recommended way to specify local subnets is to use endpoint groups " "in IPsec site connection. It is deprecated to specify subnet in VPN service. " "For a new VPN service or IPsec site connection, using endpoint group is " "recommended." msgid "Optional Parameters" msgstr "Optional Parameters" msgid "Optional. No need to be specified when you use endpoint groups." msgstr "Optional. No need to be specified when you use endpoint groups." msgid "PFS" msgstr "PFS" msgid "PFS =" msgstr "PFS =" msgid "PFS supports Diffie-Hellman groups 2, 5 (default), 14 through 31." msgstr "PFS supports Diffie-Hellman groups 2, 5 (default), 14 through 31." msgid "Peer Endpoint Group" msgstr "Peer Endpoint Group" msgid "Peer Endpoint Group(s)" msgstr "Peer Endpoint Group(s)" msgid "Peer gateway public IPv4/IPv6 Address or FQDN" msgstr "Peer gateway public IPv4/IPv6 Address or FQDN" msgid "Peer gateway public IPv4/IPv6 address or FQDN for the VPN Connection" msgstr "Peer gateway public IPv4/IPv6 address or FQDN for the VPN Connection" msgid "Peer router identity for authentication (Peer ID)" msgstr "Peer router identity for authentication (Peer ID)" msgid "" "Peer router identity for authentication. Can be IPv4/IPv6 address, e-mail, " "key ID, or FQDN" msgstr "" "Peer router identity for authentication. Can be IPv4/IPv6 address, e-mail, " "key ID, or FQDN" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Create" msgstr "Pending Create" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Delete" msgstr "Pending Delete" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Update" msgstr "Pending Update" msgid "Perfect Forward Secrecy" msgstr "Perfect Forward Secrecy" msgid "Phase 1 negotiation mode limited to using 'main' and 'aggressive'." msgstr "Phase 1 negotiation mode limited to using 'main' and 'aggressive'." msgid "Pre-Shared Key (PSK) string" msgstr "Pre-Shared Key (PSK) string" msgid "Project ID" msgstr "Project ID" msgid "Remote peer CIDR(s) connected to the new IPsec connection." msgstr "Remote peer CIDR(s) connected to the new IPsec connection." msgid "Remote peer subnet" msgstr "Remote peer subnet" msgid "Remote peer subnet(s)" msgstr "Remote peer subnet(s)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24). This field is valid if " "type is CIDR" msgstr "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24). This field is valid if " "type is CIDR" msgid "Route mode" msgstr "Route mode" msgid "Router" msgstr "Router" msgid "Router =" msgstr "Router =" msgid "Router ID =" msgstr "Router ID =" msgid "SHA-1" msgstr "SHA-1" msgid "SHA-256" msgstr "SHA-256" msgid "SHA-384" msgstr "SHA-384" msgid "SHA-512" msgstr "SHA-512" msgid "Save Changes" msgstr "Save Changes" msgid "Scheduled deletion of IKE policy" msgid_plural "Scheduled deletion of IKE policies" msgstr[0] "Scheduled deletion of IKE policy" msgstr[1] "Scheduled deletion of IKE policies" msgid "Scheduled deletion of IPsec policy" msgid_plural "Scheduled deletion of IPsec policies" msgstr[0] "Scheduled deletion of IPsec policy" msgstr[1] "Scheduled deletion of IPsec policies" msgid "Scheduled deletion of IPsec site connection" msgid_plural "Scheduled deletion of IPsec site connections" msgstr[0] "Scheduled deletion of IPsec site connection" msgstr[1] "Scheduled deletion of IPsec site connections" msgid "Scheduled deletion of VPN service" msgid_plural "Scheduled deletion of VPN services" msgstr[0] "Scheduled deletion of VPN service" msgstr[1] "Scheduled deletion of VPN services" msgid "Scheduled deletion of endpoint group" msgid_plural "Scheduled deletion of endpoint groups" msgstr[0] "Scheduled deletion of endpoint group" msgstr[1] "Scheduled deletion of endpoint groups" msgid "Select IKE policy" msgstr "Select IKE policy" msgid "Select IPsec Policy" msgstr "Select IPsec Policy" msgid "Select VPN service" msgstr "Select VPN service" msgid "Select a Router" msgstr "Select a Router" msgid "Select a Subnet" msgstr "Select a Subnet" msgid "Select local endpoint group" msgstr "Select local endpoint group" msgid "Select peer endpoint group" msgstr "Select peer endpoint group" msgid "" "Specify a name, description, router, and subnet (optional) for the VPN " "service." msgstr "" "Specify a name, description, router, and subnet (optional) for the VPN " "service." msgid "Status" msgstr "Status" msgid "Status =" msgstr "Status =" msgid "Subnet" msgstr "Subnet" msgid "Subnet (for local systems)" msgstr "Subnet (for local systems)" msgid "Subnet =" msgstr "Subnet =" msgid "Subnet ID =" msgstr "Subnet ID =" msgid "" "The VPN service is attached to a router and references to endpoint group or " "a single subnet to push to a remote site." msgstr "" "The VPN service is attached to a router and references to endpoint group or " "a single subnet to push to a remote site." msgid "The pre-defined key string between the two peers of the VPN connection" msgstr "The pre-defined key string between the two peers of the VPN connection" msgid "" "The router and admin state fields require to be enabled. All others are " "optional." msgstr "" "The router and admin state fields require to be enabled. All others are " "optional." msgid "" "The state of IPsec site connection to start in. If disabled (not checked), " "IPsec site connection does not forward packets." msgstr "" "The state of IPsec site connection to start in. If disabled (not checked), " "IPsec site connection does not forward packets." msgid "" "The state of VPN service to start in. If disabled (not checked), VPN service " "does not forward packets." msgstr "" "The state of VPN service to start in. If disabled (not checked), VPN service " "does not forward packets." msgid "The type of IPsec tunnel (tunnel/transport) to be used." msgstr "The type of IPsec tunnel (tunnel/transport) to be used." msgid "The type of protocol (ESP, AH, AH-ESP) used in IPsec policy." msgstr "The type of protocol (ESP, AH, AH-ESP) used in IPsec policy." msgid "The type of version (v1/v2) that needs to be filtered." msgstr "The type of version (v1/v2) that needs to be filtered." msgid "Transform Protocol" msgstr "Transform Protocol" msgid "Type" msgstr "Type" msgid "Type =" msgstr "Type =" #, python-format msgid "Unable to add IKE policy \"%s\"." msgstr "Unable to add IKE policy \"%s\"." #, python-format msgid "Unable to add IPsec policy \"%s\"." msgstr "Unable to add IPsec policy \"%s\"." #, python-format msgid "Unable to add IPsec site connection \"%s\"." msgstr "Unable to add IPsec site connection \"%s\"." #, python-format msgid "Unable to add VPN service \"%s\"." msgstr "Unable to add VPN service \"%s\"." #, python-format msgid "Unable to add endpoint group \"%s\"." msgstr "Unable to add endpoint group \"%s\"." msgid "Unable to delete IKE policy." msgstr "Unable to delete IKE policy." msgid "Unable to delete IPsec policy." msgstr "Unable to delete IPsec policy." msgid "Unable to delete IPsec site connection." msgstr "Unable to delete IPsec site connection." msgid "Unable to delete VPN service." msgstr "Unable to delete VPN service." msgid "Unable to delete endpoint group." msgstr "Unable to delete endpoint group." msgid "Unable to retrieve IKE policies list." msgstr "Unable to retrieve IKE policies list." msgid "Unable to retrieve IKE policy details." msgstr "Unable to retrieve IKE policy details." msgid "Unable to retrieve IPsec policies list." msgstr "Unable to retrieve IPsec policies list." msgid "Unable to retrieve IPsec policy details." msgstr "Unable to retrieve IPsec policy details." msgid "Unable to retrieve IPsec policy list." msgstr "Unable to retrieve IPsec policy list." msgid "Unable to retrieve IPsec site connection details." msgstr "Unable to retrieve IPsec site connection details." msgid "Unable to retrieve IPsec site connections list." msgstr "Unable to retrieve IPsec site connections list." msgid "Unable to retrieve VPN service details." msgstr "Unable to retrieve VPN service details." msgid "Unable to retrieve VPN services list." msgstr "Unable to retrieve VPN services list." msgid "Unable to retrieve endpoint group details." msgstr "Unable to retrieve endpoint group details." msgid "Unable to retrieve endpoint group list." msgstr "Unable to retrieve endpoint group list." msgid "Unable to retrieve networks list." msgstr "Unable to retrieve networks list." msgid "Unable to retrieve routers list." msgstr "Unable to retrieve routers list." msgid "VPN" msgstr "VPN" msgid "VPN Connections" msgstr "VPN Connections" msgid "VPN Service" msgstr "VPN Service" msgid "VPN Service =" msgstr "VPN Service =" msgid "VPN Service Details" msgstr "VPN Service Details" msgid "VPN Service ID =" msgstr "VPN Service ID =" msgid "VPN Services" msgstr "VPN Services" #, python-format msgid "VPN service %s was successfully updated." msgstr "VPN service %s was successfully updated." msgid "VPN service associated with this connection" msgstr "VPN service associated with this connection" msgid "Valid integer greater than the DPD interval" msgstr "Valid integer greater than the DPD interval" msgid "Valid integer lesser than DPD timeout" msgstr "Valid integer lesser than DPD timeout" msgid "Valid integer lesser than the DPD timeout" msgstr "Valid integer lesser than the DPD timeout" msgid "Virtual Private Network" msgstr "Virtual Private Network" msgid "You may update IKE policy details here." msgstr "You may update IKE policy details here." msgid "You may update IPsec policy details here." msgstr "You may update IPsec policy details here." msgid "You may update IPsec site connection details here." msgstr "You may update IPsec site connection details here." msgid "You may update VPN service details here." msgstr "You may update VPN service details here." msgid "You may update endpoint group details here." msgstr "You may update endpoint group details here." msgid "bi-directional" msgstr "bi-directional" msgid "clear" msgstr "clear" msgid "disabled" msgstr "disabled" msgid "down" msgstr "down" msgid "group14" msgstr "group14" msgid "group2" msgstr "group2" msgid "group24" msgstr "group24" msgid "group25" msgstr "group25" msgid "group26" msgstr "group26" msgid "group27" msgstr "group27" msgid "group28" msgstr "group28" msgid "group29" msgstr "group29" msgid "group30" msgstr "group30" msgid "group5" msgstr "group5" msgid "hold" msgstr "hold" msgid "response-only" msgstr "response-only" msgid "restart" msgstr "restart" msgid "restart-by-peer" msgstr "restart-by-peer" msgid "seconds" msgstr "seconds" msgid "transport" msgstr "transport" msgid "tunnel" msgstr "tunnel" msgid "up" msgstr "up" msgid "v1" msgstr "v1" msgid "v2" msgstr "v2" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.348055 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/id/0000775000175000017500000000000015257164617024412 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3730564 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/id/LC_MESSAGES/0000775000175000017500000000000015257164617026177 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.273428 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/id/LC_MESSAGES/django.po0000664000175000017500000005265415257164532030011 0ustar00zuulzuul# OpenStack Infra , 2015. #zanata # suhartono , 2016. #zanata # suhartono , 2017. #zanata # suhartono , 2018. #zanata # suhartono , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: neutron-vpnaas-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2026-05-08 19:58+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-05 11:14+0000\n" "Last-Translator: suhartono \n" "Language-Team: Indonesian\n" "Language: id\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "" "(Deprecated) Remote peer subnet(s) address(es) with mask(s) in CIDR format " "separated with commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "(Deprecated) Remote peer subnet(s) address(es) dengan mask in CIDR format " "yang dipisahkan dengan koma jika diperlukan (misalnya. 20.1.0.0/24, " "21.1.0.0/24)" msgid "-" msgstr "-" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Active" msgstr "Aktif" msgid "Add" msgstr "Menambahkan" msgid "Add Endpoint Group" msgstr "Menambahkan Endpoint Group" msgid "Add IKE Policy" msgstr "Tambah IKE Policy" msgid "Add IPsec Policy" msgstr "Menambahkan IPsec Policy" msgid "Add IPsec Site Connection" msgstr "Menambahkan IPsec Site Connection" msgid "Add New Endpoint Groups" msgstr "Menambahkan New Endpoint Groups" msgid "Add New IKE Policy" msgstr "Tambah IKE Policy baru" msgid "Add New IPsec Policy" msgstr "Menambahkan New IPsec Policy" msgid "Add New IPsec Site Connection" msgstr "Menambahkan New IPsec Site Connection" msgid "Add New VPN Service" msgstr "Menambah layanan VPN baru" msgid "Add VPN Service" msgstr "Tambah VPN Service" #, python-format msgid "Added IKE policy \"%s\"." msgstr "Ditambahkan IKE policy \"%s\"." #, python-format msgid "Added IPsec policy \"%s\"." msgstr "Ditambahkan IPsec policy \"%s\"." #, python-format msgid "Added IPsec site connection \"%s\"." msgstr "Ditambahkan IPsec site connection \"%s\"." #, python-format msgid "Added VPN service \"%s\"." msgstr "Ditambahkan VPN service \"%s\"." #, python-format msgid "Added endpoint group \"%s\"." msgstr "Ditambahkan endpoint group \"%s\"." msgid "Admin State" msgstr "Admin State" msgid "Admin State is enabled by default." msgstr "Admin State diaktifkan secara default" msgid "All fields are optional." msgstr "Semua field bersifat opsional." msgid "An IKE policy is an association of the following attributes:" msgstr "Kebijakan IKE (IKE policy) adalah asosiasi dari atribut berikut:" msgid "An IPsec policy is an association of the following attributes" msgstr "Kebijakan IPsec adalah asosiasi atribut berikut" msgid "Authorization algorithm" msgstr "Algoritma otorisasi" msgid "Authorization algorithm =" msgstr "Authorization algorithm =" msgid "Authorization mode" msgstr "Mode otorisasi" msgid "CIDR (for external systems)" msgstr "CIDR (untuk sistem eksternal)" msgid "Create IKE policy for current project." msgstr "Buat IKE policy untuk proyek saat ini." msgid "Create IPsec policy for current project." msgstr "Buat kebijakan IPsec untuk proyek saat ini." msgid "" "Create IPsec site connection for current project. Assign a name and " "description for the IPsec site connection. All fields in this tab are " "required." msgstr "" "Buat koneksi situs IPsec untuk proyek saat ini. Tetapkan nama dan deskripsi " "untuk koneksi situs IPsec. Semua kolom dalam tab ini diperlukan." msgid "Create VPN service for current project." msgstr "Buat layanan VPN untuk proyek saat ini." msgid "Create endpoint group for current project." msgstr "Buat grup endpoint untuk proyek saat ini." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Created" msgstr "Created" msgid "DPD Timeout must be greater than DPD Interval" msgstr "DPD Timeout harus lebih besar dari DPD Interval" msgid "Dead peer detection action" msgstr "Tindakan deteksi peer mati" msgid "Dead peer detection actions" msgstr "Tindakan deteksi rekan mati" msgid "Dead peer detection interval" msgstr "Interval deteksi rekan mati" msgid "Dead peer detection timeout" msgstr "Dead peer detection timeout (DPD timeout)" msgid "Delete Endpoint Group" msgid_plural "Delete Endpoint Groups" msgstr[0] "Delete Endpoint Group" msgid "Delete IKE Policy" msgid_plural "Delete IKE Policies" msgstr[0] "Delete IKE Policy" msgid "Delete IPsec Policy" msgid_plural "Delete IPsec Policies" msgstr[0] "Delete IPsec Policy" msgid "Delete IPsec Site Connection" msgid_plural "Delete IPsec Site Connections" msgstr[0] "Delete IPsec Site Connection" msgid "Delete VPN Service" msgid_plural "Delete VPN Services" msgstr[0] "Delete VPN Service" msgid "Description" msgstr "Deskripsi" msgid "Description:" msgstr "Deskripsi:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Down" msgstr "Down" msgid "Edit Connection" msgstr "Edit Connection" msgid "Edit Endpoint Group" msgstr "Edit Endpoint Group" msgid "Edit IKE Policy" msgstr "Mengedit IKE Policy" msgid "Edit IPsec Policy" msgstr "Edit IPsec Policy" msgid "Edit IPsec Site Connection" msgstr "Edit IPsec Site Connection" msgid "Edit IPsec policy" msgstr "Edit IPsec policy" msgid "Edit IPsec site connection" msgstr "Edit IPsec site connection" msgid "Edit VPN Service" msgstr "Mengedit VPN Service" msgid "Enable Admin State" msgstr "Enable Admin State" msgid "Encapsulation mode" msgstr "modus enkapsulasi" msgid "Encryption algorithm" msgstr "Algoritma Enkripsi" msgid "Encryption algorithm =" msgstr "Encryption algorithm =" msgid "Endpoint Groups" msgstr "Endpoint Groups" msgid "Endpoint Groups Details" msgstr "Endpoint Groups Details" #, python-format msgid "Endpoint group %s was successfully updated." msgstr "Endpoint group %s berhasil diupdate" msgid "Endpoint group for local subnet(s)" msgstr "Grup endpoint untuk subnet lokal" msgid "Endpoint group for remote peer CIDR(s)" msgstr "Endpoint group untuk remote peer CIDR(s)" msgid "Endpoints" msgstr "Endpoints (titik akhir)" msgid "Endpoints =" msgstr "Endpoints =" msgid "Equal to or greater than 60" msgstr "Sama atau lebih besar dari 60" msgid "" "Equal to or greater than 68 if the local subnet is IPv4. Equal to or greater " "than 1280 if the local subnet is IPv6." msgstr "" "Sama dengan atau lebih besar dari 68 jika subnet lokal IPv4. Sama dengan " "atau lebih besar dari 1280 jika subnet lokal IPv6." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Error" msgstr "Kesalahan" msgid "External System CIDRs" msgstr "External System CIDRs" msgid "External System Subnets" msgstr "External System Subnets" #, python-format msgid "Failed to update IKE policy %s" msgstr "Gagal memperbarui IKE policy %s" #, python-format msgid "Failed to update IPsec policy %s" msgstr "Gagal memperbarui IPsec policy %s" #, python-format msgid "Failed to update IPsec site connection %s" msgstr "Gagal memperbarui IPsec site connection %s" #, python-format msgid "Failed to update VPN service %s" msgstr "Gagal memperbarui VPN service %s" #, python-format msgid "Failed to update endpoint group %s" msgstr "Gagal memperbarui endpoint group %s" msgid "" "Fields in this tab are optional. You can configure the detail of IPsec site " "connection created." msgstr "" "Kolom dalam tab ini bersifat opsional. Anda dapat mengkonfigurasi detail " "koneksi situs IPsec yang dibuat." msgid "ID" msgstr "ID" msgid "IKE Phase 1 negotiation mode" msgstr "Modus negosiasi IKE Tahap 1" msgid "IKE Phase1 negotiation mode" msgstr "Modus negosiasi IKE Phase1" msgid "IKE Policies" msgstr "IKE Policy (kebijakan IKE)" msgid "IKE Policy" msgstr "IKE Policy" msgid "IKE Policy =" msgstr "IKE Policy =" msgid "IKE Policy Details" msgstr "Rincian IKE Policy" msgid "IKE Policy ID =" msgstr "IKE Policy ID =" #, python-format msgid "IKE policy %s was successfully updated." msgstr "IKE policy %s berhasil diupdate" msgid "IKE policy associated with this connection" msgstr "IKE policy associated with this connection" msgid "IKE version" msgstr "IKE version" msgid "IPsec Policies" msgstr "IPsec Policies" msgid "IPsec Policy" msgstr "IPsec Policy" msgid "IPsec Policy =" msgstr "IPsec Policy =" msgid "IPsec Policy Details" msgstr "IPsec Policy Details" msgid "IPsec Policy ID =" msgstr "IPsec Policy ID =" msgid "IPsec Site Connection Details" msgstr "IPsec Site Connection Details" msgid "IPsec Site Connections" msgstr "IPsec Site Connections" msgid "IPsec connection validation requires that local endpoints are subnets" msgstr "Validasi koneksi IPsec mengharuskan bahwa endpoint lokal adalah subnet" msgid "" "IPsec connection validation requires that local endpoints are subnets, and " "peer endpoints are CIDRs." msgstr "" "Validasi koneksi IPsec mengharuskan bahwa endpoint lokal adalah subnet, dan " "peer endpoint adalah CIDR." msgid "IPsec connection validation requires that peer endpoints are CIDRs" msgstr "Validasi koneksi IPsec mengharuskan bahwa endpoint peer adalah CIDRs" #, python-format msgid "IPsec policy %s was successfully updated." msgstr "IPsec policy %s berhasil diupdate" msgid "IPsec policy associated with this connection" msgstr "IPsec policy terkait dengan koneksi ini" #, python-format msgid "IPsec site connection %s was successfully updated." msgstr "Koneksi situs IPsec% s berhasil diperbarui." msgid "IPv4" msgstr "IPv4" msgid "IPv4:" msgstr "IPv4:" msgid "IPv6" msgstr "IPv6" msgid "IPv6:" msgstr "IPv6:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Inactive" msgstr "Tidak aktif" msgid "Initiator state" msgstr "Initiator state (keadaan inisiator)" msgid "" "Life time consists of units and value. Units in 'seconds' and the default " "value is 3600." msgstr "" "Life time terdiri dari unit dan nilai. Unit dalam 'detik' dan nilai " "defaultnya adalah 3.600." msgid "Lifetime" msgstr "Lifetime" msgid "Lifetime Units" msgstr "Lifetime Units" msgid "Lifetime Value" msgstr "Lifetime Value" msgid "Lifetime units" msgstr "Lifetime units" msgid "Lifetime units for IKE keys" msgstr "Lifetime units for IKE keys" msgid "Lifetime value" msgstr "Lifetime value (nilai lifetime)" msgid "Lifetime value for IKE keys" msgstr "Lifetime value for IKE keys" msgid "Lifetime value for IKE keys " msgstr "Nilai Lifetime untuk IKE key " msgid "Local Endpoint Group" msgstr "Local Endpoint Group" msgid "Local Endpoint Group(s)" msgstr "Local Endpoint Group(s)" msgid "Local Side Public IPs" msgstr "Local Side Public IP (IP publik sisi lokal)" msgid "Local System Subnets" msgstr "Local System Subnets" msgid "Local subnet(s). This field is valid if type is Subnet" msgstr "Local subnet(s). Field ini berlaku jika tipe Subnet" msgid "" "Local subnets which the new IPsec connection is connected to. Required if no " "subnet is specified in a VPN service selected." msgstr "" "Subnet lokal yang koneksi IPsec baru terhubung. Diperlukan jika tidak ada " "subnet yang ditentukan dalam layanan VPN yang dipilih." msgid "MTU" msgstr "MTU" msgid "Maximum Transmission Unit size for the connection" msgstr "Ukuran unit transmission maksimum untuk sambungan" msgid "Name" msgstr "Nama" msgid "Name =" msgstr "Name =" msgid "" "Note: The recommended way to specify local subnets is to use endpoint groups " "in IPsec site connection. It is deprecated to specify subnet in VPN service. " "For a new VPN service or IPsec site connection, using endpoint group is " "recommended." msgstr "" "Catatan: Cara yang disarankan untuk menentukan subnet lokal adalah dengan " "menggunakan grup endpoint dalam koneksi situs IPsec. Sudah tidak berlaku " "lagi untuk menentukan subnet dalam layanan VPN. Untuk layanan VPN baru atau " "koneksi situs IPsec, gunakan grup endpoint." msgid "Optional Parameters" msgstr "Optional Parameter (parameter opsional)" msgid "Optional. No need to be specified when you use endpoint groups." msgstr "Pilihan. Tidak perlu ditentukan saat Anda menggunakan grup endpoint." msgid "PFS" msgstr "PFS" msgid "PFS =" msgstr "PFS =" msgid "Peer Endpoint Group" msgstr "Peer Endpoint Group" msgid "Peer Endpoint Group(s)" msgstr "Peer Endpoint Group(s)" msgid "Peer gateway public IPv4/IPv6 Address or FQDN" msgstr "Alamat IPv4/IPv6 publik gateway rekan atau FQDN" msgid "Peer gateway public IPv4/IPv6 address or FQDN for the VPN Connection" msgstr "Alamat IPv4/IPv6 publik gateway rekan atau FQDN untuk koneksi VPN." msgid "Peer router identity for authentication (Peer ID)" msgstr "Identitas router rekan untuk otentikasi (Peer ID)" msgid "" "Peer router identity for authentication. Can be IPv4/IPv6 address, e-mail, " "key ID, or FQDN" msgstr "" "Identitas router rekan untuk otentikasi. Dapat alamat IPv4/IPv6, email, key " "ID, atau FQDN" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Create" msgstr "Pending Create (penundaan pembuatan)" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Delete" msgstr "Pending Delete" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Update" msgstr "Pending Update (penundaan pembaharuan)" msgid "Perfect Forward Secrecy" msgstr "Perfect Forward Secrecy" msgid "Pre-Shared Key (PSK) string" msgstr "Pre-Shared Key (PSK) string (string PSK)" msgid "Project ID" msgstr "Project ID" msgid "Remote peer CIDR(s) connected to the new IPsec connection." msgstr "Remote peer CIDR(s) terhubung ke new IPsec connection." msgid "Remote peer subnet" msgstr "Subnet peer jarak jauh" msgid "Remote peer subnet(s)" msgstr "Remote peer subnet (subnet rekan jauh)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "Alamat rekan subnet jauh dengan mask dalam format CIDR dipisahkan dengan " "koma jika diperlukan (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24). This field is valid if " "type is CIDR" msgstr "" "Alamat subnet peer remote dengan mask dalam format CIDR dipisahkan dengan " "koma jika diperlukan (misalnya, 20.1.0.0/24, 21.1.0.0/24). Field ini berlaku " "jika tipe CIDR" msgid "Route mode" msgstr "Mode rute" msgid "Router" msgstr "Router" msgid "Router =" msgstr "Router =" msgid "Router ID =" msgstr "Router ID =" msgid "Save Changes" msgstr "Simpan perubahan" msgid "Scheduled deletion of IKE policy" msgid_plural "Scheduled deletion of IKE policies" msgstr[0] "Scheduled deletion of IKE policy" msgid "Scheduled deletion of IPsec policy" msgid_plural "Scheduled deletion of IPsec policies" msgstr[0] "Scheduled deletion of IPsec policy" msgid "Scheduled deletion of IPsec site connection" msgid_plural "Scheduled deletion of IPsec site connections" msgstr[0] "Scheduled deletion of IPsec site connection" msgid "Scheduled deletion of VPN service" msgid_plural "Scheduled deletion of VPN services" msgstr[0] "Scheduled deletion of VPN service" msgid "Scheduled deletion of endpoint group" msgid_plural "Scheduled deletion of endpoint groups" msgstr[0] "Scheduled deletion of endpoint group" msgid "Select IKE policy" msgstr "Memilih IKE policy" msgid "Select IPsec Policy" msgstr "Memilih IPsec Policy" msgid "Select VPN service" msgstr "Memilih VPN service" msgid "Select a Router" msgstr "Pilih Router" msgid "Select a Subnet" msgstr "Pilih subnet" msgid "Select local endpoint group" msgstr "Memilih local endpoint group" msgid "Select peer endpoint group" msgstr "Memilih peer endpoint group" msgid "" "Specify a name, description, router, and subnet (optional) for the VPN " "service." msgstr "" "Tentukan nama, deskripsi, router, dan subnet (opsional) untuk layanan VPN." msgid "Status" msgstr "Status" msgid "Status =" msgstr "Status = " msgid "Subnet" msgstr "Subnet" msgid "Subnet (for local systems)" msgstr "Subnet (untuk sistem lokal)" msgid "Subnet =" msgstr "Subnet =" msgid "Subnet ID =" msgstr "Subnet ID =" msgid "" "The VPN service is attached to a router and references to endpoint group or " "a single subnet to push to a remote site." msgstr "" "Layanan VPN terhubung ke router dan referensi ke grup endpoint atau subnet " "tunggal untuk mendorong ke situs jarak jauh." msgid "The pre-defined key string between the two peers of the VPN connection" msgstr "" "String kunci yang telah ditetapkan (pre-defined key string) antara dua rekan " "dari koneksi VPN" msgid "" "The router and admin state fields require to be enabled. All others are " "optional." msgstr "" "Bidang router dan admin state harus diaktifkan. Lainnya bersifat opsional." msgid "" "The state of IPsec site connection to start in. If disabled (not checked), " "IPsec site connection does not forward packets." msgstr "" "Status koneksi situs IPsec untuk memulai masuk. Jika dinonaktifkan (tidak " "dicentang), koneksi situs IPsec tidak meneruskan paket." msgid "" "The state of VPN service to start in. If disabled (not checked), VPN service " "does not forward packets." msgstr "" "Keadaan layanan VPN untuk memulai masuk Jika dinonaktifkan (tidak " "dicentang), layanan VPN tidak meneruskan paket." msgid "The type of IPsec tunnel (tunnel/transport) to be used." msgstr "Jenis IPsec tunnel (tunnel/transport) yang akan digunakan." msgid "The type of version (v1/v2) that needs to be filtered." msgstr "Jenis versi (v1 / v2) yang perlu disaring." msgid "Transform Protocol" msgstr "Transform Protocol (protokol transform)" msgid "Type" msgstr "Type" msgid "Type =" msgstr "Type = (tipe=)" #, python-format msgid "Unable to add IKE policy \"%s\"." msgstr "Tidak dapat menambahkan IKE policy \"%s\"." #, python-format msgid "Unable to add IPsec policy \"%s\"." msgstr "Tidak dapat menambahkan IPsec policy \"%s\"." #, python-format msgid "Unable to add IPsec site connection \"%s\"." msgstr "Tidak dapat menambahkan IPsec site connection \"%s\"." #, python-format msgid "Unable to add VPN service \"%s\"." msgstr "Tidak dapat menambahkan VPN service \"%s\"." #, python-format msgid "Unable to add endpoint group \"%s\"." msgstr "Tidak dapat menambahkan endpoint group \"%s\"." msgid "Unable to retrieve IKE policies list." msgstr "Tidak dapat mengambil IKE policies list." msgid "Unable to retrieve IKE policy details." msgstr "Tidak dapat mengambil IKE policy details." msgid "Unable to retrieve IPsec policies list." msgstr "Tidak dapat mengambil IPsec policies list." msgid "Unable to retrieve IPsec policy details." msgstr "Tidak dapat mengambil IPsec policy details." msgid "Unable to retrieve IPsec policy list." msgstr "Tidak dapat mengambil IPsec policy list." msgid "Unable to retrieve IPsec site connection details." msgstr "Tidak dapat mengambil IPsec site connection details." msgid "Unable to retrieve IPsec site connections list." msgstr "Tidak dapat mengambil IPsec site connections list." msgid "Unable to retrieve VPN service details." msgstr "Tidak dapat mengambil VPN service details." msgid "Unable to retrieve VPN services list." msgstr "Tidak dapat mengambil VPN services list." msgid "Unable to retrieve endpoint group details." msgstr "Tidak dapat mengambil endpoint group details." msgid "Unable to retrieve endpoint group list." msgstr "Tidak dapat mengambil endpoint group list." msgid "Unable to retrieve networks list." msgstr "Tidak dapat mengambil daftar jaringan." msgid "Unable to retrieve routers list." msgstr "Tidak dapat mengambil daftar routers" msgid "VPN" msgstr "VPN" msgid "VPN Connections" msgstr "VPN Connections" msgid "VPN Service" msgstr "Service VPN" msgid "VPN Service =" msgstr "VPN Service =" msgid "VPN Service Details" msgstr "Rincian VPN Service " msgid "VPN Service ID =" msgstr "VPN Service ID =" msgid "VPN Services" msgstr "VPN Services (layanan VPN)" #, python-format msgid "VPN service %s was successfully updated." msgstr "VPN service %s berhasil diperbarui." msgid "VPN service associated with this connection" msgstr "Layanan VPN yang terkait dengan koneksi ini" msgid "Valid integer greater than the DPD interval" msgstr "Bilangan bulat yang valid lebih besar dari DPD interval" msgid "Valid integer lesser than DPD timeout" msgstr "Bilangan integer yang valid kurang dari DPD timeout" msgid "Valid integer lesser than the DPD timeout" msgstr "Bilangan integer yang valid kurang dari DPD timeout" msgid "Virtual Private Network" msgstr "Virtual Private Network" msgid "You may update IKE policy details here." msgstr "Anda dapat memperbarui rincian kebijakan IKE di sini." msgid "You may update IPsec policy details here." msgstr "Anda dapat memperbarui rincian kebijakan IPsec di sini." msgid "You may update IPsec site connection details here." msgstr "Anda dapat memperbarui detail koneksi situs IPsec di sini." msgid "You may update VPN service details here." msgstr "Anda dapat memperbarui rincian layanan VPN di sini." msgid "You may update endpoint group details here." msgstr "Anda dapat memperbarui rincian grup endpoint di sini." msgid "bi-directional" msgstr "bi-directional (dua arah)" msgid "clear" msgstr "clear" msgid "disabled" msgstr "disabled" msgid "down" msgstr "down (turun)" msgid "group14" msgstr "grup14" msgid "group2" msgstr "Grup2" msgid "group5" msgstr "Grup5" msgid "hold" msgstr "hold" msgid "response-only" msgstr "response-only (hanya tanggapan)" msgid "restart" msgstr "restart" msgid "restart-by-peer" msgstr "restart-by-peer" msgid "seconds" msgstr "seconds (detik)" msgid "transport" msgstr "transport" msgid "tunnel" msgstr "tunnel" msgid "up" msgstr "up (naik)" msgid "v1" msgstr "v1" msgid "v2" msgstr "v2" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.348055 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/ja/0000775000175000017500000000000015257164617024410 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3730564 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/ja/LC_MESSAGES/0000775000175000017500000000000015257164617026175 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2744281 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/ja/LC_MESSAGES/django.po0000664000175000017500000006000115257164532027770 0ustar00zuulzuul# Akihiro Motoki , 2018. #zanata # Yuko Katabami , 2018. #zanata # Akihiro Motoki , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: neutron-vpnaas-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2026-05-08 19:58+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-03-27 03:55+0000\n" "Last-Translator: Akihiro Motoki \n" "Language-Team: Japanese\n" "Language: ja\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "" "(Deprecated) Remote peer subnet(s) address(es) with mask(s) in CIDR format " "separated with commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "(廃止予定) 接続相手のサブネットアドレスを CIDR 形式で指定します。複数指定する" "場合はコンマで区切ります (例: 20.1.0.0/24, 21.1.0.0/24)" msgid "-" msgstr "-" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Active" msgstr "稼働中" msgid "Add" msgstr "追加" msgid "Add Endpoint Group" msgstr "エンドポイントグループの追加" msgid "Add IKE Policy" msgstr "IKE ポリシーの追加" msgid "Add IPsec Policy" msgstr "IPsec ポリシーの追加" msgid "Add IPsec Site Connection" msgstr "IPsec サイト間接続の追加" msgid "Add New Endpoint Groups" msgstr "エンドポイントグループの追加" msgid "Add New IKE Policy" msgstr "IKE ポリシーの追加" msgid "Add New IPsec Policy" msgstr "IPsec ポリシーの追加" msgid "Add New IPsec Site Connection" msgstr "IPsec サイト間接続の追加" msgid "Add New VPN Service" msgstr "VPN サービスの追加" msgid "Add VPN Service" msgstr "VPN サービスの追加" #, python-format msgid "Added IKE policy \"%s\"." msgstr "IKE ポリシー \"%s\" を追加しました。" #, python-format msgid "Added IPsec policy \"%s\"." msgstr "IPsec ポリシー \"%s\" を追加しました。" #, python-format msgid "Added IPsec site connection \"%s\"." msgstr "IPsec サイト間接続 \"%s\" を追加しました。" #, python-format msgid "Added VPN service \"%s\"." msgstr "VPN サービス \"%s\" を追加しました。" #, python-format msgid "Added endpoint group \"%s\"." msgstr "エンドポイントグループ \"%s\" を追加しました。" msgid "Admin State" msgstr "管理状態" msgid "Admin State is enabled by default." msgstr "管理状態はデフォルトで有効になっています。" msgid "All fields are optional." msgstr "すべてのフィールドは任意です。" msgid "An IKE policy is an association of the following attributes:" msgstr "IKE ポリシーでは、以下の属性を指定できます。" msgid "An IPsec policy is an association of the following attributes" msgstr "IPsec ポリシーでは、以下の属性を指定できます。" msgid "Authorization algorithm" msgstr "認可アルゴリズム" msgid "Authorization algorithm =" msgstr "認可アルゴリズム =" msgid "Authorization mode" msgstr "認可モード" msgid "CIDR (for external systems)" msgstr "CIDR (外部システム用)" msgid "Create IKE policy for current project." msgstr "現在のプロジェクトに IKE ポリシーを作成します。" msgid "Create IPsec policy for current project." msgstr "現在のプロジェクトに IPsec ポリシーを作成します。" msgid "" "Create IPsec site connection for current project. Assign a name and " "description for the IPsec site connection. All fields in this tab are " "required." msgstr "" "現在のプロジェクトに IPsec サイト間接続を作成します。 IPsec サイト間接続の名" "前と説明を入力してください。このタブのフィールドはすべて必須です。" msgid "Create VPN service for current project." msgstr "現在のプロジェクトに VPN サービスを作成します。" msgid "Create endpoint group for current project." msgstr "現在のプロジェクトにエンドポイントグループを作成します。" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Created" msgstr "作成済み" msgid "DPD Timeout must be greater than DPD Interval" msgstr "" "Dead Peer 検出タイムアウトは Dead Peer 検出間隔より大きくなければいけません。" msgid "Dead peer detection action" msgstr "Dead Peer 検出時のアクション" msgid "Dead peer detection actions" msgstr "Dead Peer 検出時のアクション" msgid "Dead peer detection interval" msgstr "Dead Peer 検出間隔" msgid "Dead peer detection timeout" msgstr "Dead Peer 検出タイムアウト" msgid "Delete Endpoint Group" msgid_plural "Delete Endpoint Groups" msgstr[0] "エンドポイントグループの削除" msgid "Delete IKE Policy" msgid_plural "Delete IKE Policies" msgstr[0] "IKE ポリシーの削除" msgid "Delete IPsec Policy" msgid_plural "Delete IPsec Policies" msgstr[0] "IPsec ポリシーの削除" msgid "Delete IPsec Site Connection" msgid_plural "Delete IPsec Site Connections" msgstr[0] "IPsec サイト間接続の削除" msgid "Delete VPN Service" msgid_plural "Delete VPN Services" msgstr[0] "VPN サービスの削除" msgid "Description" msgstr "説明" msgid "Description:" msgstr "説明:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Down" msgstr "停止中" msgid "Edit Connection" msgstr "接続の編集" msgid "Edit Endpoint Group" msgstr "エンドポイントグループの編集" msgid "Edit IKE Policy" msgstr "IKE ポリシーの編集" msgid "Edit IPsec Policy" msgstr "IPsec ポリシーの編集" msgid "Edit IPsec Site Connection" msgstr "IPsec サイト間接続の編集" msgid "Edit IPsec policy" msgstr "IPsec ポリシーの編集" msgid "Edit IPsec site connection" msgstr "IPsec サイト間接続の編集" msgid "Edit VPN Service" msgstr "VPN サービスの編集" msgid "Enable Admin State" msgstr "管理状態有効" msgid "Encapsulation mode" msgstr "カプセル化モード" msgid "Encryption algorithm" msgstr "暗号化アルゴリズム" msgid "Encryption algorithm =" msgstr "暗号化アルゴリズム =" msgid "Endpoint Groups" msgstr "エンドポイントグループ" msgid "Endpoint Groups Details" msgstr "エンドポイントグループの詳細" #, python-format msgid "Endpoint group %s was successfully updated." msgstr "エンドポイントグループ %s が正常に更新されました。" msgid "Endpoint group for local subnet(s)" msgstr "ローカルサブネットのエンドポイントグループ" msgid "Endpoint group for remote peer CIDR(s)" msgstr "接続相手の CIDR のエンドポイントグループ" msgid "Endpoints" msgstr "エンドポイント" msgid "Endpoints =" msgstr "エンドポイント =" msgid "Equal to or greater than 60" msgstr "60 以上" msgid "" "Equal to or greater than 68 if the local subnet is IPv4. Equal to or greater " "than 1280 if the local subnet is IPv6." msgstr "ローカルサブネットが IPv4 の場合は 68 以上、IPv6 の場合は 1280 以上。" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Error" msgstr "エラー" msgid "External System CIDRs" msgstr "外部システムの CIDR" msgid "External System Subnets" msgstr "外部システムのサブネット" #, python-format msgid "Failed to update IKE policy %s" msgstr "IKE ポリシー %s を更新できません。" #, python-format msgid "Failed to update IPsec policy %s" msgstr "IPsec ポリシー %s を更新できません。" #, python-format msgid "Failed to update IPsec site connection %s" msgstr "IPsec サイト間接続 %s を更新できません。" #, python-format msgid "Failed to update VPN service %s" msgstr "VPN サービス %s を更新できません。" #, python-format msgid "Failed to update endpoint group %s" msgstr "エンドポイントグループ %s を更新できません。" msgid "" "Fields in this tab are optional. You can configure the detail of IPsec site " "connection created." msgstr "" "このタブのフィールドは任意項目です。作成する IPsec サイト間接続の詳細設定がで" "きます。" msgid "ID" msgstr "ID" msgid "IKE Phase 1 negotiation mode" msgstr "IKE フェーズ 1 のメッセージ交換モード" msgid "IKE Phase1 negotiation mode" msgstr "IKE フェーズ 1 のメッセージ交換モード" msgid "IKE Policies" msgstr "IKE ポリシー" msgid "IKE Policy" msgstr "IKE ポリシー" msgid "IKE Policy =" msgstr "IKE ポリシー =" msgid "IKE Policy Details" msgstr "IKE ポリシーの詳細" msgid "IKE Policy ID =" msgstr "IKE ポリシー ID =" #, python-format msgid "IKE policy %s was successfully updated." msgstr "IKE ポリシー %s が正常に更新されました。" msgid "IKE policy associated with this connection" msgstr "この接続に関連付ける IKE ポリシー" msgid "IKE version" msgstr "IKE バージョン" msgid "IPsec Policies" msgstr "IPsec ポリシー" msgid "IPsec Policy" msgstr "IPsec ポリシー" msgid "IPsec Policy =" msgstr "IPsec ポリシー =" msgid "IPsec Policy Details" msgstr "IPsec ポリシーの詳細" msgid "IPsec Policy ID =" msgstr "IPsec ポリシー ID =" msgid "IPsec Site Connection Details" msgstr "IPsec サイト間接続の詳細" msgid "IPsec Site Connections" msgstr "IPsec サイト間接続" msgid "IPsec connection validation requires that local endpoints are subnets" msgstr "ローカルのエンドポイントグループはサブネットでなければいけません。" msgid "" "IPsec connection validation requires that local endpoints are subnets, and " "peer endpoints are CIDRs." msgstr "" "ローカルのエンドポイントグループはサブネットで、ピアエンドポイントは CIDR で" "なければいけません。" msgid "IPsec connection validation requires that peer endpoints are CIDRs" msgstr "対向のエンドポイントグループは CIDR でなければいけません。" #, python-format msgid "IPsec policy %s was successfully updated." msgstr "IPsec ポリシー %s が正常に更新されました。" msgid "IPsec policy associated with this connection" msgstr "この接続に関連付ける IPsec ポリシー" #, python-format msgid "IPsec site connection %s was successfully updated." msgstr "IPsec サイト間接続 %s が正常に更新されました。" msgid "IPv4" msgstr "IPv4" msgid "IPv4:" msgstr "IPv4:" msgid "IPv6" msgstr "IPv6" msgid "IPv6:" msgstr "IPv6:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Inactive" msgstr "非稼働" msgid "Initiator state" msgstr "イニシエーターモード" msgid "" "Life time consists of units and value. Units in 'seconds' and the default " "value is 3600." msgstr "" "ライフタイムは単位と値で構成されます。単位は「秒」で、デフォルト値は 3600 で" "す。" msgid "Lifetime" msgstr "ライフタイム" msgid "Lifetime Units" msgstr "ライフタイムの単位" msgid "Lifetime Value" msgstr "ライフタイムの値" msgid "Lifetime units" msgstr "ライフタイムの単位" msgid "Lifetime units for IKE keys" msgstr "IKE 鍵のライフタイムの単位" msgid "Lifetime value" msgstr "ライフタイムの値" msgid "Lifetime value for IKE keys" msgstr "IKE 鍵のライフタイムの値" msgid "Lifetime value for IKE keys " msgstr "IKE 鍵のライフタイムの値" msgid "Local Endpoint Group" msgstr "ローカルのエンドポイントグループ" msgid "Local Endpoint Group(s)" msgstr "ローカルのエンドポイントグループ" msgid "Local Side Public IPs" msgstr "ローカル側のパブリック IP" msgid "Local System Subnets" msgstr "ローカルシステムのサブネット" msgid "Local subnet(s). This field is valid if type is Subnet" msgstr "" "ローカル側のサブネット。このフィールドが有効なのは、種別がサブネットの場合の" "みです。" msgid "" "Local subnets which the new IPsec connection is connected to. Required if no " "subnet is specified in a VPN service selected." msgstr "" "新規の IPsec 接続に接続されるローカルサブネット。 VPN サービスでサブネットが" "指定されていない場合に必要です。" msgid "MTU" msgstr "MTU" msgid "Maximum Transmission Unit size for the connection" msgstr "この接続の MTU (最大転送単位) の大きさ" msgid "Name" msgstr "名前" msgid "Name =" msgstr "名前 =" msgid "" "Note: The recommended way to specify local subnets is to use endpoint groups " "in IPsec site connection. It is deprecated to specify subnet in VPN service. " "For a new VPN service or IPsec site connection, using endpoint group is " "recommended." msgstr "" "注意: ローカルサブネットを指定する推奨の方法は、 IPsec サイト間接続でエンドポ" "イントグループを使用する方法です。 VPN サービスでサブネットを指定する方法は廃" "止予定です。新規の VPN サービスや IPsec サイト間接続では、エンドポイントグ" "ループを使うことをお勧めします。" msgid "Optional Parameters" msgstr "詳細パラメーター" msgid "Optional. No need to be specified when you use endpoint groups." msgstr "" "任意。エンドポイントグループを使用している場合には指定する必要はありません。" msgid "PFS" msgstr "PFS" msgid "PFS =" msgstr "PFS =" msgid "Peer Endpoint Group" msgstr "対向のエンドポイントグループ" msgid "Peer Endpoint Group(s)" msgstr "対向のエンドポイントグループ" msgid "Peer gateway public IPv4/IPv6 Address or FQDN" msgstr "接続相手のゲートウェイのパブリック IPv4/IPv6 アドレスまたは FQDN" msgid "Peer gateway public IPv4/IPv6 address or FQDN for the VPN Connection" msgstr "" "VPN 接続の接続相手のゲートウェイのパブリック IPv4/IPv6 アドレスまたは FQDN" msgid "Peer router identity for authentication (Peer ID)" msgstr "接続相手のルーターの認証用識別子 (Peer ID)" msgid "" "Peer router identity for authentication. Can be IPv4/IPv6 address, e-mail, " "key ID, or FQDN" msgstr "" "接続相手のルーターの認証用識別子。IPv4/IPv6 アドレス、メールアドレス、キー " "ID、FQDN が使用できます。" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Create" msgstr "作成待ち" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Delete" msgstr "削除待ち" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Update" msgstr "更新待ち" msgid "Perfect Forward Secrecy" msgstr "Perfect Forward Secrecy" msgid "Pre-Shared Key (PSK) string" msgstr "事前共有鍵 (Pre-Shared-Key; PSK)" msgid "Project ID" msgstr "プロジェクト ID" msgid "Remote peer CIDR(s) connected to the new IPsec connection." msgstr "新規の IPsec 接続に接続する対向の CIDR" msgid "Remote peer subnet" msgstr "接続相手のサブネット" msgid "Remote peer subnet(s)" msgstr "接続相手のサブネット" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "接続相手のサブネットアドレスを CIDR 形式で指定します。複数指定する場合はコン" "マで区切ります (例: 20.1.0.0/24, 21.1.0.0/24)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24). This field is valid if " "type is CIDR" msgstr "" "接続相手のサブネットアドレスを CIDR 形式で指定します。複数指定する場合はコン" "マで区切ります (例: 20.1.0.0/24, 21.1.0.0/24)。このフィールドが有効なのは、種" "別が CIDR の場合のみです。" msgid "Route mode" msgstr "ルーティングモード" msgid "Router" msgstr "ルーター" msgid "Router =" msgstr "ルーター =" msgid "Router ID =" msgstr "ルーター ID =" msgid "Save Changes" msgstr "変更の保存" msgid "Scheduled deletion of IKE policy" msgid_plural "Scheduled deletion of IKE policies" msgstr[0] "IKE ポリシーの削除を予約しました" msgid "Scheduled deletion of IPsec policy" msgid_plural "Scheduled deletion of IPsec policies" msgstr[0] "IPsec ポリシーの削除を予約しました" msgid "Scheduled deletion of IPsec site connection" msgid_plural "Scheduled deletion of IPsec site connections" msgstr[0] "IPsec サイト間接続の削除を予約しました" msgid "Scheduled deletion of VPN service" msgid_plural "Scheduled deletion of VPN services" msgstr[0] "VPN サービスの削除を予約しました" msgid "Scheduled deletion of endpoint group" msgid_plural "Scheduled deletion of endpoint groups" msgstr[0] "エンドポイントグループの削除を予約しました" msgid "Select IKE policy" msgstr "IKE ポリシーを選択してください" msgid "Select IPsec Policy" msgstr "IPsec ポリシーを選択してください" msgid "Select VPN service" msgstr "VPN サービスを選択してください" msgid "Select a Router" msgstr "ルーターを選択してください" msgid "Select a Subnet" msgstr "サブネットを選択してください" msgid "Select local endpoint group" msgstr "ローカルのエンドポイントグループを選択してください" msgid "Select peer endpoint group" msgstr "対向のエンドポイントグループを選択してください" msgid "" "Specify a name, description, router, and subnet (optional) for the VPN " "service." msgstr "VPN サービスの名前、説明、ルーター、サブネット (省略可) を指定します。" msgid "Status" msgstr "ステータス" msgid "Status =" msgstr "ステータス =" msgid "Subnet" msgstr "サブネット" msgid "Subnet (for local systems)" msgstr "サブネット (ローカルシステム用)" msgid "Subnet =" msgstr "サブネット =" msgid "Subnet ID =" msgstr "サブネット ID =" msgid "" "The VPN service is attached to a router and references to endpoint group or " "a single subnet to push to a remote site." msgstr "" "VPN サービスはルーターに接続されます。また、(エンドポイントグループを使用しな" "い場合) リモートサイトと接続される 1 個のサブネットに関連付けます。" msgid "The pre-defined key string between the two peers of the VPN connection" msgstr "VPN 接続の両端間で共有される事前定義鍵" msgid "" "The router and admin state fields require to be enabled. All others are " "optional." msgstr "ルーター、管理状態のフィールドは必須です。他の項目は任意です。" msgid "" "The state of IPsec site connection to start in. If disabled (not checked), " "IPsec site connection does not forward packets." msgstr "" "IPsec サイト間接続の初期状態。無効の場合 (チェックが入っていない場合)、IPsec " "サイト間接続はパケット転送を行いません。" msgid "" "The state of VPN service to start in. If disabled (not checked), VPN service " "does not forward packets." msgstr "" "VPN サービスの初期状態。無効の場合 (チェックが入っていない場合)、VPN サービス" "はパケット転送を行いません。" msgid "The type of IPsec tunnel (tunnel/transport) to be used." msgstr "使用する IPsec トンネル種別です。tunnel、transport を指定できます。" msgid "The type of version (v1/v2) that needs to be filtered." msgstr "使用する IKE バージョンの種類です。v1、v2 を指定できます。" msgid "Transform Protocol" msgstr "トランスフォームプロトコル" msgid "Type" msgstr "種別" msgid "Type =" msgstr "種別 =" #, python-format msgid "Unable to add IKE policy \"%s\"." msgstr "IKE ポリシー \"%s\" を追加できません。" #, python-format msgid "Unable to add IPsec policy \"%s\"." msgstr "IPsec ポリシー \"%s\" を追加できません。" #, python-format msgid "Unable to add IPsec site connection \"%s\"." msgstr "IPsec サイト間接続 \"%s\" を追加できません。" #, python-format msgid "Unable to add VPN service \"%s\"." msgstr "VPN サービス \"%s\" を追加できません。" #, python-format msgid "Unable to add endpoint group \"%s\"." msgstr "エンドポイントグループ \"%s\" を追加できません。" msgid "Unable to retrieve IKE policies list." msgstr "IKE ポリシーの一覧を取得できません。" msgid "Unable to retrieve IKE policy details." msgstr "IKE ポリシーの詳細を取得できません。" msgid "Unable to retrieve IPsec policies list." msgstr "IPsec ポリシーの一覧を取得できません。" msgid "Unable to retrieve IPsec policy details." msgstr "IPsec ポリシーの詳細を取得できません。" msgid "Unable to retrieve IPsec policy list." msgstr "IPsec ポリシーの一覧を取得できません。" msgid "Unable to retrieve IPsec site connection details." msgstr "IPsec サイト間接続の詳細を取得できません。" msgid "Unable to retrieve IPsec site connections list." msgstr "IPsec サイト間接続の一覧を取得できません。" msgid "Unable to retrieve VPN service details." msgstr "VPN サービスの詳細を取得できません。" msgid "Unable to retrieve VPN services list." msgstr "VPN サービスの一覧を取得できません。" msgid "Unable to retrieve endpoint group details." msgstr "エンドポイントグループの詳細を取得できません。" msgid "Unable to retrieve endpoint group list." msgstr "エンドポイントグループの一覧を取得できません。" msgid "Unable to retrieve networks list." msgstr "ネットワーク一覧を取得できません。" msgid "Unable to retrieve routers list." msgstr "ルーターの一覧を取得できません。" msgid "VPN" msgstr "VPN" msgid "VPN Connections" msgstr "VPN 接続" msgid "VPN Service" msgstr "VPN サービス" msgid "VPN Service =" msgstr "VPN サービス =" msgid "VPN Service Details" msgstr "VPN サービスの詳細" msgid "VPN Service ID =" msgstr "VPN サービス ID =" msgid "VPN Services" msgstr "VPN サービス" #, python-format msgid "VPN service %s was successfully updated." msgstr "VPN サービス %s が正常に更新されました。" msgid "VPN service associated with this connection" msgstr "この接続に関連付ける VPN サービス" msgid "Valid integer greater than the DPD interval" msgstr "Dead Peer 検出間隔よりも大きい有効な整数値" msgid "Valid integer lesser than DPD timeout" msgstr "Dead Peer 検出タイムアウトよりも小さい有効な整数値" msgid "Valid integer lesser than the DPD timeout" msgstr "Dead Peer 検出タイムアウトよりも小さい有効な整数値" msgid "Virtual Private Network" msgstr "仮想プライベートネットワーク" msgid "You may update IKE policy details here." msgstr "IKE ポリシーの詳細をここから更新できます。" msgid "You may update IPsec policy details here." msgstr "IPsec ポリシーの詳細をここから更新できます。" msgid "You may update IPsec site connection details here." msgstr "IPsec サイト間接続の詳細をここから更新できます。" msgid "You may update VPN service details here." msgstr "VPN サービスの詳細をここから更新できます。" msgid "You may update endpoint group details here." msgstr "エンドポイントグループの詳細をここから更新できます。" msgid "bi-directional" msgstr "bi-directional" msgid "clear" msgstr "clear" msgid "disabled" msgstr "disabled" msgid "down" msgstr "down" msgid "group14" msgstr "group14" msgid "group2" msgstr "group2" msgid "group5" msgstr "group5" msgid "hold" msgstr "hold" msgid "response-only" msgstr "response-only" msgid "restart" msgstr "restart" msgid "restart-by-peer" msgstr "restart-by-peer" msgid "seconds" msgstr "秒" msgid "transport" msgstr "トランスポート" msgid "tunnel" msgstr "トンネル" msgid "up" msgstr "up" msgid "v1" msgstr "v1" msgid "v2" msgstr "v2" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3490548 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/ko_KR/0000775000175000017500000000000015257164617025023 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3730564 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/ko_KR/LC_MESSAGES/0000775000175000017500000000000015257164617026610 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2754283 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/ko_KR/LC_MESSAGES/django.po0000664000175000017500000005574615257164532030427 0ustar00zuulzuul# Ian Y. Choi , 2015. #zanata # Andreas Jaeger , 2016. #zanata # Ian Y. Choi , 2016. #zanata # Sungjin Kang , 2016. #zanata # skywalker54 , 2016. #zanata # ByungYeol Woo , 2017. #zanata # Ian Y. Choi , 2017. #zanata # Sungjin Kang , 2017. #zanata # bryan tak , 2017. #zanata # johjuhyun , 2017. #zanata # minwook-shin , 2017. #zanata # ByungYeol Woo , 2018. #zanata # Ian Y. Choi , 2018. #zanata # Sungjin Kang , 2018. #zanata # Wonil Choi , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: neutron-vpnaas-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2026-05-08 19:58+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-08-28 11:02+0000\n" "Last-Translator: ByungYeol Woo \n" "Language-Team: Korean (South Korea)\n" "Language: ko_KR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "" "(Deprecated) Remote peer subnet(s) address(es) with mask(s) in CIDR format " "separated with commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "(지원종료됨) 필요할 경우 쉼표로 구별된 CIDR 형식의 마스크가 있는 원격 피어 서" "브넷 주소 (예: 20.1.0.0/24, 21.1.0.0/24)" msgid "-" msgstr "-" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Active" msgstr "활성" msgid "Add" msgstr "추가" msgid "Add Endpoint Group" msgstr "엔드포인트 그룹 추가" msgid "Add IKE Policy" msgstr "IKE 정책 추가" msgid "Add IPsec Policy" msgstr "IPsec 정책 추가" msgid "Add IPsec Site Connection" msgstr "IPsec 사이트 연결 추가" msgid "Add New Endpoint Groups" msgstr "새 엔드포인트 그룹 추가" msgid "Add New IKE Policy" msgstr "새로운 IKE 정책 추가" msgid "Add New IPsec Policy" msgstr "새로운 IPsec 정책 추가" msgid "Add New IPsec Site Connection" msgstr "새로운 IPsec 사이트 연결 추가" msgid "Add New VPN Service" msgstr "새로운 VPN 서비스 추가" msgid "Add VPN Service" msgstr "VPN 서비스 추가" #, python-format msgid "Added IKE policy \"%s\"." msgstr "IKE 정책 \"%s\"를 추가하였습니다." #, python-format msgid "Added IPsec policy \"%s\"." msgstr "IPsec 정책 \"%s\"를 추가하였습니다." #, python-format msgid "Added IPsec site connection \"%s\"." msgstr "IPsec 사이트 연결 \"%s\"를 추가하였습니다." #, python-format msgid "Added VPN service \"%s\"." msgstr "다음 VPN 서비스가 추가되었습니다. \"%s\"" #, python-format msgid "Added endpoint group \"%s\"." msgstr "엔드포인트 그룹 \"%s\"를 추가하였습니다." msgid "Admin State" msgstr "관리자 상태" msgid "Admin State is enabled by default." msgstr "기본적으로 관리자 상태는 활성화 상태입니다." msgid "All fields are optional." msgstr "모든 필드는 선택 항목입니다." msgid "An IKE policy is an association of the following attributes:" msgstr "IKE 정책은 다음과 같은 속성이 있습니다:" msgid "An IPsec policy is an association of the following attributes" msgstr "IPsec 정책은 다음과 같은 속성이 있습니다." msgid "Authorization algorithm" msgstr "인증 알고리즘" msgid "Authorization algorithm =" msgstr "인증 알고리즘=" msgid "Authorization mode" msgstr "인증 모드" msgid "CIDR (for external systems)" msgstr "CIDR (외부 시스템용)" msgid "Create IKE policy for current project." msgstr "현재 프로젝트에대한 IKE 정책을 생성합니다." msgid "Create IPsec policy for current project." msgstr "현재 프로젝트의 IPsec 정책을 생성합니다." msgid "" "Create IPsec site connection for current project. Assign a name and " "description for the IPsec site connection. All fields in this tab are " "required." msgstr "" "현재 프로젝트에 IPsec 사이트 연결을 생성합니다. 해당 IPsec 사이트 연결에 대" "한 이름과 설명을 입력하십시오. 이 탭의 모든 필드는 필수항목입니다." msgid "Create VPN service for current project." msgstr "현재 프로젝트의 VPN 서비스를 생성합니다." msgid "Create endpoint group for current project." msgstr "현재 프로젝트에대한 엔드포인트 그룹을 생성합니다." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Created" msgstr "생성됨" msgid "DPD Timeout must be greater than DPD Interval" msgstr "DPD 타임아웃은 DPD Interval보다 커야 합니다." msgid "Dead peer detection action" msgstr "죽은 피어 감지 동작" msgid "Dead peer detection actions" msgstr "죽은 피어 감지 동작" msgid "Dead peer detection interval" msgstr "죽은 피어 감지 간격" msgid "Dead peer detection timeout" msgstr "죽은 피어 감지 타임아웃" msgid "Delete Endpoint Group" msgid_plural "Delete Endpoint Groups" msgstr[0] "엔드포인트 그룹 삭제" msgid "Delete IKE Policy" msgid_plural "Delete IKE Policies" msgstr[0] "IKE 정책 삭제" msgid "Delete IPsec Policy" msgid_plural "Delete IPsec Policies" msgstr[0] "IPsec 정책 삭제" msgid "Delete IPsec Site Connection" msgid_plural "Delete IPsec Site Connections" msgstr[0] "IPsec 사이트 연결 삭제" msgid "Delete VPN Service" msgid_plural "Delete VPN Services" msgstr[0] "VPN 서비스 삭제" msgid "Description" msgstr "설명" msgid "Description:" msgstr "설명:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Down" msgstr "Down" msgid "Edit Connection" msgstr "연결 편집" msgid "Edit Endpoint Group" msgstr "엔드포인트 그룹 편집" msgid "Edit IKE Policy" msgstr "IKE 정책 편집" msgid "Edit IPsec Policy" msgstr "IPsec 정책 편집" msgid "Edit IPsec Site Connection" msgstr "IPsec 사이트 접속 편집" msgid "Edit IPsec policy" msgstr "IPsec 정책 편집" msgid "Edit IPsec site connection" msgstr "IPsec 사이트 접속 편집" msgid "Edit VPN Service" msgstr "VPN 서비스 편집" msgid "Enable Admin State" msgstr "관리 상태 활성화" msgid "Encapsulation mode" msgstr "캡슐화 모드" msgid "Encryption algorithm" msgstr "암호화 알고리즘" msgid "Encryption algorithm =" msgstr "암호화 알고리즘=" msgid "Endpoint Groups" msgstr "엔드포인트 그룹" msgid "Endpoint Groups Details" msgstr "엔드포인트 그룹 세부 정보" #, python-format msgid "Endpoint group %s was successfully updated." msgstr "엔드포인트 그룹 %s를 성공적으로 업데이트 하였습니다." msgid "Endpoint group for local subnet(s)" msgstr "로컬 서브넷용 엔드포인트 그룹" msgid "Endpoint group for remote peer CIDR(s)" msgstr "원격 피어 CIDR용 엔드포인트 그룹" msgid "Endpoints" msgstr "Endpoints" msgid "Endpoints =" msgstr "엔드포인트=" msgid "Equal to or greater than 60" msgstr "60이상" msgid "" "Equal to or greater than 68 if the local subnet is IPv4. Equal to or greater " "than 1280 if the local subnet is IPv6." msgstr "" "로컬 서브넷이 IPv4이면 68이상입니다. 그리고 로컬 서브넷이 IPv6라면 1280이상입" "니다." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Error" msgstr "오류" msgid "External System CIDRs" msgstr "외부 시스템 CIDR" msgid "External System Subnets" msgstr "외부 시스템 서브넷" #, python-format msgid "Failed to update IKE policy %s" msgstr "IKE 정책 %s를 업데이트하지 못 했습니다." #, python-format msgid "Failed to update IPsec policy %s" msgstr "IPsec 정책 %s를 업데이트 하지 못하였습니다" #, python-format msgid "Failed to update IPsec site connection %s" msgstr "IPsec 사이트 연결 %s를 업데이트 하지 못하였습니다." #, python-format msgid "Failed to update VPN service %s" msgstr "VPN 서비스 %s를 업데이트 하는데 실패했습니다." #, python-format msgid "Failed to update endpoint group %s" msgstr "엔드포인트 그룹 %s 업데이트가 실패했습니다." msgid "" "Fields in this tab are optional. You can configure the detail of IPsec site " "connection created." msgstr "" "이 탭의 항목은 선택 사항입니다. 생성된 IPsec 사이트 연결에 대한 세부 사항을 " "구성할 수 있습니다." msgid "ID" msgstr "ID" msgid "IKE Phase 1 negotiation mode" msgstr "IKE Phase 1 협상 모드" msgid "IKE Phase1 negotiation mode" msgstr "IKE Phase1 협상 모드" msgid "IKE Policies" msgstr "IKE 정책" msgid "IKE Policy" msgstr "IKE 정책" msgid "IKE Policy =" msgstr "IKE 정책=" msgid "IKE Policy Details" msgstr "IKE 정책 세부 정보" msgid "IKE Policy ID =" msgstr "IKE 정책 ID=" #, python-format msgid "IKE policy %s was successfully updated." msgstr "IKE 정책 %s를 성공적으로 업데이트 했습니다." msgid "IKE policy associated with this connection" msgstr "이 연결에 적용할 IKE 정책" msgid "IKE version" msgstr "IKE 버전" msgid "IPsec Policies" msgstr "IPsec 정책" msgid "IPsec Policy" msgstr "IPsec 정책" msgid "IPsec Policy =" msgstr "IPsec 정책=" msgid "IPsec Policy Details" msgstr "IPsec 정책 세부 정보" msgid "IPsec Policy ID =" msgstr "IPsec 정책 ID=" msgid "IPsec Site Connection Details" msgstr "IPsec 사이트 연결 세부 정보" msgid "IPsec Site Connections" msgstr "IPsec 사이트 연결" msgid "IPsec connection validation requires that local endpoints are subnets" msgstr "IPsec 연결 유효성을 위해선 로컬 엔드포인트가 서브넷이어야 합니다." msgid "" "IPsec connection validation requires that local endpoints are subnets, and " "peer endpoints are CIDRs." msgstr "" "IPsec 연결 유효성을 위해선 로컬 엔드포인트가 서브넷이어야 하고 상대 엔드포인" "트는 CIDR이어야 합니다." msgid "IPsec connection validation requires that peer endpoints are CIDRs" msgstr "IPsec 연결 유효성을 위해선 상대 엔드포인트가 CIDR이어야 합니다." #, python-format msgid "IPsec policy %s was successfully updated." msgstr "IPsec 정책 %s를 성공적으로 업데이트 했습니다." msgid "IPsec policy associated with this connection" msgstr "이 연결에 적용할 IPsec 정책" #, python-format msgid "IPsec site connection %s was successfully updated." msgstr "IPsec 사이트 연결 %s를 성공적으로 업데이트하였습니다." msgid "IPv4" msgstr "IPv4" msgid "IPv4:" msgstr "IPv4:" msgid "IPv6" msgstr "IPv6" msgid "IPv6:" msgstr "IPv6:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Inactive" msgstr "비활성" msgid "Initiator state" msgstr "Initiator 상태" msgid "" "Life time consists of units and value. Units in 'seconds' and the default " "value is 3600." msgstr "" "수명(lifetime)은 단위와 값으로 구성됩니다. '초(seconds)' 단위이며 기본값은 " "3600입니다." msgid "Lifetime" msgstr "수명(Lifetime)" msgid "Lifetime Units" msgstr "수명 단위" msgid "Lifetime Value" msgstr "수명 값" msgid "Lifetime units" msgstr "Lifetime units" msgid "Lifetime units for IKE keys" msgstr "IKE 키의 수명 단위" msgid "Lifetime value" msgstr "Lifetime value" msgid "Lifetime value for IKE keys" msgstr "IKE 키의 수명 값" msgid "Lifetime value for IKE keys " msgstr "IKE 키의 수명 값" msgid "Local Endpoint Group" msgstr "로컬 엔드포인트 그룹" msgid "Local Endpoint Group(s)" msgstr "로컬 엔드포인트 그룹" msgid "Local Side Public IPs" msgstr "로컬 사이트 공용 IP" msgid "Local System Subnets" msgstr "로컬 시스템 서브넷" msgid "Local subnet(s). This field is valid if type is Subnet" msgstr "로컬 서브넷. 이 항목은 유형이 서브넷인 경우 유효합니다" msgid "" "Local subnets which the new IPsec connection is connected to. Required if no " "subnet is specified in a VPN service selected." msgstr "" "새로운 IPsec 연결이 연결된 로컬 서브넷. VPN 서비스에 서브넷이 지정되지 않을 " "경우 필요합니다." msgid "MTU" msgstr "MTU" msgid "Maximum Transmission Unit size for the connection" msgstr "연결에 대한 최대 전달 단위 크기" msgid "Name" msgstr "이름" msgid "Name =" msgstr "Name =" msgid "" "Note: The recommended way to specify local subnets is to use endpoint groups " "in IPsec site connection. It is deprecated to specify subnet in VPN service. " "For a new VPN service or IPsec site connection, using endpoint group is " "recommended." msgstr "" "참고: 로컬 서브넷을 지정하는 권장 방법은 IPsec 사이트 연결에서 엔드포인트 그" "룹을 이용하는 것입니다. VPN 서비스에서 서브넷을 지정하는 것은 지원종료되었습" "니다. 새로운 VPN 서비스나 IPsec 사이트 연결에는 엔드포인트 그룹을 사용하는 것" "이 권장됩니다." msgid "Optional Parameters" msgstr "옵션 매개 변수" msgid "Optional. No need to be specified when you use endpoint groups." msgstr "선택사항. 엔드포인트 그룹을 사용할 땐 지정할 필요가 없습니다." msgid "PFS" msgstr "PFS" msgid "PFS =" msgstr "PFS=" msgid "Peer Endpoint Group" msgstr "상대 엔드포인트 그룹" msgid "Peer Endpoint Group(s)" msgstr "상대 엔드포인트 그룹" msgid "Peer gateway public IPv4/IPv6 Address or FQDN" msgstr "피어 게이트웨이 공용 IPv4/IPv6 주소나 FQDN" msgid "Peer gateway public IPv4/IPv6 address or FQDN for the VPN Connection" msgstr "VPN에 연결을 위한 피어 게이트웨이 공용 IPv4/IPv6 주소나 FQDN" msgid "Peer router identity for authentication (Peer ID)" msgstr "신원 인증을 위한 피어 라우터 ID (피어 ID)" msgid "" "Peer router identity for authentication. Can be IPv4/IPv6 address, e-mail, " "key ID, or FQDN" msgstr "" "신원 인증을 위한 피어 라우터 ID. IPv4/IPv6 주소, e-mail, 키 ID, FQDN으로도 가" "능합니다." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Create" msgstr "생성 대기중" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Delete" msgstr "삭제 대기중" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Update" msgstr "업데이트 대기중" msgid "Perfect Forward Secrecy" msgstr "완벽한 Forward 보안" msgid "Pre-Shared Key (PSK) string" msgstr "사전 공유키 (PSK) 문자" msgid "Project ID" msgstr "프로젝트 ID" msgid "Remote peer CIDR(s) connected to the new IPsec connection." msgstr "새로운 IPsec 연결로 연결된 원격 피어 CIDR." msgid "Remote peer subnet" msgstr "원격 피어 서브넷" msgid "Remote peer subnet(s)" msgstr "원격 피어 서브넷" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "필요한 경우, CIDR 포멧으로 마스크와 원격 비어 서브넷 주소를 쉼표로 구분합니" "다. (예: 20.1.0.0/24, 21.1.0.0/24)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24). This field is valid if " "type is CIDR" msgstr "" "필요한 경우, 쉼표로 나눈 CIDR 포맷 마스크로 구성된 원격 상대방 서브넷 주소 " "(예: 20.1.0.0/24, 21.1.0.0/24). 이 필드는 타입이 CIDR일 경우에 유효합니다." msgid "Route mode" msgstr "라우트 모드" msgid "Router" msgstr "라우터" msgid "Router =" msgstr "라우터=" msgid "Router ID =" msgstr "라우터 ID =" msgid "Save Changes" msgstr "변경사항 저장" msgid "Scheduled deletion of IKE policy" msgid_plural "Scheduled deletion of IKE policies" msgstr[0] "IKE 정책 예약 삭제" msgid "Scheduled deletion of IPsec policy" msgid_plural "Scheduled deletion of IPsec policies" msgstr[0] "IPsec 정책 예약 삭제" msgid "Scheduled deletion of IPsec site connection" msgid_plural "Scheduled deletion of IPsec site connections" msgstr[0] "IPsec 사이트 연결 예약 삭제" msgid "Scheduled deletion of VPN service" msgid_plural "Scheduled deletion of VPN services" msgstr[0] "VPN 서비스 예약 삭제" msgid "Scheduled deletion of endpoint group" msgid_plural "Scheduled deletion of endpoint groups" msgstr[0] "엔드포인트 그룹의 예약 삭제" msgid "Select IKE policy" msgstr "IKE 정책 선택" msgid "Select IPsec Policy" msgstr "IPsec 정책 선택" msgid "Select VPN service" msgstr "VPN 서비스 선택" msgid "Select a Router" msgstr "라우터 선택" msgid "Select a Subnet" msgstr "서브넷 선택" msgid "Select local endpoint group" msgstr "로컬 엔드포인트 그룹 선택" msgid "Select peer endpoint group" msgstr "로컬 엔드포인트 피어 선택" msgid "" "Specify a name, description, router, and subnet (optional) for the VPN " "service." msgstr "VPN 서비스의 이름, 설명, 라우터, 그리고 서브넷을 지정합니다." msgid "Status" msgstr "상태" msgid "Status =" msgstr "상태 = " msgid "Subnet" msgstr "서브넷" msgid "Subnet (for local systems)" msgstr "서브넷 (로컬 시스템용)" msgid "Subnet =" msgstr "서브넷=" msgid "Subnet ID =" msgstr "서브넷 ID=" msgid "" "The VPN service is attached to a router and references to endpoint group or " "a single subnet to push to a remote site." msgstr "" "VPN 서비스는 라우터에 연결되어 있고 원격 사이트로 푸쉬하기 위한 엔드포인트 그" "룹이나 단일 서브넷에 대한 참조입니다." msgid "The pre-defined key string between the two peers of the VPN connection" msgstr "VPN에 연결하는 2개의 피어간에 미리 정의돈 문자열을 사용합니다." msgid "" "The router and admin state fields require to be enabled. All others are " "optional." msgstr "" "라우터, 관리자 상태 필드는 활성화 되어야 합니다. 그 외에는 모두 선택 항목입니" "다." msgid "" "The state of IPsec site connection to start in. If disabled (not checked), " "IPsec site connection does not forward packets." msgstr "" "시작할 IPsec 사이트 연결 상태. 비활성화된 경우 (선택하지 않은 경우), IPsec 사" "이트 연결은 패킷을 전달하지 않습니다." msgid "" "The state of VPN service to start in. If disabled (not checked), VPN service " "does not forward packets." msgstr "" "시작할 VPN 서비스 상태. 비활성화된 경우 (선택하지 않은 경우), VPN 서비스는 패" "킷을 전달하지 않습니다." msgid "The type of IPsec tunnel (tunnel/transport) to be used." msgstr "사용될 IPsec 터널 (터널/전송) 유형입니다." msgid "The type of version (v1/v2) that needs to be filtered." msgstr "필터링이 필요한 버전 유형(v1/v2)입니다." msgid "Transform Protocol" msgstr "변환 프로토콜" msgid "Type" msgstr "타입" msgid "Type =" msgstr "Type =" #, python-format msgid "Unable to add IKE policy \"%s\"." msgstr "IKE 정책 \"%s\"를 추가할 수 없습니다." #, python-format msgid "Unable to add IPsec policy \"%s\"." msgstr "IPsec 정책 \"%s\"를 추가할 수 없습니다." #, python-format msgid "Unable to add IPsec site connection \"%s\"." msgstr "IPsec 사이트 연결 \"%s\"를 추가 할 수 없습니다." #, python-format msgid "Unable to add VPN service \"%s\"." msgstr "다음 VPN 서비스를 추가할 수 없습니다. \"%s\"" #, python-format msgid "Unable to add endpoint group \"%s\"." msgstr "엔드포인트 그룹 \"%s\"를 추가할 수 없습니다." msgid "Unable to retrieve IKE policies list." msgstr "IKE 정책 목록을 가져올 수 없습니다." msgid "Unable to retrieve IKE policy details." msgstr "IKE 정책 세부 정보를 가져올 수 없습니다." msgid "Unable to retrieve IPsec policies list." msgstr "IPsec 정책 목록을 찾지 못 했습니다." msgid "Unable to retrieve IPsec policy details." msgstr "IPsec 정책 세부 정보를 가져올 수 없습니다." msgid "Unable to retrieve IPsec policy list." msgstr "IPsec 정책 목록을 가져올 수 없습니다." msgid "Unable to retrieve IPsec site connection details." msgstr "IPsec 사이트 연결 세부 정보를 가져올 수 없습니다." msgid "Unable to retrieve IPsec site connections list." msgstr "IPsec 사이트 연결 목록을 가져올 수 없습니다." msgid "Unable to retrieve VPN service details." msgstr "VPN 서비스 세부 정보를 가져올 수 없습니다." msgid "Unable to retrieve VPN services list." msgstr "VPN 서비스 목록을 가져올 수 없습니다." msgid "Unable to retrieve endpoint group details." msgstr "엔드포인트 그룹 세부 정보를 가져올 수 없습니다." msgid "Unable to retrieve endpoint group list." msgstr "엔드포인트 그룹 목록을 가져올 수 없습니다." msgid "Unable to retrieve networks list." msgstr "네트워크 목록을 찾지 못 했습니다." msgid "Unable to retrieve routers list." msgstr "라우터 목록을 찾지 못했습니다." msgid "VPN" msgstr "VPN" msgid "VPN Connections" msgstr "VPN 연결" msgid "VPN Service" msgstr "VPN 서비스" msgid "VPN Service =" msgstr "VPN 서비스=" msgid "VPN Service Details" msgstr "VPN 서비스 세부 정보" msgid "VPN Service ID =" msgstr "VPN 서비스 ID=" msgid "VPN Services" msgstr "VPN 서비스" #, python-format msgid "VPN service %s was successfully updated." msgstr "VPN 서비스 %s를 성공적으로 업데이트하였습니다." msgid "VPN service associated with this connection" msgstr "이 연결에 연동할 VPN 서비스 " msgid "Valid integer greater than the DPD interval" msgstr "DPD 간격을 보다 큰 유효한 정수" msgid "Valid integer lesser than DPD timeout" msgstr "DPD 타임아웃보다 적은 유효한 정수" msgid "Valid integer lesser than the DPD timeout" msgstr "DPD 타임아웃보다 작은 유효한 정수" msgid "Virtual Private Network" msgstr "가상 내부 네트워크" msgid "You may update IKE policy details here." msgstr "IKE 정책의 세부 정보를 수정할 수 있습니다." msgid "You may update IPsec policy details here." msgstr "IPsec 정책의 세부 정보를 업데이트 할 수 있습니다." msgid "You may update IPsec site connection details here." msgstr "IPsec 사이트 연결 세부 정보를 업데이트 할 수 있습니다." msgid "You may update VPN service details here." msgstr "VPN 서비스의 세부 정보를 업데이트 할 수 있습니다." msgid "You may update endpoint group details here." msgstr "엔드포인트 그룹 세부 사항을 여기서 업데이트 할 수 있습니다." msgid "bi-directional" msgstr "bi-directional" msgid "clear" msgstr "clear" msgid "disabled" msgstr "disabled" msgid "down" msgstr "down" msgid "group14" msgstr "group14" msgid "group2" msgstr "group2" msgid "group5" msgstr "group5" msgid "hold" msgstr "hold" msgid "response-only" msgstr "response-only" msgid "restart" msgstr "restart" msgid "restart-by-peer" msgstr "restart-by-peer" msgid "seconds" msgstr "초" msgid "transport" msgstr "transport" msgid "tunnel" msgstr "tunnel" msgid "up" msgstr "up" msgid "v1" msgstr "v1" msgid "v2" msgstr "v2" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3490548 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/ru/0000775000175000017500000000000015257164617024444 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3740566 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/ru/LC_MESSAGES/0000775000175000017500000000000015257164617026231 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2774286 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/ru/LC_MESSAGES/django.po0000664000175000017500000010667315257164532030044 0ustar00zuulzuul# Fedor Tarasenko , 2015. #zanata # OpenStack Infra , 2015. #zanata # Aleksey Alekseenko <9118250541@mail.ru>, 2016. #zanata # Alexander , 2016. #zanata # Andrew , 2016. #zanata # Artem , 2016. #zanata # Daisy , 2016. #zanata # Nikita Burtsev , 2016. #zanata # Artem , 2017. #zanata # Ilya Alekseyev , 2017. #zanata # Roman Gorshunov , 2020. #zanata # Dmitriy Chubinidze , 2025. #zanata # Ivan Anfimov , 2025. #zanata # Dmitriy Chubinidze , 2026. #zanata # Ivan Anfimov , 2026. #zanata msgid "" msgstr "" "Project-Id-Version: neutron-vpnaas-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2026-05-08 19:58+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2026-05-11 05:38+0000\n" "Last-Translator: Dmitriy Chubinidze \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 "" "(Deprecated) Remote peer subnet(s) address(es) with mask(s) in CIDR format " "separated with commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "(Устарело) Адреса подсетей удаленных узлов с масками в формате CIDR, " "разделенные запятыми при необходимости (например, 20.1.0.0/24, 21.1.0.0/24)" msgid "-" msgstr "-" msgid "" "1. Hold - ends the connection and waits for the remote side to reconnect. 2. " "Clear - drops the connection and does not try to bring it back. 3. Disabled " "- turns off dead peer detection entirely, so no active checks are sent. 4. " "Restart - starts trying to reconnect as soon as the timeout happens. 5. " "Restart-by-peer - the connection is re-established because the remote peer " "initiated the restart after a timeout or failure." msgstr "" "1. Hold - разрыв соединения и ожидание повторного подключения удаленной " "стороны. 2. Clear - разрыв соединения и отсутствие попыток его восстановить. " "3. Disabled - полное отключение обнаружения неработающих удаленных узлов, " "поэтому активные проверки не отправляются. 4. Restart - начало попыток " "повторного подключения сразу после истечения времени ожидания. 5. Restart-by-" "peer - соединение восстанавливается, поскольку удаленный узел инициировал " "перезапуск после истечения времени ожидания или сбоя." msgid "3DES" msgstr "3DES" msgid "AES-128" msgstr "AES-128" msgid "AES-128-CCM-12" msgstr "AES-128-CCM-12" msgid "AES-128-CCM-16" msgstr "AES-128-CCM-16" msgid "AES-128-CCM-8" msgstr "AES-128-CCM-8" msgid "AES-128-CTR" msgstr "AES-128-CTR" msgid "AES-128-GCM-12" msgstr "AES-128-GCM-12" msgid "AES-128-GCM-16" msgstr "AES-128-GCM-16" msgid "AES-128-GCM-8" msgstr "AES-128-GCM-8" msgid "AES-192" msgstr "AES-192" msgid "AES-192-CCM-12" msgstr "AES-192-CCM-12" msgid "AES-192-CCM-16" msgstr "AES-192-CCM-16" msgid "AES-192-CCM-8" msgstr "AES-192-CCM-8" msgid "AES-192-CTR" msgstr "AES-192-CTR" msgid "AES-192-GCM-12" msgstr "AES-192-GCM-12" msgid "AES-192-GCM-16" msgstr "AES-192-GCM-16" msgid "AES-192-GCM-8" msgstr "AES-192-GCM-8" msgid "AES-256" msgstr "AES-256" msgid "AES-256-CCM-12" msgstr "AES-256-CCM-12" msgid "AES-256-CCM-16" msgstr "AES-256-CCM-16" msgid "AES-256-CCM-8" msgstr "AES-256-CCM-8" msgid "AES-256-CTR" msgstr "AES-256-CTR" msgid "AES-256-GCM-12" msgstr "AES-256-GCM-12" msgid "AES-256-GCM-16" msgstr "AES-256-GCM-16" msgid "AES-256-GCM-8" msgstr "AES-256-GCM-8" msgid "AES-CMAC" msgstr "AES-CMAC" msgid "AES-XCBC" msgstr "AES-XCBC" msgid "AH" msgstr "AH" msgid "AH-ESP" msgstr "AH-ESP" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Active" msgstr "Активен" msgid "Add" msgstr "Добавить" msgid "Add Endpoint Group" msgstr "Добавить группу точки доступа" msgid "Add IKE Policy" msgstr "Добавить IKE политику" msgid "Add IPsec Policy" msgstr "Добавить IPsec политику" msgid "Add IPsec Site Connection" msgstr "Добавить IPsec подключение" msgid "Add New Endpoint Groups" msgstr "Добавить новые группы точки доступа" msgid "Add New IKE Policy" msgstr "Добавить новую IKE политику" msgid "Add New IPsec Policy" msgstr "Добавить новую IPsec политику" msgid "Add New IPsec Site Connection" msgstr "Добавить новое IPsec подключение" msgid "Add New VPN Service" msgstr "Добавить новую VPN службу" msgid "Add VPN Service" msgstr "Добавить VPN службу" #, python-format msgid "Added IKE policy \"%s\"." msgstr "Добавлена IKE политика \"%s\"." #, python-format msgid "Added IPsec policy \"%s\"." msgstr "Добавлена IPsec политика \"%s\"." #, python-format msgid "Added IPsec site connection \"%s\"." msgstr "Добавлено IPsec подключение \"%s\"." #, python-format msgid "Added VPN service \"%s\"." msgstr "Добавлена служба VPN \"%s\"." #, python-format msgid "Added endpoint group \"%s\"." msgstr "Добавлена группа точки доступа \"%s\"." msgid "Admin State" msgstr "Административное состояние" msgid "Admin State is enabled by default." msgstr "Административное состояние включено по умолчанию." msgid "All fields are optional." msgstr "Все поля опциональны." msgid "An IKE policy is an association of the following attributes:" msgstr "Политика IKE представляет собой объединение следующих атрибутов:" msgid "An IPsec policy is an association of the following attributes" msgstr "Политика IPsec это сочетание следующих атрибутов" msgid "Authorization algorithm" msgstr "Алгоритм авторизации" msgid "Authorization algorithm =" msgstr "Алгоритм авторизации =" msgid "Authorization mode" msgstr "Режим авторизации" msgid "CIDR (for external systems)" msgstr "CIDR (для внешних систем)" msgid "Create IKE policy for current project." msgstr "Создать IKE политику для текущего проекта." msgid "Create IPsec policy for current project." msgstr "Создать IPsec политику для текущего проекта." msgid "" "Create IPsec site connection for current project. Assign a name and " "description for the IPsec site connection. All fields in this tab are " "required." msgstr "" "Создать IPsec подключение для текущего проекта. Укажите имя и название для " "IPsec подключения. Все поля на данной вкладке обязательны для заполнения." msgid "Create VPN service for current project." msgstr "Создать VPN службу для текущего проекта." msgid "Create endpoint group for current project." msgstr "Создать группу точки доступа для текущего проекта." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Created" msgstr "Создано" msgid "DPD Timeout must be greater than DPD Interval" msgstr "Время ожидания DPD должно быть больше, чем интервал DPD" msgid "Dead peer detection action" msgstr "Действие при обнаружении недоступного пира" msgid "Dead peer detection actions" msgstr "Действия при обнаружении недоступного пира" msgid "Dead peer detection interval" msgstr "Интервал обнаружения недоступного пира" msgid "Dead peer detection timeout" msgstr "Время ожидания недоступного пира" msgid "" "Defines which side of the connection is responsible for initiating. Bi-" "directional - the tunnel can be established by either endpoint. Response-" "only - waits until the remote peer sends a request, and only then the " "connection is established." msgstr "" "Определяет, какая сторона соединения отвечает за инициирование. Bi-" "directional - туннель может быть установлен любой точкой доступа. Response-" "only - ждёт, пока удаленный узел отправит запрос, и только после этого " "соединение устанавливается." msgid "Delete Endpoint Group" msgid_plural "Delete Endpoint Groups" msgstr[0] "Удалить группу точки доступа" msgstr[1] "Удалить группы точки доступа" msgstr[2] "Удалить группы точки доступа" msgid "Delete IKE Policy" msgid_plural "Delete IKE Policies" msgstr[0] "Удалить политику IKE" msgstr[1] "Удалить политики IKE" msgstr[2] "Удалить политики IKE" msgid "Delete IPsec Policy" msgid_plural "Delete IPsec Policies" msgstr[0] "Удалить политику IPsec" msgstr[1] "Удалить политики IPsec" msgstr[2] "Удалить политики IPsec" msgid "Delete IPsec Site Connection" msgid_plural "Delete IPsec Site Connections" msgstr[0] "Удалить IPsec подключение" msgstr[1] "Удалить IPsec подключения" msgstr[2] "Удалить IPsec подключения" msgid "Delete VPN Service" msgid_plural "Delete VPN Services" msgstr[0] "Удалить службу VPN" msgstr[1] "Удалить службы VPN" msgstr[2] "Удалить службы VPN" msgid "Description" msgstr "Описание" msgid "Description:" msgstr "Описание:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Down" msgstr "Выключен" msgid "ESP" msgstr "ESP" msgid "Edit Connection" msgstr "Изменить подключение" msgid "Edit Endpoint Group" msgstr "Изменить группу точки доступа" msgid "Edit IKE Policy" msgstr "Изменить IKE политику" msgid "Edit IPsec Policy" msgstr "Изменить IPsec политику" msgid "Edit IPsec Site Connection" msgstr "Изменить IPsec подключение" msgid "Edit IPsec policy" msgstr "Изменить IPsec политику" msgid "Edit IPsec site connection" msgstr "Изменить IPsec подключение" msgid "Edit VPN Service" msgstr "Изменить VPN службу" msgid "Enable Admin State" msgstr "Включить административно" msgid "Encapsulation mode" msgstr "Режим инкапсуляции" msgid "Encryption algorithm" msgstr "Алгоритм шифрования" msgid "Encryption algorithm =" msgstr "Алгоритм шифрования =" msgid "Endpoint Groups" msgstr "Группы точки доступа" msgid "Endpoint Groups Details" msgstr "Подробности групп точки доступа" #, python-format msgid "Endpoint group %s was successfully updated." msgstr "Группа точки доступа %s была успешно обновлена." msgid "Endpoint group for local subnet(s)" msgstr "Группа точки доступа для локальных подсетей" msgid "Endpoint group for remote peer CIDR(s)" msgstr "Группа точки доступа для CIDR удалённых подключений" msgid "Endpoints" msgstr "Точки доступа" msgid "Endpoints =" msgstr "Точки доступа =" msgid "Equal to or greater than 60" msgstr "Равен или больше 60" msgid "" "Equal to or greater than 68 if the local subnet is IPv4. Equal to or greater " "than 1280 if the local subnet is IPv6." msgstr "" "Равен или больше 68, если локальная подсеть IPv4. Равен или больше 1280, " "если локальная подсеть IPv6." msgctxt "Current status of an IPsec site connection and VPN service" msgid "Error" msgstr "Ошибка" msgid "External System CIDRs" msgstr "CIDR внешних систем" msgid "External System Subnets" msgstr "Подсети внешних систем" #, python-format msgid "Failed to update IKE policy %s" msgstr "Не удалось обновить IKE политику %s" #, python-format msgid "Failed to update IPsec policy %s" msgstr "Не удалось обновить IPsec политику %s" #, python-format msgid "Failed to update IPsec site connection %s" msgstr "Не удалось обновить подключение IPsec %s" #, python-format msgid "Failed to update VPN service %s" msgstr "Не удалось обновить VPN службу %s" #, python-format msgid "Failed to update endpoint group %s" msgstr "Не удалось обновить группу точки доступа %s" msgid "" "Fields in this tab are optional. You can configure the detail of IPsec site " "connection created." msgstr "" "Поля на этой вкладке необязательны для заполнения. Вы можете настроить " "параметры создаваемого IPsec подключения." msgid "ID" msgstr "ID" msgid "IKE Phase 1 negotiation mode" msgstr "Режим согласования IKE Phase 1" msgid "IKE Phase1 negotiation mode" msgstr "Режим согласования IKE Phase1" msgid "IKE Policies" msgstr "Политики IKE" msgid "IKE Policy" msgstr "Политика IKE" msgid "IKE Policy =" msgstr "Политика IKE =" msgid "IKE Policy Details" msgstr "Подробности IKE политики" msgid "IKE Policy ID =" msgstr "ID политики IKE =" #, python-format msgid "IKE policy %s was successfully updated." msgstr "IKE политика %s была успешно обновлена." msgid "IKE policy associated with this connection" msgstr "Политика IKE для данного подключения" msgid "IKE version" msgstr "Версия IKE" msgid "IPsec Policies" msgstr "Политики IPsec" msgid "IPsec Policy" msgstr "Политика IPsec" msgid "IPsec Policy =" msgstr "Политика IPsec =" msgid "IPsec Policy Details" msgstr "Подробности IPsec политики" msgid "IPsec Policy ID =" msgstr "ID политики IPsec =" msgid "IPsec Site Connection Details" msgstr "Подробности IPsec подключения" msgid "IPsec Site Connections" msgstr "IPsec подключения" msgid "IPsec connection validation requires that local endpoints are subnets" msgstr "" "Проверка IPsec подключения требует, чтобы локальные точки доступа были " "подсетями" msgid "" "IPsec connection validation requires that local endpoints are subnets, and " "peer endpoints are CIDRs." msgstr "" "Проверка IPsec подключения требует, чтобы локальные точки доступа были " "подсетями, а удалённые точки доступа в формате CIDR." msgid "IPsec connection validation requires that peer endpoints are CIDRs" msgstr "" "Проверка IPsec подключения требует, чтобы удаленные точки доступа были в " "формате CIDR" #, python-format msgid "IPsec policy %s was successfully updated." msgstr "IPsec политика %s была успешно обновлена." msgid "IPsec policy associated with this connection" msgstr "Политика IPsec для данного подключения" #, python-format msgid "IPsec site connection %s was successfully updated." msgstr "Подключение IPsec %s было успешно обновлено." msgid "IPv4" msgstr "IPv4" msgid "IPv4:" msgstr "IPv4:" msgid "IPv6" msgstr "IPv6" msgid "IPv6:" msgstr "IPv6:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Inactive" msgstr "Неактивный" msgid "Initiator state" msgstr "Состояние инициатора" msgid "" "Life time consists of units and value. Units in 'seconds' and the default " "value is 3600." msgstr "" "Срок действия содержит единицы измерения и значение. Единица измерения " "'секунды' и значение по умолчанию 3600." msgid "Lifetime" msgstr "Срок действия" msgid "Lifetime Units" msgstr "Единицы измерения срока действия" msgid "Lifetime Value" msgstr "Значение срока действия" msgid "Lifetime units" msgstr "Единицы срока действия" msgid "Lifetime units for IKE keys" msgstr "Единицы измерения срока действия IKE ключей" msgid "Lifetime value" msgstr "Значение срока действия" msgid "Lifetime value for IKE keys" msgstr "Значение срока действия для IKE ключей" msgid "Lifetime value for IKE keys " msgstr "Значение срока действия для IKE ключей" msgid "Local Endpoint Group" msgstr "Локальная группа точки доступа" msgid "Local Endpoint Group(s)" msgstr "Локальные группы точки доступа" msgid "Local Side Public IPs" msgstr "Локальные публичные IP" msgid "Local System Subnets" msgstr "Подсети локальных систем" msgid "Local subnet(s). This field is valid if type is Subnet" msgstr "Локальные подсети. Это поле корректно, если тип записи подсеть" msgid "" "Local subnets which the new IPsec connection is connected to. Required if no " "subnet is specified in a VPN service selected." msgstr "" "Локальные подсети, к которым подключено новое IPsec подключение. Это " "обязательный параметр, если вы не указали подсеть в выбранной VPN службе." msgid "MTU" msgstr "MTU" msgid "Maximum Transmission Unit size for the connection" msgstr "Размер MTU для подключения" msgid "Name" msgstr "Имя" msgid "Name =" msgstr "Имя =" msgid "" "Note: The recommended way to specify local subnets is to use endpoint groups " "in IPsec site connection. It is deprecated to specify subnet in VPN service. " "For a new VPN service or IPsec site connection, using endpoint group is " "recommended." msgstr "" "Примечание: для указания локальных подсетей рекомендуется использовать " "группы точки доступа в IPsec соединении. Прямое указание подсетей в службе " "VPN является устаревшим. Для новых служб VPN или IPsec подключений " "рекомендуется использовать группу точки доступа." msgid "Optional Parameters" msgstr "Дополнительные параметры" msgid "Optional. No need to be specified when you use endpoint groups." msgstr "" "Опционально. Не требуется указывать при использовании групп точки доступа." msgid "PFS" msgstr "PFS" msgid "PFS =" msgstr "PFS =" msgid "PFS supports Diffie-Hellman groups 2, 5 (default), 14 through 31." msgstr "" "PFS поддерживает группы Диффи-Хеллмана 2, 5 (по умолчанию), с 14 по 31." msgid "Peer Endpoint Group" msgstr "Удаленная группа точки доступа" msgid "Peer Endpoint Group(s)" msgstr "Удаленные группы точки доступа" msgid "Peer gateway public IPv4/IPv6 Address or FQDN" msgstr "" "Публичный IPv4/IPv6-адрес или FQDN (полное доменное имя) шлюза удаленного " "узла" msgid "Peer gateway public IPv4/IPv6 address or FQDN for the VPN Connection" msgstr "" "Публичный IPv4/IPv6-адрес или полное доменное имя (FQDN) шлюза удаленного " "узла для VPN-соединения" msgid "Peer router identity for authentication (Peer ID)" msgstr "Идентификатор удаленного узла (Peer ID) для аутентификации" msgid "" "Peer router identity for authentication. Can be IPv4/IPv6 address, e-mail, " "key ID, or FQDN" msgstr "" "Идентификатор маршрутизатора удаленного узла для аутентификации. Может быть " "IPv4/IPv6 адрес, адрес электронной почты, ID ключа или FQDN" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Create" msgstr "Ожидает создания" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Delete" msgstr "Ожидает удаления" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Update" msgstr "Ожидает обновления" msgid "Perfect Forward Secrecy" msgstr "Совершенная прямая секретность" msgid "Phase 1 negotiation mode limited to using 'main' and 'aggressive'." msgstr "" "Режим согласования Phase 1 ограничен использованием 'основного' и " "'агрессивного'." msgid "Pre-Shared Key (PSK) string" msgstr "Строка предварительно распределённого ключа (PSK)" msgid "Project ID" msgstr "ID проекта" msgid "Remote peer CIDR(s) connected to the new IPsec connection." msgstr "CIDR удаленных подключений, подключенных к новому IPsec подключению." msgid "Remote peer subnet" msgstr "Подсеть удаленного узла" msgid "Remote peer subnet(s)" msgstr "Подсети удаленного узла" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "Адреса подсетей удаленных узлов с масками в формате CIDR, разделенные " "запятыми при необходимости (например, 20.1.0.0/24, 21.1.0.0/24)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24). This field is valid if " "type is CIDR" msgstr "" "Адреса подсетей удалённых узлов с масками в формате CIDR, при необходимости " "разделенные запятыми (например, 20.1.0.0/24, 21.1.0.0/24). Это поле " "допустимо, если тип CIDR" msgid "Route mode" msgstr "Режим маршрутизации" msgid "Router" msgstr "Маршрутизатор" msgid "Router =" msgstr "Маршрутизатор =" msgid "Router ID =" msgstr "ID маршрутизатора =" msgid "SHA-1" msgstr "SHA-1" msgid "SHA-256" msgstr "SHA-256" msgid "SHA-384" msgstr "SHA-384" msgid "SHA-512" msgstr "SHA-512" msgid "Save Changes" msgstr "Сохранить изменения" msgid "Scheduled deletion of IKE policy" msgid_plural "Scheduled deletion of IKE policies" msgstr[0] "Запланировано удаление политики IKE" msgstr[1] "Запланировано удаление политик IKE" msgstr[2] "Запланировано удаление политик IKE" msgid "Scheduled deletion of IPsec policy" msgid_plural "Scheduled deletion of IPsec policies" msgstr[0] "Запланировано удаление политики IPsec" msgstr[1] "Запланировано удаление политик IPsec" msgstr[2] "Запланировано удаление политик IPsec" msgid "Scheduled deletion of IPsec site connection" msgid_plural "Scheduled deletion of IPsec site connections" msgstr[0] "Запланировано удаление IPsec подключения" msgstr[1] "Запланировано удаление IPsec подключений" msgstr[2] "Запланировано удаление IPsec подключений" msgid "Scheduled deletion of VPN service" msgid_plural "Scheduled deletion of VPN services" msgstr[0] "Запланировано удаление службы VPN" msgstr[1] "Запланировано удаление служб VPN" msgstr[2] "Запланировано удаление служб VPN" msgid "Scheduled deletion of endpoint group" msgid_plural "Scheduled deletion of endpoint groups" msgstr[0] "Запланировано удаление группы точки доступа" msgstr[1] "Запланировано удаление групп точки доступа" msgstr[2] "Запланировано удаление групп точки доступа" msgid "Select IKE policy" msgstr "Выберите политику IKE" msgid "Select IPsec Policy" msgstr "Выберите политику IPsec" msgid "Select VPN service" msgstr "Выберите службу VPN" msgid "Select a Router" msgstr "Выберите маршрутизатор" msgid "Select a Subnet" msgstr "Выберите подсеть" msgid "Select local endpoint group" msgstr "Выберите локальную группу точки доступа" msgid "Select peer endpoint group" msgstr "Выберите группу точки доступа удаленного узла" msgid "" "Specify a name, description, router, and subnet (optional) for the VPN " "service." msgstr "" "Укажите имя, описание, маршрутизатор и (опционально) подсеть для службы VPN." msgid "Status" msgstr "Статус" msgid "Status =" msgstr "Статус =" msgid "Subnet" msgstr "Подсеть" msgid "Subnet (for local systems)" msgstr "Подсеть (для локальных систем)" msgid "Subnet =" msgstr "Подсеть =" msgid "Subnet ID =" msgstr "ID подсети =" msgid "" "The VPN service is attached to a router and references to endpoint group or " "a single subnet to push to a remote site." msgstr "" "Служба VPN связана с маршрутизатором и использует группу точки доступа или " "одну подсеть для передачи данных на удаленную локацию." msgid "The pre-defined key string between the two peers of the VPN connection" msgstr "Предопределенная строка ключа между двумя узлами VPN-подключения" msgid "" "The router and admin state fields require to be enabled. All others are " "optional." msgstr "" "Поля маршрутизатора и административного состояния должны быть заполнены. Все " "остальные поля опциональны." msgid "" "The state of IPsec site connection to start in. If disabled (not checked), " "IPsec site connection does not forward packets." msgstr "" "Состояние IPsec, с которого начинается запуск подключения. Если отключено " "(не отмечено галочкой), подключение IPsec не пересылает пакеты." msgid "" "The state of VPN service to start in. If disabled (not checked), VPN service " "does not forward packets." msgstr "" "Состояние, в котором запускается служба VPN. Если она отключена (нет " "флажка), то это означает, что служба VPN не пересылает пакеты." msgid "The type of IPsec tunnel (tunnel/transport) to be used." msgstr "Тип туннеля IPsec (туннель/транспорт) который будет использован." msgid "The type of protocol (ESP, AH, AH-ESP) used in IPsec policy." msgstr "Тип протокола (ESP, AH, AH-ESP) используемый в политике IPsec." msgid "The type of version (v1/v2) that needs to be filtered." msgstr "Тип версии (v1/v2), которую необходимо отфильтровать." msgid "Transform Protocol" msgstr "Протокол инкапсуляции" msgid "Type" msgstr "Тип" msgid "Type =" msgstr "Тип =" #, python-format msgid "Unable to add IKE policy \"%s\"." msgstr "Не удалось добавить IKE политику \"%s\"." #, python-format msgid "Unable to add IPsec policy \"%s\"." msgstr "Не удалось добавить IPsec политику \"%s\"." #, python-format msgid "Unable to add IPsec site connection \"%s\"." msgstr "Не удалось добавить IPsec подключение \"%s\"." #, python-format msgid "Unable to add VPN service \"%s\"." msgstr "Не удалось добавить службу VPN \"%s\"." #, python-format msgid "Unable to add endpoint group \"%s\"." msgstr "Не удалось добавить группу точки доступа \"%s\"." msgid "Unable to delete IKE policy." msgstr "Не удалось удалить политику IKE." msgid "Unable to delete IPsec policy." msgstr "Не удалось удалить политику IPsec." msgid "Unable to delete IPsec site connection." msgstr "Не удалось удалить IPsec подключение." msgid "Unable to delete VPN service." msgstr "Не удалось удалить службу VPN." msgid "Unable to delete endpoint group." msgstr "Не удалось удалить группу точки доступа." msgid "Unable to retrieve IKE policies list." msgstr "Не удалось получить список политик IKE." msgid "Unable to retrieve IKE policy details." msgstr "Не удалось получить информацию о политике IKE." msgid "Unable to retrieve IPsec policies list." msgstr "Не удалось получить список политик IPsec." msgid "Unable to retrieve IPsec policy details." msgstr "Не удалось получить подробности IPsec политики." msgid "Unable to retrieve IPsec policy list." msgstr "Не удалось получить список политик IPsec." msgid "Unable to retrieve IPsec site connection details." msgstr "Не удалось получить подробности IPsec подключения." msgid "Unable to retrieve IPsec site connections list." msgstr "Не удалось получить список IPsec подключений." msgid "Unable to retrieve VPN service details." msgstr "Не удалось получить подробности VPN службы." msgid "Unable to retrieve VPN services list." msgstr "Не удалось получить список служб VPN." msgid "Unable to retrieve endpoint group details." msgstr "Не удалось получить подробности группы точки доступа." msgid "Unable to retrieve endpoint group list." msgstr "Не удалось получить список групп точки доступа." msgid "Unable to retrieve networks list." msgstr "Не удалось получить список сетей." msgid "Unable to retrieve routers list." msgstr "Не удалось получить список маршрутизаторов." msgid "VPN" msgstr "VPN" msgid "VPN Connections" msgstr "VPN подключения" msgid "VPN Service" msgstr "Служба VPN" msgid "VPN Service =" msgstr "Служба VPN =" msgid "VPN Service Details" msgstr "Подробности VPN службы" msgid "VPN Service ID =" msgstr "ID службы VPN =" msgid "VPN Services" msgstr "Службы VPN" #, python-format msgid "VPN service %s was successfully updated." msgstr "Служба VPN %s была успешно обновлена." msgid "VPN service associated with this connection" msgstr "Служба VPN для данного подключения" msgid "" "Valid algorithms are 3DES and AES-128/192/256 including CTR, CCM (ICV " "8/12/16) and GCM (ICV 8/12/16) variants." msgstr "" "Допустимыми алгоритмами являются 3DES и AES-128/192/256, включая варианты " "CTR, CCM (ICV 8/12/16) и GCM (ICV 8/12/16)." msgid "" "Valid algorithms are SHA-1, SHA-256, SHA-384, SHA-512, AES-XCBC and AES-CMAC." msgstr "" "Доступные алгоритмы SHA-1, SHA-256, SHA-384, SHA-512, AES-XCBC и AES-CMAC." msgid "Valid integer greater than the DPD interval" msgstr "Допустимое целое число, большее интервала DPD" msgid "Valid integer lesser than DPD timeout" msgstr "Допустимое целое число, меньшее времени ожидания DPD" msgid "Valid integer lesser than the DPD timeout" msgstr "Допустимое целое число, меньшее времени ожидания DPD" msgid "Virtual Private Network" msgstr "Виртуальная частная сеть" msgid "You may update IKE policy details here." msgstr "Здесь вы можете обновить данные о политике IKE." msgid "You may update IPsec policy details here." msgstr "Здесь вы можете обновить данные о политике IPSec." msgid "You may update IPsec site connection details here." msgstr "Здесь вы можете обновить детали подключения IPsec." msgid "You may update VPN service details here." msgstr "Здесь вы можете обновить данные VPN службы." msgid "You may update endpoint group details here." msgstr "Здесь вы можете изменить детали группы точки доступа." msgid "bi-directional" msgstr "bi-directional" msgid "clear" msgstr "clear" msgid "disabled" msgstr "disabled" msgid "down" msgstr "выключено" msgid "group14" msgstr "group14" msgid "group15" msgstr "group15" msgid "group16" msgstr "group16" msgid "group17" msgstr "group17" msgid "group18" msgstr "group18" msgid "group19" msgstr "group19" msgid "group2" msgstr "group2" msgid "group20" msgstr "group20" msgid "group21" msgstr "group21" msgid "group22" msgstr "group22" msgid "group23" msgstr "group23" msgid "group24" msgstr "group24" msgid "group25" msgstr "group25" msgid "group26" msgstr "group26" msgid "group27" msgstr "group27" msgid "group28" msgstr "group28" msgid "group29" msgstr "group29" msgid "group30" msgstr "group30" msgid "group31" msgstr "group31" msgid "group5" msgstr "group5" msgid "hold" msgstr "hold" msgid "response-only" msgstr "response-only" msgid "restart" msgstr "restart" msgid "restart-by-peer" msgstr "restart-by-peer" msgid "seconds" msgstr "сек." msgid "transport" msgstr "транспорт" msgid "tunnel" msgstr "туннель" msgid "up" msgstr "включено" msgid "v1" msgstr "v1" msgid "v2" msgstr "v2" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3490548 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/zh_Hans/0000775000175000017500000000000015257164617025410 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3740566 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/zh_Hans/LC_MESSAGES/0000775000175000017500000000000015257164617027175 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.279429 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/locale/zh_Hans/LC_MESSAGES/django.po0000664000175000017500000005031015257164532030772 0ustar00zuulzuul# BillXiang , 2016. #zanata # Linda , 2016. #zanata # Long Yu , 2016. #zanata # sunanchen , 2016. #zanata # Bin , 2017. #zanata # TigerFang , 2017. #zanata # Tony , 2017. #zanata # bkb , 2017. #zanata # blkart , 2017. #zanata # vuuv , 2017. #zanata # zhonghuali , 2017. #zanata # Tony , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: neutron-vpnaas-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2026-05-08 19:58+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-22 04:43+0000\n" "Last-Translator: Tony \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 "" "(Deprecated) Remote peer subnet(s) address(es) with mask(s) in CIDR format " "separated with commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "(已过时)CIDR 格式的远程对等子网地址及子网掩码,用逗号分隔(例如," "20.1.0.0/24, 21.1.0.0/24)" msgid "-" msgstr "_" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Active" msgstr "运行中" msgid "Add" msgstr "添加" msgid "Add Endpoint Group" msgstr "添加端点组" msgid "Add IKE Policy" msgstr "添加 IKE 策略" msgid "Add IPsec Policy" msgstr "添加 IPsec 策略" msgid "Add IPsec Site Connection" msgstr "添加 IPsec 站点连接" msgid "Add New Endpoint Groups" msgstr "添加新端点组" msgid "Add New IKE Policy" msgstr "添加新的 IKE 策略" msgid "Add New IPsec Policy" msgstr "添加新的 IPsec 策略" msgid "Add New IPsec Site Connection" msgstr "添加新的 IPsec 站点连接" msgid "Add New VPN Service" msgstr "添加新的 VPN 服务" msgid "Add VPN Service" msgstr "添加 VPN 服务" #, python-format msgid "Added IKE policy \"%s\"." msgstr "添加的 IKE 策略 \"%s\"。" #, python-format msgid "Added IPsec policy \"%s\"." msgstr "添加的 IPsec 策略 \"%s\"。" #, python-format msgid "Added IPsec site connection \"%s\"." msgstr "添加的 IPsec 站点连接 \"%s\"。" #, python-format msgid "Added VPN service \"%s\"." msgstr "添加的 VPN 服务 \"%s\"。" #, python-format msgid "Added endpoint group \"%s\"." msgstr "添加的端点组 \"%s\"。" msgid "Admin State" msgstr "管理状态" msgid "Admin State is enabled by default." msgstr "管理状态被默认启用。" msgid "All fields are optional." msgstr "所有的选项都是可选的。" msgid "An IKE policy is an association of the following attributes:" msgstr "IKE 策略是以下属性的集合:" msgid "An IPsec policy is an association of the following attributes" msgstr "IPsec 策略是以下属性的集合" msgid "Authorization algorithm" msgstr "授权算法" msgid "Authorization algorithm =" msgstr "授权算法 =" msgid "Authorization mode" msgstr "授权模式" msgid "CIDR (for external systems)" msgstr "CIDR (外部系统)" msgid "Create IKE policy for current project." msgstr "为当前项目创建 IKE 策略。" msgid "Create IPsec policy for current project." msgstr "为当前项目创建 IPsec 策略。" msgid "" "Create IPsec site connection for current project. Assign a name and " "description for the IPsec site connection. All fields in this tab are " "required." msgstr "" "为当前项目创建 IPsec 站点连接。为 IPsec 站点连接分配名称和描述。当前选项卡中" "的所有字段都是必填字段。" msgid "Create VPN service for current project." msgstr "为当前项目创建 VPN 服务" msgid "Create endpoint group for current project." msgstr "为当前项目创建站点组。" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Created" msgstr "已创建" msgid "DPD Timeout must be greater than DPD Interval" msgstr "DPD 超时必须大于 DPD 间隔" msgid "Dead peer detection action" msgstr "已失效对等检测" msgid "Dead peer detection actions" msgstr "已失效对等检测操作" msgid "Dead peer detection interval" msgstr "已失效对等检测间隔" msgid "Dead peer detection timeout" msgstr "已失效对等检测超时" msgid "Delete Endpoint Group" msgid_plural "Delete Endpoint Groups" msgstr[0] "删除端点组" msgid "Delete IKE Policy" msgid_plural "Delete IKE Policies" msgstr[0] "删除 IKE 策略" msgid "Delete IPsec Policy" msgid_plural "Delete IPsec Policies" msgstr[0] "删除I Psec 策略" msgid "Delete IPsec Site Connection" msgid_plural "Delete IPsec Site Connections" msgstr[0] "删除 IPsec 站点连接" msgid "Delete VPN Service" msgid_plural "Delete VPN Services" msgstr[0] "删除 VPN 服务" msgid "Description" msgstr "描述" msgid "Description:" msgstr "描述:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Down" msgstr "关闭" msgid "Edit Connection" msgstr "编辑连接" msgid "Edit Endpoint Group" msgstr "编辑端点组" msgid "Edit IKE Policy" msgstr "编辑 IKE 策略" msgid "Edit IPsec Policy" msgstr "编辑 IPsec 策略" msgid "Edit IPsec Site Connection" msgstr "编辑 IPsec 站点连接" msgid "Edit IPsec policy" msgstr "编辑 IPsec 策略" msgid "Edit IPsec site connection" msgstr "编辑 IPsec 站点连接" msgid "Edit VPN Service" msgstr "编辑 VPN 服务" msgid "Enable Admin State" msgstr "启用管理员状态" msgid "Encapsulation mode" msgstr "封装模式" msgid "Encryption algorithm" msgstr "加密算法" msgid "Encryption algorithm =" msgstr "端点算法 =" msgid "Endpoint Groups" msgstr "端点组" msgid "Endpoint Groups Details" msgstr "端点组详情" #, python-format msgid "Endpoint group %s was successfully updated." msgstr "端点组 %s 已被成功更新。" msgid "Endpoint group for local subnet(s)" msgstr "本地子网的端点组" msgid "Endpoint group for remote peer CIDR(s)" msgstr "远程对等 CIDR 的端点组" msgid "Endpoints" msgstr "服务地址。" msgid "Endpoints =" msgstr "端点 =" msgid "Equal to or greater than 60" msgstr "等于或大于 60" msgid "" "Equal to or greater than 68 if the local subnet is IPv4. Equal to or greater " "than 1280 if the local subnet is IPv6." msgstr "" "如果本地子网是 IPv4,那么等于或者大于 68。如果本地子网是 IPv6,那么等于或大" "于 1280。" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Error" msgstr "Error" msgid "External System CIDRs" msgstr "外部系统 CIDR" msgid "External System Subnets" msgstr "外部系统子网" #, python-format msgid "Failed to update IKE policy %s" msgstr "更新 IKE 策略 %s 失败" #, python-format msgid "Failed to update IPsec policy %s" msgstr "更新 IPsec 策略 %s 失败" #, python-format msgid "Failed to update IPsec site connection %s" msgstr "更新 IPsec 站点连接 %s 失败" #, python-format msgid "Failed to update VPN service %s" msgstr "更新 VPN 服务service %s 失败。" #, python-format msgid "Failed to update endpoint group %s" msgstr "更新端点组 %s 失败" msgid "" "Fields in this tab are optional. You can configure the detail of IPsec site " "connection created." msgstr "本标签中的字段都是可选的。您可以配置已创建的 IPsec站点连接的详情。" msgid "ID" msgstr "ID" msgid "IKE Phase 1 negotiation mode" msgstr "IKE Phase1协商模式" msgid "IKE Phase1 negotiation mode" msgstr "IKE Phase1 协商模式" msgid "IKE Policies" msgstr "IKE 策略" msgid "IKE Policy" msgstr "IKE 策略" msgid "IKE Policy =" msgstr "IKE 策略 =" msgid "IKE Policy Details" msgstr "IKE 策略详情" msgid "IKE Policy ID =" msgstr "IKE 策略 ID =" #, python-format msgid "IKE policy %s was successfully updated." msgstr "成功更新 IKE 策略 %s。" msgid "IKE policy associated with this connection" msgstr "与这个连接相关联的 IKE 策略" msgid "IKE version" msgstr "IKE 版本" msgid "IPsec Policies" msgstr "IPsec 策略" msgid "IPsec Policy" msgstr "IPsec 策略" msgid "IPsec Policy =" msgstr "IPsec 策略 =" msgid "IPsec Policy Details" msgstr "IPsec 策略详情" msgid "IPsec Policy ID =" msgstr "IPsec 策略 ID =" msgid "IPsec Site Connection Details" msgstr "IPsec 站点连接详情" msgid "IPsec Site Connections" msgstr "IPsec 站点连接" msgid "IPsec connection validation requires that local endpoints are subnets" msgstr "IPsec 连接验证需要本地端点是子网" msgid "" "IPsec connection validation requires that local endpoints are subnets, and " "peer endpoints are CIDRs." msgstr "IPsec 连接验证需要本地端点是子网,对等端点是 CIDR。" msgid "IPsec connection validation requires that peer endpoints are CIDRs" msgstr "IPsec 连接验证需要对等端点是 CIDRs" #, python-format msgid "IPsec policy %s was successfully updated." msgstr "IPsec 策略 %s 已被成功更新。" msgid "IPsec policy associated with this connection" msgstr "与这个连接相关联的 IPsec 策略" #, python-format msgid "IPsec site connection %s was successfully updated." msgstr "IPsec 站点连接 %s 被成功更新。" msgid "IPv4" msgstr "IPv4" msgid "IPv4:" msgstr "IPv4:" msgid "IPv6" msgstr "IPv6" msgid "IPv6:" msgstr "IPv6:" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Inactive" msgstr "失效" msgid "Initiator state" msgstr "发起者状态" msgid "" "Life time consists of units and value. Units in 'seconds' and the default " "value is 3600." msgstr "生存期由单位和值组成。单位是“秒”,默认值是 3600。" msgid "Lifetime" msgstr "生存期" msgid "Lifetime Units" msgstr "生存周期单位" msgid "Lifetime Value" msgstr "生存周期值" msgid "Lifetime units" msgstr "生存期单位" msgid "Lifetime units for IKE keys" msgstr "IKE 密钥的生存期单位" msgid "Lifetime value" msgstr "生存期值" msgid "Lifetime value for IKE keys" msgstr "IKE 密钥的生存期值" msgid "Lifetime value for IKE keys " msgstr "IKE 密钥的生存周期" msgid "Local Endpoint Group" msgstr "本地端点组" msgid "Local Endpoint Group(s)" msgstr "本地端点组" msgid "Local Side Public IPs" msgstr "本地端公共 IP" msgid "Local System Subnets" msgstr "本地系统子网" msgid "Local subnet(s). This field is valid if type is Subnet" msgstr "本地子网。如果类型是子网则这个项有效" msgid "" "Local subnets which the new IPsec connection is connected to. Required if no " "subnet is specified in a VPN service selected." msgstr "" "新的 IPsec 连接要连接到的本地子网。如果没有在选择的 VPN 服务中指定子网,则需" "要这个设置。" msgid "MTU" msgstr "MTU" msgid "Maximum Transmission Unit size for the connection" msgstr "此连接的最大传输单元大小" msgid "Name" msgstr "名称" msgid "Name =" msgstr "名称 =" msgid "" "Note: The recommended way to specify local subnets is to use endpoint groups " "in IPsec site connection. It is deprecated to specify subnet in VPN service. " "For a new VPN service or IPsec site connection, using endpoint group is " "recommended." msgstr "" "备注:指定本地子网的推荐方法是使用 IPsec 站点连接中的端点组。对于一个新的 " "VPN 服务或 IPsec 站点连接,推荐使用端点组。" msgid "Optional Parameters" msgstr "可选参数" msgid "Optional. No need to be specified when you use endpoint groups." msgstr "可选。当使用端点组时不需要指定。" msgid "PFS" msgstr "PFS" msgid "PFS =" msgstr "PFS =" msgid "Peer Endpoint Group" msgstr "对等端点组" msgid "Peer Endpoint Group(s)" msgstr "对等端点组" msgid "Peer gateway public IPv4/IPv6 Address or FQDN" msgstr "对等网关公共 IPv4/IPv6 地址或 FQDN" msgid "Peer gateway public IPv4/IPv6 address or FQDN for the VPN Connection" msgstr "VPN 连接的对等网关公共 IPv4/IPv6 地址或 FQDN" msgid "Peer router identity for authentication (Peer ID)" msgstr "用于认证的对等路由器身份(对等标识)" msgid "" "Peer router identity for authentication. Can be IPv4/IPv6 address, e-mail, " "key ID, or FQDN" msgstr "" "用于认证的对等路由器身份。可以是 IPv4/IPv6 地址、电子邮件、密钥标识或 FQDN" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Create" msgstr "暂挂创建" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Delete" msgstr "正在暂停删除动作" msgctxt "Current status of an IPsec site connection and VPN service" msgid "Pending Update" msgstr "暂挂更新" msgid "Perfect Forward Secrecy" msgstr "完善前向保密" msgid "Pre-Shared Key (PSK) string" msgstr " 预共享密钥 (PSK) 字符串" msgid "Project ID" msgstr "项目 ID" msgid "Remote peer CIDR(s) connected to the new IPsec connection." msgstr "连接到新的 IPsec 连接的远程对等 CIDR。" msgid "Remote peer subnet" msgstr "远程对等子网" msgid "Remote peer subnet(s)" msgstr "远程对等子网" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24)" msgstr "" "CIDR 格式的远程对等子网地址及子网掩码,用逗号分隔(例如,20.1.0.0/24, " "21.1.0.0/24)" msgid "" "Remote peer subnet(s) address(es) with mask(s) in CIDR format separated with " "commas if needed (e.g. 20.1.0.0/24, 21.1.0.0/24). This field is valid if " "type is CIDR" msgstr "" "CIDR 格式的远程对等子网地址及子网掩码,用逗号分隔(例如,20.1.0.0/24, " "21.1.0.0/24)" msgid "Route mode" msgstr "路由模式" msgid "Router" msgstr "路由器" msgid "Router =" msgstr "路由器 =" msgid "Router ID =" msgstr "路由器ID = " msgid "Save Changes" msgstr "保存变更" msgid "Scheduled deletion of IKE policy" msgid_plural "Scheduled deletion of IKE policies" msgstr[0] "已调度删除 IKE 策略" msgid "Scheduled deletion of IPsec policy" msgid_plural "Scheduled deletion of IPsec policies" msgstr[0] "已调度删除 IPsec 策略" msgid "Scheduled deletion of IPsec site connection" msgid_plural "Scheduled deletion of IPsec site connections" msgstr[0] "已调度删除 IPsec 站点连接" msgid "Scheduled deletion of VPN service" msgid_plural "Scheduled deletion of VPN services" msgstr[0] "已调度删除 VPN 服务" msgid "Scheduled deletion of endpoint group" msgid_plural "Scheduled deletion of endpoint groups" msgstr[0] "已调度删除端点组" msgid "Select IKE policy" msgstr "选择 IKE 策略" msgid "Select IPsec Policy" msgstr "选择 IPsec 策略" msgid "Select VPN service" msgstr "选择 VPN 服务" msgid "Select a Router" msgstr "选择一个路由器" msgid "Select a Subnet" msgstr "选择子网" msgid "Select local endpoint group" msgstr "选择本地端点组" msgid "Select peer endpoint group" msgstr "选择对等端点组" msgid "" "Specify a name, description, router, and subnet (optional) for the VPN " "service." msgstr "为VPN服务指定名称,描述信息,路由以及子网(可选)。" msgid "Status" msgstr "状态" msgid "Status =" msgstr "状态 =" msgid "Subnet" msgstr "子网" msgid "Subnet (for local systems)" msgstr "子网 (本地系统)" msgid "Subnet =" msgstr "子网 =" msgid "Subnet ID =" msgstr "子网 ID =" msgid "" "The VPN service is attached to a router and references to endpoint group or " "a single subnet to push to a remote site." msgstr "VPN 服务连接到路由器,并引用端点组或单个子网以推送至远程站点。" msgid "The pre-defined key string between the two peers of the VPN connection" msgstr "VPN 连接的两个对等之间的预定义密钥字符串" msgid "" "The router and admin state fields require to be enabled. All others are " "optional." msgstr "路由及管理状态是必须的。其他的选项是可选的。" msgid "" "The state of IPsec site connection to start in. If disabled (not checked), " "IPsec site connection does not forward packets." msgstr "" "开始的 IPsec 站点连接状态。如果禁用(没有勾选),IPsec 站点连接不转发数据包。" msgid "" "The state of VPN service to start in. If disabled (not checked), VPN service " "does not forward packets." msgstr "VPN 服务的起始状态。如果为禁用 (未选中),那么 VPN 服务不转发包。" msgid "The type of IPsec tunnel (tunnel/transport) to be used." msgstr "使用的 IPsec tunnel (tunnel/transport) 类型。" msgid "The type of version (v1/v2) that needs to be filtered." msgstr "需要进行筛选的版本种类 (v1/v2)" msgid "Transform Protocol" msgstr "转换协议" msgid "Type" msgstr "类型" msgid "Type =" msgstr "类型 =" #, python-format msgid "Unable to add IKE policy \"%s\"." msgstr "无法添加 IKE 策略 \"%s\"。" #, python-format msgid "Unable to add IPsec policy \"%s\"." msgstr "无法添加 IPsec 策略 \"%s\"。" #, python-format msgid "Unable to add IPsec site connection \"%s\"." msgstr "无法添加 IPsec 站点连接 \"%s\"。" #, python-format msgid "Unable to add VPN service \"%s\"." msgstr "无法添加 VPN 服务 \"%s\"。" #, python-format msgid "Unable to add endpoint group \"%s\"." msgstr "无法添加端点组 \"%s\"。" msgid "Unable to retrieve IKE policies list." msgstr "无法获取 IKE 策略列表。" msgid "Unable to retrieve IKE policy details." msgstr "无法获取 IKE 策略详情。" msgid "Unable to retrieve IPsec policies list." msgstr "无法获取 IPsec 策略列表。" msgid "Unable to retrieve IPsec policy details." msgstr "无法获取 IPsec 策略详情。" msgid "Unable to retrieve IPsec policy list." msgstr "无法获取 IPsec 策略列表。" msgid "Unable to retrieve IPsec site connection details." msgstr "无法获取 IPsec 站点连接详情。" msgid "Unable to retrieve IPsec site connections list." msgstr "无法获取 IPsec站点连接列表。" msgid "Unable to retrieve VPN service details." msgstr "无法获取 VPN 服务详情。" msgid "Unable to retrieve VPN services list." msgstr "无法获取 VPN 服务列表。" msgid "Unable to retrieve endpoint group details." msgstr "无法获取端点组详情。" msgid "Unable to retrieve endpoint group list." msgstr "无法获取端点组列表。" msgid "Unable to retrieve networks list." msgstr "无法检索网络列表。" msgid "Unable to retrieve routers list." msgstr "无法检索路由器列表。" msgid "VPN" msgstr "VPN" msgid "VPN Connections" msgstr "VPN 连接" msgid "VPN Service" msgstr " VPN 服务" msgid "VPN Service =" msgstr "VPN 服务 =" msgid "VPN Service Details" msgstr " VPN 服务详情" msgid "VPN Service ID =" msgstr "VPN 服务 ID =" msgid "VPN Services" msgstr " VPN 服务" #, python-format msgid "VPN service %s was successfully updated." msgstr "VPN 服务 %s 已被成功更新。" msgid "VPN service associated with this connection" msgstr "与这个连接相关联的 VPN 服务" msgid "Valid integer greater than the DPD interval" msgstr "大于 DPD 间隔的有效整数" msgid "Valid integer lesser than DPD timeout" msgstr "小于 DPD 超时的有效整数" msgid "Valid integer lesser than the DPD timeout" msgstr "小于 DPD 超时的有效整数" msgid "Virtual Private Network" msgstr "虚拟专用网络" msgid "You may update IKE policy details here." msgstr "您可以在此处更新 IKE 策略详情。" msgid "You may update IPsec policy details here." msgstr "您可以在此处更新 IPsec 策略详情。" msgid "You may update IPsec site connection details here." msgstr "您可以在此处更新 IPsec 站点连接详情。" msgid "You may update VPN service details here." msgstr "您可以在此处更新 VPN 服务详情。" msgid "You may update endpoint group details here." msgstr "您可以在此处更新端点组的详情。" msgid "bi-directional" msgstr "双向" msgid "clear" msgstr "清除" msgid "disabled" msgstr "禁用" msgid "down" msgstr "关闭" msgid "group14" msgstr "group14" msgid "group2" msgstr "group2" msgid "group5" msgstr "group5" msgid "hold" msgstr "保留" msgid "response-only" msgstr "仅应答" msgid "restart" msgstr "重启" msgid "restart-by-peer" msgstr "被对等重新启动" msgid "seconds" msgstr "秒" msgid "transport" msgstr "网络运输" msgid "tunnel" msgstr "通道" msgid "up" msgstr "启动" msgid "v1" msgstr "v1" msgid "v2" msgstr "v2" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3750565 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/0000775000175000017500000000000015257164617023536 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.279429 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/__init__.py0000664000175000017500000000000015257164532025631 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3750565 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/api_tests/0000775000175000017500000000000015257164617025531 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.279429 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/api_tests/__init__.py0000664000175000017500000000000015257164532027624 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2824295 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/api_tests/test_vpnaas.py0000664000175000017500000003675215257164532030443 0ustar00zuulzuul# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # 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.network.v2._proxy import Proxy as networkclient from openstack_dashboard import api from openstack_dashboard.test import helpers from neutron_vpnaas_dashboard.api import vpn as api_vpn from neutron_vpnaas_dashboard.test import helpers as test class VPNaasApiTests(test.APITestCase): @helpers.create_mocks({networkclient: ('create_vpn_service',)}) def test_vpnservice_create(self): vpnservice1 = self.api_vpnservices[0] form_data = { 'name': vpnservice1['name'], 'description': vpnservice1['description'], 'subnet_id': vpnservice1['subnet_id'], 'router_id': vpnservice1['router_id'], 'admin_state_up': vpnservice1['admin_state_up'] } vpnservice = self.api_vpnservices[0] self.mock_create_vpn_service.return_value = vpnservice ret_val = api_vpn.vpnservice_create(self.request, **form_data) self.assertIsInstance(ret_val, api_vpn.VPNService) self.mock_create_vpn_service.assert_called_once_with(**form_data) @helpers.create_mocks({networkclient: ('vpn_services', 'vpn_ipsec_site_connections'), api.neutron: ('subnet_list', 'router_list')}) def test_vpnservice_list(self): vpnservices = self.api_vpnservices subnets = self.subnets.list() routers = self.routers.list() # vpn_services() returns a generator, like the real SDK call. self.mock_vpn_services.return_value = iter(vpnservices) self.mock_subnet_list.return_value = subnets self.mock_router_list.return_value = routers self.mock_vpn_ipsec_site_connections.return_value = ( self.api_ipsecsiteconnections) ret_val = api_vpn.vpnservice_list(self.request) self.assertEqual(len(vpnservices), len(ret_val)) for (v, d) in zip(ret_val, self.vpnservices.list()): self.assertIsInstance(v, api_vpn.VPNService) self.assertTrue(v.name, d.name) self.assertTrue(v.id) self.assertIn('router_name', v.to_dict()) self.assertIn('ipsecsiteconns', v.to_dict()) self.mock_vpn_services.assert_called_once_with() self.mock_subnet_list.assert_called_once_with(self.request) self.mock_router_list.assert_called_once_with(self.request) self.mock_vpn_ipsec_site_connections.assert_called_once_with() @helpers.create_mocks({networkclient: ('get_vpn_service', 'vpn_ipsec_site_connections'), api.neutron: ('subnet_get', 'router_get')}) def test_vpnservice_get(self): vpnservice = self.api_vpnservices[0] subnet = self.subnets.first() router = self.routers.first() self.mock_get_vpn_service.return_value = vpnservice self.mock_subnet_get.return_value = subnet self.mock_router_get.return_value = router self.mock_vpn_ipsec_site_connections.return_value = ( self.api_ipsecsiteconnections) ret_val = api_vpn.vpnservice_get(self.request, vpnservice.id) self.assertIsInstance(ret_val, api_vpn.VPNService) # The SDK returns is_admin_state_up; the views read admin_state_up. self.assertIs(True, ret_val['admin_state_up']) self.mock_get_vpn_service.assert_called_once_with(vpnservice.id) self.mock_subnet_get.assert_called_once_with(self.request, subnet.id) self.mock_router_get.assert_called_once_with(self.request, router.id) self.mock_vpn_ipsec_site_connections.assert_called_once_with() @helpers.create_mocks({networkclient: ('create_vpn_endpoint_group',)}) def test_endpointgroup_create(self): endpointgroup = self.api_endpointgroups[0].to_dict() form_data = { 'name': endpointgroup['name'], 'description': endpointgroup['description'], 'type': endpointgroup['type'], 'endpoints': endpointgroup['endpoints'] } self.mock_create_vpn_endpoint_group.return_value = ( self.api_endpointgroups[0]) ret_val = api_vpn.endpointgroup_create(self.request, **form_data) self.assertIsInstance(ret_val, api_vpn.EndpointGroup) self.mock_create_vpn_endpoint_group.assert_called_once_with( **form_data) @helpers.create_mocks({networkclient: ('vpn_endpoint_groups', 'vpn_ipsec_site_connections')}) def test_endpointgroup_list(self): endpointgroups = self.api_endpointgroups self.mock_vpn_endpoint_groups.return_value = endpointgroups self.mock_vpn_ipsec_site_connections.return_value = \ self.api_ipsecsiteconnections ret_val = api_vpn.endpointgroup_list(self.request) for (v, d) in zip(ret_val, self.endpointgroups.list()): self.assertIsInstance(v, api_vpn.EndpointGroup) self.assertTrue(v.name, d.name) self.assertTrue(v.id) self.mock_vpn_endpoint_groups.assert_called_once_with() self.mock_vpn_ipsec_site_connections.assert_called_once_with() @helpers.create_mocks({networkclient: ('get_vpn_endpoint_group', 'vpn_ipsec_site_connections')}) def test_endpointgroup_get(self): endpoint_group = self.api_endpointgroups[0] self.mock_get_vpn_endpoint_group.return_value = endpoint_group self.mock_vpn_ipsec_site_connections.return_value = \ self.api_ipsecsiteconnections ret_val = api_vpn.endpointgroup_get(self.request, endpoint_group.id) self.assertIsInstance(ret_val, api_vpn.EndpointGroup) self.mock_get_vpn_endpoint_group.assert_called_once_with( endpoint_group.id) self.mock_vpn_ipsec_site_connections.assert_called_once_with() @helpers.create_mocks({networkclient: ('create_vpn_ike_policy',)}) def test_ikepolicy_create(self): ikepolicy1 = self.api_ikepolicies[0].to_dict() form_data = { 'name': ikepolicy1['name'], 'description': ikepolicy1['description'], 'auth_algorithm': ikepolicy1['auth_algorithm'], 'encryption_algorithm': ikepolicy1['encryption_algorithm'], 'ike_version': ikepolicy1['ike_version'], 'lifetime': ikepolicy1['lifetime'], 'phase1_negotiation_mode': ikepolicy1['phase1_negotiation_mode'], 'pfs': ikepolicy1['pfs'] } ikepolicy = self.api_ikepolicies[0] self.mock_create_vpn_ike_policy.return_value = ikepolicy ret_val = api_vpn.ikepolicy_create(self.request, **form_data) self.assertIsInstance(ret_val, api_vpn.IKEPolicy) self.mock_create_vpn_ike_policy.assert_called_once_with(**form_data) @helpers.create_mocks({networkclient: ('vpn_ike_policies', 'vpn_ipsec_site_connections')}) def test_ikepolicy_list(self): ikepolicies = self.api_ikepolicies ipsecsiteconnections = self.api_ipsecsiteconnections self.mock_vpn_ike_policies.return_value = ikepolicies self.mock_vpn_ipsec_site_connections.return_value = \ ipsecsiteconnections ret_val = api_vpn.ikepolicy_list(self.request) for (v, d) in zip(ret_val, self.ikepolicies.list()): self.assertIsInstance(v, api_vpn.IKEPolicy) self.assertTrue(v.name, d.name) self.assertTrue(v.id) self.mock_vpn_ike_policies.assert_called_once_with() self.mock_vpn_ipsec_site_connections.assert_called_once_with() @helpers.create_mocks({networkclient: ('get_vpn_ike_policy', 'vpn_ipsec_site_connections')}) def test_ikepolicy_get(self): ikepolicy = self.api_ikepolicies[0] ipsecsiteconnections = self.api_ipsecsiteconnections self.mock_get_vpn_ike_policy.return_value = ikepolicy self.mock_vpn_ipsec_site_connections.return_value = \ ipsecsiteconnections ret_val = api_vpn.ikepolicy_get(self.request, ikepolicy.id) self.assertIsInstance(ret_val, api_vpn.IKEPolicy) self.mock_get_vpn_ike_policy.assert_called_once_with(ikepolicy.id) self.mock_vpn_ipsec_site_connections.assert_called_once_with() @helpers.create_mocks({networkclient: ('create_vpn_ipsec_policy',)}) def test_ipsecpolicy_create(self): ipsecpolicy1 = self.ipsecpolicies.first() form_data = { 'name': ipsecpolicy1['name'], 'description': ipsecpolicy1['description'], 'auth_algorithm': ipsecpolicy1['auth_algorithm'], 'encryption_algorithm': ipsecpolicy1['encryption_algorithm'], 'encapsulation_mode': ipsecpolicy1['encapsulation_mode'], 'lifetime': ipsecpolicy1['lifetime'], 'pfs': ipsecpolicy1['pfs'], 'transform_protocol': ipsecpolicy1['transform_protocol'] } ipsecpolicy = self.api_ipsecpolicies[0] self.mock_create_vpn_ipsec_policy.return_value = ipsecpolicy ret_val = api_vpn.ipsecpolicy_create(self.request, **form_data) self.assertIsInstance(ret_val, api_vpn.IPsecPolicy) self.mock_create_vpn_ipsec_policy.assert_called_once_with(**form_data) @helpers.create_mocks({networkclient: ('vpn_ipsec_policies', 'vpn_ipsec_site_connections')}) def test_ipsecpolicy_list(self): ipsecpolicies = self.api_ipsecpolicies self.mock_vpn_ipsec_policies.return_value = ipsecpolicies self.mock_vpn_ipsec_site_connections.return_value = \ self.api_ipsecsiteconnections ret_val = api_vpn.ipsecpolicy_list(self.request) for (v, d) in zip(ret_val, self.ipsecpolicies.list()): self.assertIsInstance(v, api_vpn.IPsecPolicy) self.assertTrue(v.name, d.name) self.assertTrue(v.id) self.mock_vpn_ipsec_policies.assert_called_once_with() self.mock_vpn_ipsec_site_connections.assert_called_once_with() @helpers.create_mocks({networkclient: ('get_vpn_ipsec_policy', 'vpn_ipsec_site_connections')}) def test_ipsecpolicy_get(self): ipsecpolicy = self.api_ipsecpolicies[0] ipsecsiteconnections = self.api_ipsecsiteconnections self.mock_get_vpn_ipsec_policy.return_value = ipsecpolicy self.mock_vpn_ipsec_site_connections.return_value = \ ipsecsiteconnections ret_val = api_vpn.ipsecpolicy_get(self.request, ipsecpolicy.id) self.assertIsInstance(ret_val, api_vpn.IPsecPolicy) self.mock_get_vpn_ipsec_policy.assert_called_once_with(ipsecpolicy.id) self.mock_vpn_ipsec_site_connections.assert_called_once_with() @helpers.create_mocks({networkclient: ('create_vpn_ipsec_site_connection',)}) def test_ipsecsiteconnection_create(self): ipsecsiteconnection1 = self.ipsecsiteconnections.first() form_data = { 'name': ipsecsiteconnection1['name'], 'description': ipsecsiteconnection1['description'], 'dpd': ipsecsiteconnection1['dpd'], 'ikepolicy_id': ipsecsiteconnection1['ikepolicy_id'], 'initiator': ipsecsiteconnection1['initiator'], 'ipsecpolicy_id': ipsecsiteconnection1['ipsecpolicy_id'], 'mtu': ipsecsiteconnection1['mtu'], 'peer_address': ipsecsiteconnection1['peer_address'], 'peer_cidrs': ipsecsiteconnection1['peer_cidrs'], 'peer_id': ipsecsiteconnection1['peer_id'], 'psk': ipsecsiteconnection1['psk'], 'vpnservice_id': ipsecsiteconnection1['vpnservice_id'], 'admin_state_up': ipsecsiteconnection1['admin_state_up'] } ipsecsiteconnection = self.api_ipsecsiteconnections[0] self.mock_create_vpn_ipsec_site_connection.return_value = \ ipsecsiteconnection ret_val = api_vpn.ipsecsiteconnection_create( self.request, **form_data) self.assertIsInstance(ret_val, api_vpn.IPsecSiteConnection) self.mock_create_vpn_ipsec_site_connection.assert_called_once_with( **form_data) @helpers.create_mocks({networkclient: ('vpn_ipsec_site_connections', 'vpn_ike_policies', 'vpn_ipsec_policies', 'vpn_services')}) def test_ipsecsiteconnection_list(self): ipsecsiteconnections = self.api_ipsecsiteconnections ikepolicies = self.api_ikepolicies ipsecpolicies = self.api_ipsecpolicies vpnservices = self.api_vpnservices self.mock_vpn_ipsec_site_connections.return_value = \ ipsecsiteconnections self.mock_vpn_ike_policies.return_value = ikepolicies self.mock_vpn_ipsec_policies.return_value = ipsecpolicies self.mock_vpn_services.return_value = vpnservices ret_val = api_vpn.ipsecsiteconnection_list(self.request) for (v, d) in zip(ret_val, self.ipsecsiteconnections.list()): self.assertIsInstance(v, api_vpn.IPsecSiteConnection) self.assertTrue(v.name, d.name) self.assertTrue(v.id) self.mock_vpn_ipsec_site_connections.assert_called_once_with() self.mock_vpn_ike_policies.assert_called_once_with() self.mock_vpn_ipsec_policies.assert_called_once_with() self.mock_vpn_services.assert_called_once_with() @helpers.create_mocks({networkclient: ('get_vpn_ipsec_site_connection', 'get_vpn_ike_policy', 'get_vpn_ipsec_policy', 'get_vpn_service')}) def test_ipsecsiteconnection_get(self): ipsecsiteconnection = self.ipsecsiteconnections.first() connection = self.api_ipsecsiteconnections[0] ikepolicy = self.api_ikepolicies[0] ipsecpolicy = self.api_ipsecpolicies[0] vpnservice = self.api_vpnservices[0] self.mock_get_vpn_ipsec_site_connection.return_value = connection self.mock_get_vpn_ike_policy.return_value = ikepolicy self.mock_get_vpn_ipsec_policy.return_value = ipsecpolicy self.mock_get_vpn_service.return_value = vpnservice ret_val = api_vpn.ipsecsiteconnection_get(self.request, ipsecsiteconnection.id) self.assertIsInstance(ret_val, api_vpn.IPsecSiteConnection) # The SDK returns is_admin_state_up; the views read admin_state_up. self.assertIs(True, ret_val['admin_state_up']) self.mock_get_vpn_ipsec_site_connection.assert_called_once_with( ipsecsiteconnection.id) self.mock_get_vpn_ike_policy.assert_called_once_with( ipsecsiteconnection.ikepolicy_id) self.mock_get_vpn_ipsec_policy.assert_called_once_with( ipsecsiteconnection.ipsecpolicy_id) self.mock_get_vpn_service.assert_called_once_with( ipsecsiteconnection.vpnservice_id) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2824295 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/helpers.py0000664000175000017500000000203215257164532025543 0ustar00zuulzuul# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # 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_vpnaas_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 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2824295 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/settings.py0000664000175000017500000000346415257164532025753 0ustar00zuulzuul# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # 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_vpnaas_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_vpnaas_dashboard settings.update_dashboards( [ openstack_dashboard.enabled, neutron_vpnaas_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['vpn'] = { 'method': ('neutron_vpnaas_dashboard.dashboards.project.vpn.panel.' 'VPN.can_access'), 'return_value': True, } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3760567 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/test_data/0000775000175000017500000000000015257164617025506 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2824295 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/test_data/__init__.py0000664000175000017500000000000015257164532027601 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2824295 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/test_data/utils.py0000664000175000017500000000175115257164532027220 0ustar00zuulzuul# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # 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_vpnaas_dashboard.test.test_data import vpnaas_data # The order of these loaders matters, some depend on others. loaders = ( vpnaas_data.data, ) if load_onto: for data_func in loaders: data_func(load_onto) return load_onto else: return utils.TestData(*loaders) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2844298 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/test/test_data/vpnaas_data.py0000664000175000017500000002430315257164532030337 0ustar00zuulzuul# Copyright 2012 Nebula, Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack.network.v2 import vpn_endpoint_group from openstack.network.v2 import vpn_ike_policy from openstack.network.v2 import vpn_ipsec_policy from openstack.network.v2 import vpn_ipsec_site_connection from openstack.network.v2 import vpn_service from openstack_dashboard.test.test_data import utils from neutron_vpnaas_dashboard.api import vpn def data(TEST): # Data returned by neutron_vpnaas_dashboard.api.vpn wrapper. TEST.vpnservices = utils.TestDataContainer() TEST.ikepolicies = utils.TestDataContainer() TEST.ipsecpolicies = utils.TestDataContainer() TEST.ipsecsiteconnections = utils.TestDataContainer() TEST.endpointgroups = utils.TestDataContainer() # Data return by OpenstackSDK. TEST.api_vpnservices = list() TEST.api_ikepolicies = list() TEST.api_ipsecpolicies = list() TEST.api_ipsecsiteconnections = list() TEST.api_endpointgroups = list() # 1st VPN service. vpnservice_dict = {'id': '09a26949-6231-4f72-942a-0c8c0ddd4d61', 'tenant_id': '1', 'name': 'cloud_vpn1', 'description': 'vpn description', 'subnet_id': TEST.subnets.first().id, 'router_id': TEST.routers.first().id, 'vpn_type': 'ipsec', 'ipsecsiteconnections': [], 'admin_state_up': True, 'status': 'Active', 'ipsecsiteconns': TEST.ipsecsiteconnections.list() } TEST.api_vpnservices.append(vpn_service.VpnService(**vpnservice_dict)) TEST.vpnservices.add(vpn.VPNService(vpnservice_dict)) # 2nd VPN service. vpnservice_dict = {'id': '09a26949-6231-4f72-942a-0c8c0ddd4d62', 'tenant_id': '1', 'name': 'cloud_vpn2', 'description': 'vpn description', 'subnet_id': TEST.subnets.first().id, 'router_id': TEST.routers.first().id, 'vpn_type': 'ipsec', 'ipsecsiteconnections': [], 'admin_state_up': True, 'status': 'Active', 'ipsecsiteconns': [], 'external_v4_ip': '10.0.0.0/24', 'external_v6_ip': 'fd4c:a535:831c::/64' } TEST.api_vpnservices.append(vpn_service.VpnService(**vpnservice_dict)) TEST.vpnservices.add(vpn.VPNService(vpnservice_dict)) # 1st Endpoint Group endpointgroup_dict = {'id': 'baa588ff-e1b9-4256-8687-9f06315f64b7', 'tenant_id': '1', 'name': 'endpoint_group_one', 'description': 'the first test endpoint group', 'type': 'subnet', 'endpoints': [TEST.subnets.first().id] } TEST.api_endpointgroups.append(vpn_endpoint_group.VpnEndpointGroup( **endpointgroup_dict)) TEST.endpointgroups.add(vpn.EndpointGroup(endpointgroup_dict)) # 1st IKE policy ikepolicy_dict = {'id': 'a1f009b7-0ffa-43a7-ba19-dcabb0b4c981', 'tenant_id': '1', 'name': 'ikepolicy_1', 'description': 'ikepolicy description', 'auth_algorithm': 'sha1', 'encryption_algorithm': 'aes-256', 'ike_version': 'v1', 'lifetime': {'units': 'seconds', 'value': 3600}, 'phase1_negotiation_mode': 'main', 'pfs': 'group5', 'ipsecsiteconns': TEST.ipsecsiteconnections.list()} TEST.api_ikepolicies.append(vpn_ike_policy.VpnIkePolicy(**ikepolicy_dict)) TEST.ikepolicies.add(vpn.IKEPolicy(ikepolicy_dict)) # 2nd IKE policy ikepolicy_dict = {'id': 'a1f009b7-0ffa-43a7-ba19-dcabb0b4c982', 'tenant_id': '1', 'name': 'ikepolicy_2', 'description': 'ikepolicy description', 'auth_algorithm': 'sha1', 'encryption_algorithm': 'aes-256', 'ike_version': 'v1', 'lifetime': {'units': 'seconds', 'value': 3600}, 'phase1_negotiation_mode': 'aggressive', 'pfs': 'group5', 'ipsecsiteconns': []} TEST.api_ikepolicies.append(vpn_ike_policy.VpnIkePolicy(**ikepolicy_dict)) TEST.ikepolicies.add(vpn.IKEPolicy(ikepolicy_dict)) # 3rd IKE policy ikepolicy_dict = {'id': 'a1f009b7-0ffa-43a7-ba19-dcabb0b4c983', 'tenant_id': '1', 'name': 'ikepolicy_3', 'description': 'ikepolicy description', 'auth_algorithm': 'sha1', 'encryption_algorithm': 'aes-256', 'ike_version': 'v1', 'lifetime': {'units': 'seconds', 'value': 3600}, 'phase1_negotiation_mode': 'main', 'pfs': 'group5', 'ipsecsiteconns': []} TEST.api_ikepolicies.append(vpn_ike_policy.VpnIkePolicy(**ikepolicy_dict)) TEST.ikepolicies.add(vpn.IKEPolicy(ikepolicy_dict)) # 1st IPsec policy ipsecpolicy_dict = {'id': '8376e1dd-2b1c-4346-b23c-6989e75ecdb8', 'tenant_id': '1', 'name': 'ipsecpolicy_1', 'description': 'ipsecpolicy description', 'auth_algorithm': 'sha1', 'encapsulation_mode': 'tunnel', 'encryption_algorithm': '3des', 'lifetime': {'units': 'seconds', 'value': 3600}, 'pfs': 'group5', 'transform_protocol': 'esp', 'ipsecsiteconns': TEST.ipsecsiteconnections.list()} TEST.api_ipsecpolicies.append(vpn_ipsec_policy.VpnIpsecPolicy( **ipsecpolicy_dict)) TEST.ipsecpolicies.add(vpn.IPsecPolicy(ipsecpolicy_dict)) # 2nd IPsec policy ipsecpolicy_dict = {'id': '8376e1dd-2b1c-4346-b23c-6989e75ecdb9', 'tenant_id': '1', 'name': 'ipsecpolicy_2', 'description': 'ipsecpolicy description', 'auth_algorithm': 'sha1', 'encapsulation_mode': 'tunnel', 'encryption_algorithm': '3des', 'lifetime': {'units': 'seconds', 'value': 3600}, 'pfs': 'group5', 'transform_protocol': 'esp', 'ipsecsiteconns': []} TEST.api_ipsecpolicies.append(vpn_ipsec_policy.VpnIpsecPolicy( **ipsecpolicy_dict)) TEST.ipsecpolicies.add(vpn.IPsecPolicy(ipsecpolicy_dict)) # 1st IPsec site connection ipsecsiteconnection_dict = {'id': 'dd1dd3a0-f349-49be-b013-245e147763d6', 'tenant_id': '1', 'name': 'ipsec_connection_1', 'description': 'vpn connection description', 'dpd': {'action': 'hold', 'interval': 30, 'timeout': 120}, 'ikepolicy_id': ikepolicy_dict['id'], 'initiator': 'bi-directional', 'ipsecpolicy_id': ipsecpolicy_dict['id'], 'mtu': 1500, 'peer_address': '2607:f0d0:4545:3:200:f8ff:fe21:67cf', 'peer_cidrs': ['20.1.0.0/24', '21.1.0.0/24'], 'peer_id': '2607:f0d0:4545:3:200:f8ff:fe21:67cf', 'psk': 'secret', 'vpnservice_id': vpnservice_dict['id'], 'admin_state_up': True, 'status': 'Active'} TEST.api_ipsecsiteconnections.append( vpn_ipsec_site_connection.VpnIPSecSiteConnection( **ipsecsiteconnection_dict)) TEST.ipsecsiteconnections.add( vpn.IPsecSiteConnection(ipsecsiteconnection_dict)) # 2nd IPsec site connection ipsecsiteconnection_dict = {'id': 'dd1dd3a0-f349-49be-b013-245e147763d7', 'tenant_id': '1', 'name': 'ipsec_connection_2', 'description': 'vpn connection description', 'dpd': {'action': 'hold', 'interval': 30, 'timeout': 120}, 'ikepolicy_id': ikepolicy_dict['id'], 'initiator': 'bi-directional', 'ipsecpolicy_id': ipsecpolicy_dict['id'], 'mtu': 1500, 'peer_address': '172.0.0.2', 'peer_cidrs': ['20.1.0.0/24'], 'peer_id': '172.0.0.2', 'psk': 'secret', 'vpnservice_id': vpnservice_dict['id'], 'admin_state_up': True, 'status': 'Active'} TEST.api_ipsecsiteconnections.append( vpn_ipsec_site_connection.VpnIPSecSiteConnection( **ipsecsiteconnection_dict)) TEST.ipsecsiteconnections.add( vpn.IPsecSiteConnection(ipsecsiteconnection_dict)) ././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1790765402.28543 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard/version.py0000664000175000017500000000122415257164532024611 0ustar00zuulzuul# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # 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_vpnaas_dashboard') ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3630557 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard.egg-info/0000775000175000017500000000000015257164617024251 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1790765455.26805 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard.egg-info/PKG-INFO0000644000175000017500000000335715257164617025354 0ustar00zuulzuulMetadata-Version: 2.4 Name: neutron-vpnaas-dashboard Version: 15.0.0 Summary: Neutron VPNaaS UI for Horizon Author-email: OpenStack License-Expression: Apache-2.0 Project-URL: Bug Tracker, https://bugs.launchpad.net/neutron-vpnaas-dashboard Project-URL: Documentation, https://docs.openstack.org/neutron-vpnaas-dashboard/latest/ Project-URL: Source Code, https://opendev.org/openstack/neutron-vpnaas-dashboard Classifier: Environment :: OpenStack Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: System Administrators Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.12 Classifier: Programming Language :: Python :: 3.13 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: Implementation :: CPython Requires-Python: >=3.11 Description-Content-Type: text/x-rst License-File: LICENSE Requires-Dist: pbr!=2.1.0,>=2.0.0 Requires-Dist: horizon>=24.0.0 Requires-Dist: openstacksdk>=4.5.0 Dynamic: license-file Dynamic: requires-dist ======================== Neutron VPNaaS Dashboard ======================== .. image:: https://governance.openstack.org/tc/badges/neutron-vpnaas-dashboard.svg .. Change things from this point on OpenStack Dashboard panels for Neutron VPNaaS * Documentation: https://docs.openstack.org/neutron-vpnaas-dashboard/latest/ * Source: https://opendev.org/openstack/neutron-vpnaas-dashboard * Bugs: https://bugs.launchpad.net/neutron-vpnaas-dashboard * Release Notes: https://docs.openstack.org/releasenotes/neutron-vpnaas-dashboard/ ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3370543 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard.egg-info/SOURCES.txt0000664000175000017500000001420415257164617026136 0ustar00zuulzuul.zuul.yaml AUTHORS CONTRIBUTING.rst ChangeLog HACKING.rst LICENSE README.rst babel-django.cfg babel-djangojs.cfg manage.py pyproject.toml requirements.txt setup.cfg setup.py test-requirements.txt tox.ini devstack/README.rst devstack/plugin.sh devstack/settings doc/requirements.txt doc/source/conf.py doc/source/index.rst doc/source/configuration/index.rst doc/source/contributor/devstack-plugin.rst doc/source/contributor/index.rst doc/source/install/index.rst neutron_vpnaas_dashboard/__init__.py neutron_vpnaas_dashboard/version.py neutron_vpnaas_dashboard.egg-info/PKG-INFO neutron_vpnaas_dashboard.egg-info/SOURCES.txt neutron_vpnaas_dashboard.egg-info/dependency_links.txt neutron_vpnaas_dashboard.egg-info/not-zip-safe neutron_vpnaas_dashboard.egg-info/pbr.json neutron_vpnaas_dashboard.egg-info/requires.txt neutron_vpnaas_dashboard.egg-info/top_level.txt neutron_vpnaas_dashboard/api/__init__.py neutron_vpnaas_dashboard/api/vpn.py neutron_vpnaas_dashboard/dashboards/__init__.py neutron_vpnaas_dashboard/dashboards/project/__init__.py neutron_vpnaas_dashboard/dashboards/project/vpn/__init__.py neutron_vpnaas_dashboard/dashboards/project/vpn/forms.py neutron_vpnaas_dashboard/dashboards/project/vpn/panel.py neutron_vpnaas_dashboard/dashboards/project/vpn/tables.py neutron_vpnaas_dashboard/dashboards/project/vpn/tabs.py neutron_vpnaas_dashboard/dashboards/project/vpn/tests.py neutron_vpnaas_dashboard/dashboards/project/vpn/urls.py neutron_vpnaas_dashboard/dashboards/project/vpn/views.py neutron_vpnaas_dashboard/dashboards/project/vpn/workflows.py neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_endpoint_group_help.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_ike_policy_help.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_ipsec_policy_help.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_add_vpn_service_help.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_endpointgroup_details.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_ikepolicy_details.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_ipsecpolicy_details.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_ipsecsiteconnection_details.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_endpointgroup.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_ikepolicy.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecpolicy.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_ipsecsiteconnection.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_update_vpnservice.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_vpn_ips.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/_vpnservice_details.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/index.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_endpointgroup.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_ikepolicy.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_ipsecpolicy.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_ipsecsiteconnection.html neutron_vpnaas_dashboard/dashboards/project/vpn/templates/vpn/update_vpnservice.html neutron_vpnaas_dashboard/enabled/_7100_project_vpn_panel.py neutron_vpnaas_dashboard/enabled/__init__.py neutron_vpnaas_dashboard/locale/.placeholder neutron_vpnaas_dashboard/locale/de/LC_MESSAGES/django.po neutron_vpnaas_dashboard/locale/en_GB/LC_MESSAGES/django.po neutron_vpnaas_dashboard/locale/id/LC_MESSAGES/django.po neutron_vpnaas_dashboard/locale/ja/LC_MESSAGES/django.po neutron_vpnaas_dashboard/locale/ko_KR/LC_MESSAGES/django.po neutron_vpnaas_dashboard/locale/ru/LC_MESSAGES/django.po neutron_vpnaas_dashboard/locale/zh_Hans/LC_MESSAGES/django.po neutron_vpnaas_dashboard/test/__init__.py neutron_vpnaas_dashboard/test/helpers.py neutron_vpnaas_dashboard/test/settings.py neutron_vpnaas_dashboard/test/api_tests/__init__.py neutron_vpnaas_dashboard/test/api_tests/test_vpnaas.py neutron_vpnaas_dashboard/test/test_data/__init__.py neutron_vpnaas_dashboard/test/test_data/utils.py neutron_vpnaas_dashboard/test/test_data/vpnaas_data.py releasenotes/notes/.placeholder releasenotes/notes/add-aggressive-negotiation-mode-ad665f5cfda2e08b.yaml releasenotes/notes/add-more-formats-to-ipsec-site-connection-e105363b9125b1ed.yaml releasenotes/notes/additional-ciphers-3f04113ae14a8f0d.yaml releasenotes/notes/auth-algorithm-fbfe0831ab8dc346.yaml releasenotes/notes/django2-support-ef2f2bd52a8bb63f.yaml releasenotes/notes/drop-py-2-7-bfbdac2889ac051a.yaml releasenotes/notes/drop-python-3-6-and-3-7-39c229fcb744870f.yaml releasenotes/notes/endpoint-group-3bb4083130952d17.yaml releasenotes/notes/remove-python39.yaml releasenotes/notes/split-out-from-horizon-4807f953d5dc0799.yaml releasenotes/source/2023.1.rst releasenotes/source/2023.2.rst releasenotes/source/2024.1.rst releasenotes/source/2024.2.rst releasenotes/source/2025.1.rst releasenotes/source/2025.2.rst releasenotes/source/2026.1.rst releasenotes/source/conf.py releasenotes/source/index.rst releasenotes/source/pike.rst releasenotes/source/queens.rst releasenotes/source/rocky.rst releasenotes/source/stein.rst releasenotes/source/train.rst releasenotes/source/unreleased.rst releasenotes/source/ussuri.rst releasenotes/source/victoria.rst releasenotes/source/wallaby.rst releasenotes/source/xena.rst releasenotes/source/yoga.rst releasenotes/source/zed.rst releasenotes/source/locale/cs/LC_MESSAGES/releasenotes.po releasenotes/source/locale/de/LC_MESSAGES/releasenotes.po releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po releasenotes/source/locale/es/LC_MESSAGES/releasenotes.po releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po releasenotes/source/locale/id/LC_MESSAGES/releasenotes.po releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po releasenotes/source/locale/pt_BR/LC_MESSAGES/releasenotes.po releasenotes/source/locale/ru/LC_MESSAGES/releasenotes.po releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1790765455.26805 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard.egg-info/dependency_links.txt0000664000175000017500000000000115257164617030317 0ustar00zuulzuul ././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1790765455.26805 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard.egg-info/not-zip-safe0000664000175000017500000000000115257164617026477 0ustar00zuulzuul ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.2810507 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard.egg-info/pbr.json0000664000175000017500000000005615257164617025730 0ustar00zuulzuul{"git_version": "dae6a7a", "is_release": true}././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1790765455.26805 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard.egg-info/requires.txt0000664000175000017500000000006715257164617026654 0ustar00zuulzuulpbr!=2.1.0,>=2.0.0 horizon>=24.0.0 openstacksdk>=4.5.0 ././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1790765455.26905 neutron_vpnaas_dashboard-15.0.0/neutron_vpnaas_dashboard.egg-info/top_level.txt0000664000175000017500000000003115257164617026775 0ustar00zuulzuulneutron_vpnaas_dashboard ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.322436 neutron_vpnaas_dashboard-15.0.0/pyproject.toml0000664000175000017500000000227115257164532020420 0ustar00zuulzuul[build-system] requires = ["pbr>=6.1.1"] build-backend = "pbr.build" [project] name = "neutron-vpnaas-dashboard" description = "Neutron VPNaaS UI for Horizon" authors = [ {name = "OpenStack", email = "openstack-discuss@lists.openstack.org"}, ] readme = {file = "README.rst", content-type = "text/x-rst"} license = "Apache-2.0" dynamic = ["version", "dependencies"] requires-python = ">=3.11" classifiers = [ "Environment :: OpenStack", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation :: CPython", ] [project.urls] "Bug Tracker" = "https://bugs.launchpad.net/neutron-vpnaas-dashboard" "Documentation" = "https://docs.openstack.org/neutron-vpnaas-dashboard/latest/" "Source Code" = "https://opendev.org/openstack/neutron-vpnaas-dashboard" [tool.setuptools] packages = [ "neutron_vpnaas_dashboard" ] ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.350055 neutron_vpnaas_dashboard-15.0.0/releasenotes/0000775000175000017500000000000015257164617020177 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3790567 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/0000775000175000017500000000000015257164617021327 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003200000000000010210 xustar0026 mtime=1790765402.28543 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/.placeholder0000664000175000017500000000000015257164532023574 0ustar00zuulzuul././@PaxHeader0000000000000000000000000000021400000000000010212 xustar00114 path=neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/add-aggressive-negotiation-mode-ad665f5cfda2e08b.yaml 26 mtime=1790765402.28543 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/add-aggressive-negotiation-mode-ad665f5cfda2e08b.0000664000175000017500000000015715257164532032111 0ustar00zuulzuul--- features: - | The ``phase1 negotiation mode`` supports the ``aggressive`` option for IKE policy. ././@PaxHeader0000000000000000000000000000022600000000000010215 xustar00124 path=neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/add-more-formats-to-ipsec-site-connection-e105363b9125b1ed.yaml 26 mtime=1790765402.28543 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/add-more-formats-to-ipsec-site-connection-e1053630000664000175000017500000000033715257164532032136 0ustar00zuulzuul--- fixes: - | Add support the attributes of IPsec site connection to be able to get more formats like FQDN other than IP format. For more information, see bug `1261127 `_. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2864301 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/additional-ciphers-3f04113ae14a8f0d.yaml0000664000175000017500000000067715257164532030161 0ustar00zuulzuul--- features: - | VPNaaS dashboard now supports additional algorithms introduced in neutron-vpnaas: - Auth algorithms: aes-xcbc, aes-cmac. - Encryption algorithms: AES-CTR (aes-128-ctr, aes-192-ctr, aes-256-ctr), AES-CCM with 8/12/16-octet ICV (aes-*-ccm-8, aes-*-ccm-12, aes-*-ccm-16), and AES-GCM with 8/12/16-octet ICV (aes-*-gcm-8, aes-*-gcm-12, aes-*-gcm-16). - PFS groups: group15 through group31. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2864301 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/auth-algorithm-fbfe0831ab8dc346.yaml0000664000175000017500000000031715257164532027510 0ustar00zuulzuul--- features: - | neutron-vpnaas-dashboard now supports all auth algorithms. neutron-vpnaas supports sha1, sha256, sha384, sha512 for IKE policy auth_algorithm and IPsec policy auth_algorithm. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2864301 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/django2-support-ef2f2bd52a8bb63f.yaml0000664000175000017500000000031115257164532027673 0ustar00zuulzuul--- upgrade: - | Supported django versions are chagned aligning with the supported versions by horizon. Django 1.11 and 2.0 are supported now. Django 1.8 to 1.10 are no longer supported. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2864301 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/drop-py-2-7-bfbdac2889ac051a.yaml0000664000175000017500000000035715257164532026536 0ustar00zuulzuul--- upgrade: - | Python 2.7 support has been dropped. Last release of neutron-vpnaas- dashboard to support Python 2.7 is OpenStack Train. The minimum version of Python now supported by neutron-vpnaas-dashboard is Python 3.6. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2864301 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/drop-python-3-6-and-3-7-39c229fcb744870f.yaml0000664000175000017500000000020115257164532030202 0ustar00zuulzuul--- upgrade: - | Python 3.6 & 3.7 support has been dropped. The minimum version of Python now supported is Python 3.8. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2864301 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/endpoint-group-3bb4083130952d17.yaml0000664000175000017500000000010015257164532027133 0ustar00zuulzuul--- features: - | Add support for Endpoint Group feature. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2864301 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/remove-python39.yaml0000664000175000017500000000016615257164532025202 0ustar00zuulzuul--- upgrade: - | Support for Python 3.9 has been removed. Now the minimum python version supported is 3.10. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2864301 neutron_vpnaas_dashboard-15.0.0/releasenotes/notes/split-out-from-horizon-4807f953d5dc0799.yaml0000664000175000017500000000066315257164532030703 0ustar00zuulzuul--- prelude: > Neutron VPNaaS support in the OpenStack Dashboard is now split out into a separate python package. features: - | Neutron VPNaaS support in the OpenStack Dashboard is now split out into a separate package ``neutron-vpnaas-dashboard``. You need to install ``neutron-vpnaas-dashboard`` after upgrading the OpenStack Dashboard to Pike release and add ``enabled`` file for Neutron VPNaaS dashboard. ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.384057 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/0000775000175000017500000000000015257164617021477 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2874303 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/2023.1.rst0000664000175000017500000000021015257164532022743 0ustar00zuulzuul=========================== 2023.1 Series Release Notes =========================== .. release-notes:: :branch: unmaintained/2023.1 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2874303 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/2023.2.rst0000664000175000017500000000020215257164532022745 0ustar00zuulzuul=========================== 2023.2 Series Release Notes =========================== .. release-notes:: :branch: stable/2023.2 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2874303 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/2024.1.rst0000664000175000017500000000021015257164532022744 0ustar00zuulzuul=========================== 2024.1 Series Release Notes =========================== .. release-notes:: :branch: unmaintained/2024.1 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2874303 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/2024.2.rst0000664000175000017500000000020215257164532022746 0ustar00zuulzuul=========================== 2024.2 Series Release Notes =========================== .. release-notes:: :branch: stable/2024.2 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2874303 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/2025.1.rst0000664000175000017500000000020215257164532022746 0ustar00zuulzuul=========================== 2025.1 Series Release Notes =========================== .. release-notes:: :branch: stable/2025.1 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2884305 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/2025.2.rst0000664000175000017500000000020215257164532022747 0ustar00zuulzuul=========================== 2025.2 Series Release Notes =========================== .. release-notes:: :branch: stable/2025.2 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2884305 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/2026.1.rst0000664000175000017500000000020215257164532022747 0ustar00zuulzuul=========================== 2026.1 Series Release Notes =========================== .. release-notes:: :branch: stable/2026.1 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2894306 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/conf.py0000664000175000017500000001511515257164532022775 0ustar00zuulzuul# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. # Glance Release Notes documentation build configuration file, created by # sphinx-quickstart on Tue Nov 3 17:40:50 2015. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'reno.sphinxext', 'openstackdocstheme', ] # openstackdocstheme options openstackdocs_repo_name = 'openstack/neutron-vpnaas-dashboard' openstackdocs_auto_name = False openstackdocs_bug_project = 'neutron-vpnaas-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 = 'Neutron VPNaaS Dashboard Release Notes' copyright = '2017, OpenStack Foundation' # Release notes are version independent. # The full version, including alpha/beta/rc tags. release = '' # The short X.Y version. version = '' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all # documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'native' # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'openstackdocs' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = [] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If 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 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 = 'neutronvpnaasdashboardReleaseNotesdoc' # -- Options for Internationalization output ------------------------------ locale_dirs = ['locale/'] ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.322436 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/index.rst0000664000175000017500000000051515257164532023335 0ustar00zuulzuul====================================== Neutron VPNaaS Dashboard Release Notes ====================================== .. toctree:: :maxdepth: 1 unreleased 2026.1 2025.2 2025.1 2024.2 2024.1 2023.2 2023.1 zed yoga xena wallaby victoria ussuri train stein rocky queens pike ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3540552 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/0000775000175000017500000000000015257164617022736 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3510551 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/cs/0000775000175000017500000000000015257164617023343 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.384057 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/cs/LC_MESSAGES/0000775000175000017500000000000015257164617025130 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2904308 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/cs/LC_MESSAGES/releasenotes.po0000664000175000017500000000150015257164532030151 0ustar00zuulzuul# Lenka Husáková , 2016. #zanata # Zbyněk Schwarz , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: Neutron VPNaaS Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-03-11 08:02+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-11-17 09:06+0000\n" "Last-Translator: Zbyněk Schwarz \n" "Language-Team: Czech\n" "Language: cs\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" msgid "Bug Fixes" msgstr "Opravy chyb" msgid "Current Series Release Notes" msgstr "Poznámky k vydání současné verze" msgid "Pike Series Release Notes" msgstr "Poznámky k vydání verze Pike" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3510551 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/de/0000775000175000017500000000000015257164617023326 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.384057 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/de/LC_MESSAGES/0000775000175000017500000000000015257164617025113 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2904308 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/de/LC_MESSAGES/releasenotes.po0000664000175000017500000001063515257164532030145 0ustar00zuulzuul# Frank Kloeker , 2017. #zanata # Robert Simai , 2017. #zanata # Robert Simai , 2018. #zanata # Andreas Jaeger , 2019. #zanata # Andreas Jaeger , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: Neutron VPNaaS Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-03-02 23:00+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-10-05 06:36+0000\n" "Last-Translator: Andreas Jaeger \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "0.1.0" msgstr "0.1.0" msgid "1.1.0" msgstr "1.1.0" msgid "1.2.0" msgstr "1.2.0" msgid "1.3.0" msgstr "1.3.0" msgid "1.5.0" msgstr "1.5.0" msgid "2.0.0" msgstr "2.0.0" msgid "Add support for Endpoint Group feature." msgstr "Unterstützung für das Endpunkt-Gruppenfeature hinzugefügt." msgid "" "Add support the attributes of IPsec site connection to be able to get more " "formats like FQDN other than IP format. For more information, see bug " "`1261127 `_." msgstr "" "Unterstützung für Attribute der IPsec Site Connection hinzugefügt, um " "weitere Formate wie FQDN anstatt des IP Formats zu ermöglichen. Weitere " "Informationen finden Sie in Bug `1261127 `_." msgid "Bug Fixes" msgstr "Fehlerkorrekturen" msgid "Current Series Release Notes" msgstr "Aktuelle Serie Releasenotes" msgid "Neutron VPNaaS Dashboard Release Notes" msgstr "Neutron VPNaaS Dashboard Releasenotes" msgid "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate package ``neutron-vpnaas-dashboard``. You need to install ``neutron-" "vpnaas-dashboard`` after upgrading the OpenStack Dashboard to Pike release " "and add ``enabled`` file for Neutron VPNaaS dashboard." msgstr "" "Neutron VPNaaS Unterstützung im OpenStack Dashboard wurde ins separate Paket " "``neutron-vpnaas-dashboard`` ausgelagert. Sie müssen ``neutron-vpnaas-" "dashboard`` nach einem Upgrade des OpenStack Dashboards zum Pike Release " "installieren und eine ``enabled`` in der Datei für das Neutron VPNaaS " "Dashboard hinzufügen." msgid "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate python package." msgstr "" "Neutron VPNaaS Unterstützung im OpenStack Dashboard wurde in ein separates " "Python-Paket ausgelagert." msgid "New Features" msgstr "Neue Funktionen" msgid "Pike Series Release Notes" msgstr "Pike Serie Release Notes" msgid "Prelude" msgstr "Einleitung" msgid "" "Python 2.7 support has been dropped. Last release of neutron-vpnaas- " "dashboard to support Python 2.7 is OpenStack Train. The minimum version of " "Python now supported by neutron-vpnaas-dashboard is Python 3.6." msgstr "" "Python 2.7 Unterstützung wurde beendet. Der letzte Release von neutron-" "vpnaas-dashboard der Python 2.7 unterstützt ist OpenStack Train. Die minimal " "Python Version welche von neutron-vpnaas-dashboard unterstützt wird, ist " "Python 3.6." msgid "Queens Series Release Notes" msgstr "Queens Serie Releasenotes" msgid "Rocky Series Release Notes" msgstr "Rocky Serie Releasenotes" msgid "Stein Series Release Notes" msgstr "Stein Serie Releasenotes" msgid "" "Supported django versions are chagned aligning with the supported versions " "by horizon. Django 1.11 and 2.0 are supported now. Django 1.8 to 1.10 are no " "longer supported." msgstr "" "Unterstützte Django-Versionen ändern sich mit der von Horizon unterstützten " "Versionen. Django 1.11 und 2.0 werden jetzt unterstützt. Django 1.8 bis 1.10 " "werden nicht mehr unterstützt." msgid "Train Series Release Notes" msgstr "Train Serie Releasenotes" msgid "Upgrade Notes" msgstr "Aktualisierungsnotizen" msgid "Ussuri Series Release Notes" msgstr "Ussuri Serie Releasenotes" msgid "Victoria Series Release Notes" msgstr "Victoria Serie Releasenotes" msgid "" "neutron-vpnaas-dashboard now supports all auth algorithms. neutron-vpnaas " "supports sha1, sha256, sha384, sha512 for IKE policy auth_algorithm and " "IPsec policy auth_algorithm." msgstr "" "Neutron-VPNaaS-dashboard unterstützt nun alle Auth Algorithmen, Neutron-" "VPNaaS unterstützt SHA1, SHA256, SHA384, SHA512 als IKE Policy Auth " "Algorithmus und IPsec Policy Auth-Algorithmus." ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3510551 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/en_GB/0000775000175000017500000000000015257164617023710 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.384057 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/en_GB/LC_MESSAGES/0000775000175000017500000000000015257164617025475 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.322436 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po0000664000175000017500000001534615257164532030533 0ustar00zuulzuul# Andi Chandler , 2017. #zanata # Andi Chandler , 2018. #zanata # Andi Chandler , 2019. #zanata # Andi Chandler , 2020. #zanata # Andi Chandler , 2022. #zanata # Andi Chandler , 2023. #zanata # Andi Chandler , 2024. #zanata # Andi Chandler , 2026. #zanata msgid "" msgstr "" "Project-Id-Version: Neutron VPNaaS Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-08-06 10:10+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2026-08-08 08:58+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom)\n" "Language: en_GB\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "0.1.0" msgstr "0.1.0" msgid "1.1.0" msgstr "1.1.0" msgid "1.2.0" msgstr "1.2.0" msgid "1.3.0" msgstr "1.3.0" msgid "1.5.0" msgstr "1.5.0" msgid "14.0.0" msgstr "14.0.0" msgid "2.0.0" msgstr "2.0.0" msgid "2023.1 Series Release Notes" msgstr "2023.1 Series Release Notes" msgid "2023.2 Series Release Notes" msgstr "2023.2 Series Release Notes" msgid "2024.1 Series Release Notes" msgstr "2024.1 Series Release Notes" msgid "2024.2 Series Release Notes" msgstr "2024.2 Series Release Notes" msgid "2025.1 Series Release Notes" msgstr "2025.1 Series Release Notes" msgid "2025.2 Series Release Notes" msgstr "2025.2 Series Release Notes" msgid "2026.1 Series Release Notes" msgstr "2026.1 Series Release Notes" msgid "3.0.0" msgstr "3.0.0" msgid "7.0.0" msgstr "7.0.0" msgid "Add support for Endpoint Group feature." msgstr "Add support for Endpoint Group feature." msgid "" "Add support the attributes of IPsec site connection to be able to get more " "formats like FQDN other than IP format. For more information, see bug " "`1261127 `_." msgstr "" "Add support the attributes of IPsec site connection to be able to get more " "formats like FQDN other than IP format. For more information, see bug " "`1261127 `_." msgid "Auth algorithms: aes-xcbc, aes-cmac." msgstr "Auth algorithms: aes-xcbc, aes-cmac." msgid "Bug Fixes" msgstr "Bug Fixes" msgid "Current Series Release Notes" msgstr "Current Series Release Notes" msgid "" "Encryption algorithms: AES-CTR (aes-128-ctr, aes-192-ctr, aes-256-ctr), AES-" "CCM with 8/12/16-octet ICV (aes-*-ccm-8, aes-*-ccm-12, aes-*-ccm-16), and " "AES-GCM with 8/12/16-octet ICV (aes-*-gcm-8, aes-*-gcm-12, aes-*-gcm-16)." msgstr "" "Encryption algorithms: AES-CTR (aes-128-ctr, aes-192-ctr, aes-256-ctr), AES-" "CCM with 8/12/16-octet ICV (aes-*-ccm-8, aes-*-ccm-12, aes-*-ccm-16), and " "AES-GCM with 8/12/16-octet ICV (aes-*-gcm-8, aes-*-gcm-12, aes-*-gcm-16)." msgid "Neutron VPNaaS Dashboard Release Notes" msgstr "Neutron VPNaaS Dashboard Release Notes" msgid "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate package ``neutron-vpnaas-dashboard``. You need to install ``neutron-" "vpnaas-dashboard`` after upgrading the OpenStack Dashboard to Pike release " "and add ``enabled`` file for Neutron VPNaaS dashboard." msgstr "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate package ``neutron-vpnaas-dashboard``. You need to install ``neutron-" "vpnaas-dashboard`` after upgrading the OpenStack Dashboard to Pike release " "and add ``enabled`` file for Neutron VPNaaS dashboard." msgid "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate python package." msgstr "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate Python package." msgid "New Features" msgstr "New Features" msgid "PFS groups: group15 through group31." msgstr "PFS groups: group15 through group31." msgid "Pike Series Release Notes" msgstr "Pike Series Release Notes" msgid "Prelude" msgstr "Prelude" msgid "" "Python 2.7 support has been dropped. Last release of neutron-vpnaas- " "dashboard to support Python 2.7 is OpenStack Train. The minimum version of " "Python now supported by neutron-vpnaas-dashboard is Python 3.6." msgstr "" "Python 2.7 support has been dropped. Last release of neutron-vpnaas- " "dashboard to support Python 2.7 is OpenStack Train. The minimum version of " "Python now supported by neutron-vpnaas-dashboard is Python 3.6." msgid "" "Python 3.6 & 3.7 support has been dropped. The minimum version of Python now " "supported is Python 3.8." msgstr "" "Python 3.6 & 3.7 support has been dropped. The minimum version of Python now " "supported is Python 3.8." msgid "Queens Series Release Notes" msgstr "Queens Series Release Notes" msgid "Rocky Series Release Notes" msgstr "Rocky Series Release Notes" msgid "Stein Series Release Notes" msgstr "Stein Series Release Notes" msgid "" "Support for Python 3.9 has been removed. Now the minimum python version " "supported is 3.10." msgstr "" "Support for Python 3.9 has been removed. Now the minimum Python version " "supported is 3.10." msgid "" "Supported django versions are chagned aligning with the supported versions " "by horizon. Django 1.11 and 2.0 are supported now. Django 1.8 to 1.10 are no " "longer supported." msgstr "" "Supported Django versions are changed aligning with the supported versions " "by Horizon. Django 1.11 and 2.0 are supported now. Django 1.8 to 1.10 are no " "longer supported." msgid "" "The ``phase1 negotiation mode`` supports the ``aggressive`` option for IKE " "policy." msgstr "" "The ``phase1 negotiation mode`` supports the ``aggressive`` option for IKE " "policy." msgid "Train Series Release Notes" msgstr "Train Series Release Notes" msgid "Upgrade Notes" msgstr "Upgrade Notes" msgid "Ussuri Series Release Notes" msgstr "Ussuri Series Release Notes" msgid "" "VPNaaS dashboard now supports additional algorithms introduced in neutron-" "vpnaas:" msgstr "" "VPNaaS dashboard now supports additional algorithms introduced in neutron-" "vpnaas:" msgid "Victoria Series Release Notes" msgstr "Victoria Series Release Notes" msgid "Wallaby Series Release Notes" msgstr "Wallaby Series Release Notes" msgid "Xena Series Release Notes" msgstr "Xena Series Release Notes" msgid "Yoga Series Release Notes" msgstr "Yoga Series Release Notes" msgid "Zed Series Release Notes" msgstr "Zed Series Release Notes" msgid "" "neutron-vpnaas-dashboard now supports all auth algorithms. neutron-vpnaas " "supports sha1, sha256, sha384, sha512 for IKE policy auth_algorithm and " "IPsec policy auth_algorithm." msgstr "" "neutron-vpnaas-dashboard now supports all auth algorithms. neutron-vpnaas " "supports sha1, sha256, sha384, sha512 for IKE policy auth_algorithm and " "IPsec policy auth_algorithm." ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.352055 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/es/0000775000175000017500000000000015257164617023345 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3850572 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/es/LC_MESSAGES/0000775000175000017500000000000015257164617025132 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.291431 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/es/LC_MESSAGES/releasenotes.po0000664000175000017500000000142415257164532030160 0ustar00zuulzuul# Jose Porrua , 2016. #zanata # Eduardo Gonzalez Gutierrez , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: Neutron VPNaaS Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-03-11 08:02+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-09-27 03:49+0000\n" "Last-Translator: Eduardo Gonzalez Gutierrez \n" "Language-Team: Spanish\n" "Language: es\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "Bug Fixes" msgstr "Corrección de errores" msgid "Current Series Release Notes" msgstr "Notas de la versión actual" msgid "New Features" msgstr "Nuevas Funcionalidades" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.352055 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/fr/0000775000175000017500000000000015257164617023345 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3850572 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/fr/LC_MESSAGES/0000775000175000017500000000000015257164617025132 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.291431 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po0000664000175000017500000000161215257164532030157 0ustar00zuulzuul# Gérald LONLAS , 2016. #zanata # Gaelle , 2017. #zanata # Loic Nicolle , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: Neutron VPNaaS Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-02-08 08:19+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-11-14 07:50+0000\n" "Last-Translator: Gaelle \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "0.1.0" msgstr "0.1.0" msgid "Bug Fixes" msgstr "Corrections de bugs" msgid "Current Series Release Notes" msgstr "Notes sur la Release Actuelle" msgid "New Features" msgstr "Nouvelles fonctionnalités" msgid "Pike Series Release Notes" msgstr "Note de release pour Pike" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765455.352055 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/id/0000775000175000017500000000000015257164617023332 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3850572 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/id/LC_MESSAGES/0000775000175000017500000000000015257164617025117 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.292431 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/id/LC_MESSAGES/releasenotes.po0000664000175000017500000000671015257164532030150 0ustar00zuulzuul# suhartono , 2017. #zanata # suhartono , 2018. #zanata # suhartono , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: neutron-vpnaas-dashboard\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-05-11 06:40+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-07-16 06:43+0000\n" "Last-Translator: suhartono \n" "Language-Team: Indonesian\n" "Language: id\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "0.1.0" msgstr "0.1.0" msgid "1.1.0" msgstr "1.1.0" msgid "1.2.0" msgstr "1.2.0" msgid "1.3.0" msgstr "1.3.0" msgid "1.5.0" msgstr "1.5.0" msgid "Add support for Endpoint Group feature." msgstr "Tambahkan dukungan untuk fitur Endpoint Group." msgid "" "Add support the attributes of IPsec site connection to be able to get more " "formats like FQDN other than IP format. For more information, see bug " "`1261127 `_." msgstr "" "Tambahkan dukungan atribut koneksi situs IPsec agar bisa mendapatkan lebih " "banyak format seperti FQDN selain dari format IP. Untuk informasi lebih " "lanjut, lihat bug `1261127 ` _." msgid "Bug Fixes" msgstr "Perbaikan bug" msgid "Current Series Release Notes" msgstr "Catatan rilis seri saat ini" msgid "Neutron VPNaaS Dashboard Release Notes" msgstr "Catatan Rilis Neutron VPNaaS Dashboard" msgid "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate package ``neutron-vpnaas-dashboard``. You need to install ``neutron-" "vpnaas-dashboard`` after upgrading the OpenStack Dashboard to Pike release " "and add ``enabled`` file for Neutron VPNaaS dashboard." msgstr "" "Dukungan Neutron VPNaaS di Dasbor OpenStack kini dipisah menjadi paket " "terpisah ``neutron-vpnaas-dashboard``. Anda perlu menginstal ``neutron-" "vpnaas-dashboard`` setelah memutakhirkan OpenStack Dashboard ke rilis Pike " "dan menambahkan ``enabled`` file untuk dashboard Neutron VPNaaS." msgid "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate python package." msgstr "" "Dukungan Neutron VPNaaS di Dasbor OpenStack kini dibagi menjadi paket python " "terpisah." msgid "New Features" msgstr "Fitur baru" msgid "Pike Series Release Notes" msgstr "Catatan Rilis Seri Pike" msgid "Prelude" msgstr "Prelude" msgid "Queens Series Release Notes" msgstr "Catatan Rilis Seri Queens" msgid "Rocky Series Release Notes" msgstr "Catatan Rilis Seri Rocky" msgid "Stein Series Release Notes" msgstr "Catatan Rilis Seri Stein" msgid "" "Supported django versions are chagned aligning with the supported versions " "by horizon. Django 1.11 and 2.0 are supported now. Django 1.8 to 1.10 are no " "longer supported." msgstr "" "Versi django yang didukung diubah sejajar dengan versi yang didukung oleh " "horizon. Django 1,11 dan 2,0 didukung sekarang. Django 1.8 hingga 1.10 tidak " "lagi didukung." msgid "Upgrade Notes" msgstr "Catatan Upgrade" msgid "" "neutron-vpnaas-dashboard now supports all auth algorithms. neutron-vpnaas " "supports sha1, sha256, sha384, sha512 for IKE policy auth_algorithm and " "IPsec policy auth_algorithm." msgstr "" "neutron-vpnaas-dashboard sekarang mendukung semua algoritma auth. neutron-" "vpnaas mendukung sha1, sha256, sha384, sha512 untuk IKE policy " "auth_algorithm dan IPsec policy auth_algorithm." ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3530552 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/ja/0000775000175000017500000000000015257164617023330 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3850572 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/ja/LC_MESSAGES/0000775000175000017500000000000015257164617025115 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.292431 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po0000664000175000017500000000204615257164532030144 0ustar00zuulzuul# Akihiro Motoki , 2017. #zanata # Hidekazu Nakamura , 2017. #zanata # Shu Muto , 2017. #zanata # Yuko Fukuda , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: Neutron VPNaaS Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-02-08 08:19+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-10-12 05:59+0000\n" "Last-Translator: Yuko Fukuda \n" "Language-Team: Japanese\n" "Language: ja\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "0.1.0" msgstr "0.1.0" msgid "1.1.0" msgstr "1.1.0" msgid "Bug Fixes" msgstr "バグ修正" msgid "Current Series Release Notes" msgstr "開発中バージョンのリリースノート" msgid "New Features" msgstr "新機能" msgid "Pike Series Release Notes" msgstr "Pike バージョンのリリースノート" msgid "Prelude" msgstr "前置" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3530552 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/ko_KR/0000775000175000017500000000000015257164617023743 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3860571 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/ko_KR/LC_MESSAGES/0000775000175000017500000000000015257164617025530 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.292431 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po0000664000175000017500000000310615257164532030555 0ustar00zuulzuul# ByungYeol Woo , 2017. #zanata # SEOKJAE BARK , 2017. #zanata # Sungjin Kang , 2017. #zanata # minwook-shin , 2017. #zanata # ByungYeol Woo , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: neutron-vpnaas-dashboard\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-26 14:23+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-10-02 04:11+0000\n" "Last-Translator: ByungYeol Woo \n" "Language-Team: Korean (South Korea)\n" "Language: ko_KR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "0.1.0" msgstr "0.1.0" msgid "1.1.0" msgstr "1.1.0" msgid "1.2.0" msgstr "1.2.0" msgid "1.3.0" msgstr "1.3.0" msgid "1.5.0" msgstr "1.5.0" msgid "Add support for Endpoint Group feature." msgstr "엔드포인트 그룹 기능 추가" msgid "Bug Fixes" msgstr "버그 수정" msgid "Current Series Release Notes" msgstr "최신 시리즈에 대한 릴리즈 노트" msgid "Neutron VPNaaS Dashboard Release Notes" msgstr "Neutron VPNaaS 대시보드 릴리즈 노트" msgid "New Features" msgstr "새로운 기능" msgid "Pike Series Release Notes" msgstr "Pike 시리즈 릴리즈 노트" msgid "Prelude" msgstr "서문" msgid "Queens Series Release Notes" msgstr "Queens 시리즈 릴리즈 노트" msgid "Rocky Series Release Notes" msgstr "Rocky 시리즈 릴리즈 노트" msgid "Stein Series Release Notes" msgstr "Stein 시리즈 릴리즈 노트" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3530552 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/pt_BR/0000775000175000017500000000000015257164617023744 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3860571 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/pt_BR/LC_MESSAGES/0000775000175000017500000000000015257164617025531 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.292431 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/pt_BR/LC_MESSAGES/releasenotes.po0000664000175000017500000000151615257164532030561 0ustar00zuulzuul# Rodrigo Loures , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: Neutron VPNaaS Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-01 16:15+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-01-25 10:14+0000\n" "Last-Translator: Rodrigo Loures \n" "Language-Team: Portuguese (Brazil)\n" "Language: pt_BR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "Bug Fixes" msgstr "Correção de erros" msgid "Current Series Release Notes" msgstr "Atual - Séries de Notas de Versão" msgid "New Features" msgstr "Novos recursos" msgid "Pike Series Release Notes" msgstr "Pike - Série de Notas de Versão" msgid "Prelude" msgstr "Prelúdio" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3530552 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/ru/0000775000175000017500000000000015257164617023364 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3860571 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/ru/LC_MESSAGES/0000775000175000017500000000000015257164617025151 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.3234363 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/ru/LC_MESSAGES/releasenotes.po0000664000175000017500000002047515257164532030206 0ustar00zuulzuul# Alexander , 2016. #zanata # Roman Gorshunov , 2020. #zanata # Dmitriy Chubinidze , 2025. #zanata # Ivan Anfimov , 2025. #zanata # Dmitriy Chubinidze , 2026. #zanata # Ivan Anfimov , 2026. #zanata msgid "" msgstr "" "Project-Id-Version: Neutron VPNaaS Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-05-08 19:57+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2026-04-12 10:06+0000\n" "Last-Translator: Ivan Anfimov \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 "0.1.0" msgstr "0.1.0" msgid "1.1.0" msgstr "1.1.0" msgid "1.2.0" msgstr "1.2.0" msgid "1.3.0" msgstr "1.3.0" msgid "1.5.0" msgstr "1.5.0" msgid "14.0.0" msgstr "14.0.0" msgid "2.0.0" msgstr "2.0.0" msgid "2023.1 Series Release Notes" msgstr "Примечания к выпуску 2023.1" msgid "2023.2 Series Release Notes" msgstr "Примечания к выпуску 2023.2" msgid "2024.1 Series Release Notes" msgstr "Примечания к выпуску 2024.1" msgid "2024.2 Series Release Notes" msgstr "Примечания к выпуску 2024.2" msgid "2025.1 Series Release Notes" msgstr "Примечания к выпуску 2025.1" msgid "2025.2 Series Release Notes" msgstr "Примечания к выпуску 2025.2" msgid "2026.1 Series Release Notes" msgstr "Примечания к выпуску 2026.1" msgid "3.0.0" msgstr "3.0.0" msgid "7.0.0" msgstr "7.0.0" msgid "Add support for Endpoint Group feature." msgstr "Добавлена поддержка группы точки доступа." msgid "" "Add support the attributes of IPsec site connection to be able to get more " "formats like FQDN other than IP format. For more information, see bug " "`1261127 `_." msgstr "" "Добавлена поддержка атрибутов подключения к IPsec, чтобы можно было получать " "больше форматов, таких как полное доменное имя (FQDN), помимо формата IP. " "Подробнее см. ошибку `1261127 `_." msgid "Auth algorithms: aes-xcbc, aes-cmac." msgstr "Алгоритмы аутентификации: aes-xcbc, aes-cmac." msgid "Bug Fixes" msgstr "Исправления ошибок" msgid "Current Series Release Notes" msgstr "Примечания к текущему выпуску" msgid "" "Encryption algorithms: AES-CTR (aes-128-ctr, aes-192-ctr, aes-256-ctr), AES-" "CCM with 8/12/16-octet ICV (aes-*-ccm-8, aes-*-ccm-12, aes-*-ccm-16), and " "AES-GCM with 8/12/16-octet ICV (aes-*-gcm-8, aes-*-gcm-12, aes-*-gcm-16)." msgstr "" "Алгоритмы шифрования: AES-CTR (aes-128-ctr, aes-192-ctr, aes-256-ctr), AES-" "CCM с ICV 8/12/16-октетов (aes-*-ccm-8, aes-*-ccm-12, aes-*-ccm-16) и AES-" "GCM с ICV 8/12/16-октетов (aes-*-gcm-8, aes-*-gcm-12, aes-*-gcm-16)." msgid "Neutron VPNaaS Dashboard Release Notes" msgstr "Примечания к выпуску панели управления Neutron VPNaaS" msgid "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate package ``neutron-vpnaas-dashboard``. You need to install ``neutron-" "vpnaas-dashboard`` after upgrading the OpenStack Dashboard to Pike release " "and add ``enabled`` file for Neutron VPNaaS dashboard." msgstr "" "Поддержка Neutron VPNaaS в панели управления OpenStack теперь выделена в " "отдельный Python модуль ``neutron-vpnaas-dashboard``. При обновлении панели " "управления OpenStack до релиза Pike, вам потребуется установить модуль " "``neutron-vpnaas-dashboard`` и добавить файл ``enabled`` для панели " "управления Neutron VPNaaS." msgid "" "Neutron VPNaaS support in the OpenStack Dashboard is now split out into a " "separate python package." msgstr "" "Поддержка Neutron VPNaaS в панели управления OpenStack теперь выделена в " "отдельный python модуль." msgid "New Features" msgstr "Новые возможности" msgid "PFS groups: group15 through group31." msgstr "Группы PFS: группа 15 – группа 31." msgid "Pike Series Release Notes" msgstr "Примечания к выпуску Pike" msgid "Prelude" msgstr "Предисловие" msgid "" "Python 2.7 support has been dropped. Last release of neutron-vpnaas- " "dashboard to support Python 2.7 is OpenStack Train. The minimum version of " "Python now supported by neutron-vpnaas-dashboard is Python 3.6." msgstr "" "Поддержка Python 2.7 была прекращена. Последний выпуск neutron-vpnaas- " "dashboard, поддерживающий Python 2.7 — OpenStack Train. Минимальная версия " "Python, поддерживаемая neutron-vpnaas-dashboard — Python 3.6." msgid "" "Python 3.6 & 3.7 support has been dropped. The minimum version of Python now " "supported is Python 3.8." msgstr "" "Поддержка Python 3.6 и 3.7 была прекращена. Минимальная версия Python, " "которая теперь поддерживается — Python 3.8." msgid "Queens Series Release Notes" msgstr "Примечания к выпуску Queens" msgid "Rocky Series Release Notes" msgstr "Примечания к выпуску Rocky" msgid "Stein Series Release Notes" msgstr "Примечания к выпуску Stein" msgid "" "Support for Python 3.9 has been removed. Now the minimum python version " "supported is 3.10." msgstr "" "Поддержка Python 3.9 была удалена. Минимальная версия Python, которая теперь " "поддерживается — Python 3.10." msgid "" "Supported django versions are chagned aligning with the supported versions " "by horizon. Django 1.11 and 2.0 are supported now. Django 1.8 to 1.10 are no " "longer supported." msgstr "" "Поддерживаемые версии Django изменены, чтобы соответствовать поддерживаемым " "версиям в horizon. Сейчас поддерживаются Django 1.11 и 2.0. Django версий с " "1.8 по 1.10 более не поддерживаются." msgid "" "The ``phase1 negotiation mode`` supports the ``aggressive`` option for IKE " "policy." msgstr "" "``Режим согласования phase1`` поддерживает ``агрессивный`` вариант политики " "IKE." msgid "Train Series Release Notes" msgstr "Примечания к выпуску Train" msgid "Upgrade Notes" msgstr "Примечания к обновлению" msgid "Ussuri Series Release Notes" msgstr "Примечания к выпуску Ussuri" msgid "" "VPNaaS dashboard now supports additional algorithms introduced in neutron-" "vpnaas:" msgstr "" "Панель управления VPNaaS теперь поддерживает дополнительные алгоритмы, " "представленные в neutron-vpnaas:" msgid "Victoria Series Release Notes" msgstr "Примечания к выпуску Victoria" msgid "Wallaby Series Release Notes" msgstr "Примечания к выпуску Wallaby" msgid "Xena Series Release Notes" msgstr "Примечания к выпуску Xena" msgid "Yoga Series Release Notes" msgstr "Примечания к выпуску Yoga" msgid "Zed Series Release Notes" msgstr "Примечания к выпуску Zed" msgid "" "neutron-vpnaas-dashboard now supports all auth algorithms. neutron-vpnaas " "supports sha1, sha256, sha384, sha512 for IKE policy auth_algorithm and " "IPsec policy auth_algorithm." msgstr "" "neutron-vpnaas-dashboard теперь поддерживает все алгоритмы аутентификации. " "neutron-vpnaas поддерживает sha1, sha256, sha384 и sha512 для политики IKE и " "политики IPsec auth_algorithm." ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3540552 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/zh_CN/0000775000175000017500000000000015257164617023737 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3860571 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/zh_CN/LC_MESSAGES/0000775000175000017500000000000015257164617025524 5ustar00zuulzuul././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po0000664000175000017500000000151515257164532030553 0ustar00zuulzuul# Bin , 2017. #zanata # TigerFang , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: Neutron VPNaaS Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-03-01 16:15+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-12-28 02:43+0000\n" "Last-Translator: TigerFang \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "0.1.0" msgstr "0.1.0" msgid "Bug Fixes" msgstr "修复的问题" msgid "Current Series Release Notes" msgstr "当前版本发布声明" msgid "New Features" msgstr "新功能" msgid "Pike Series Release Notes" msgstr "Pike版本发布声明" msgid "Prelude" msgstr "前奏" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/pike.rst0000664000175000017500000000017215257164532023155 0ustar00zuulzuul========================= Pike Series Release Notes ========================= .. release-notes:: :branch: stable/pike ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/queens.rst0000664000175000017500000000020215257164532023517 0ustar00zuulzuul=========================== Queens Series Release Notes =========================== .. release-notes:: :branch: stable/queens ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/rocky.rst0000664000175000017500000000017615257164532023360 0ustar00zuulzuul========================== Rocky Series Release Notes ========================== .. release-notes:: :branch: stable/rocky ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/stein.rst0000664000175000017500000000017615257164532023353 0ustar00zuulzuul========================== Stein Series Release Notes ========================== .. release-notes:: :branch: stable/stein ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/train.rst0000664000175000017500000000017615257164532023346 0ustar00zuulzuul========================== Train Series Release Notes ========================== .. release-notes:: :branch: stable/train ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/unreleased.rst0000664000175000017500000000015315257164532024353 0ustar00zuulzuul============================ Current Series Release Notes ============================ .. release-notes:: ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/ussuri.rst0000664000175000017500000000020215257164532023551 0ustar00zuulzuul=========================== Ussuri Series Release Notes =========================== .. release-notes:: :branch: stable/ussuri ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/victoria.rst0000664000175000017500000000022015257164532024037 0ustar00zuulzuul============================= Victoria Series Release Notes ============================= .. release-notes:: :branch: unmaintained/victoria ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2934313 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/wallaby.rst0000664000175000017500000000021415257164532023655 0ustar00zuulzuul============================ Wallaby Series Release Notes ============================ .. release-notes:: :branch: unmaintained/wallaby ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2944314 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/xena.rst0000664000175000017500000000020015257164532023150 0ustar00zuulzuul========================= Xena Series Release Notes ========================= .. release-notes:: :branch: unmaintained/xena ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2944314 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/yoga.rst0000664000175000017500000000020015257164532023154 0ustar00zuulzuul========================= Yoga Series Release Notes ========================= .. release-notes:: :branch: unmaintained/yoga ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2944314 neutron_vpnaas_dashboard-15.0.0/releasenotes/source/zed.rst0000664000175000017500000000017415257164532023011 0ustar00zuulzuul======================== Zed Series Release Notes ======================== .. release-notes:: :branch: unmaintained/zed ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2944314 neutron_vpnaas_dashboard-15.0.0/requirements.txt0000664000175000017500000000050115257164532020762 0ustar00zuulzuul# Requirements lower bounds listed here are our best effort to keep them up to # date but we do not test them so no guarantee of having them all correct. If # you find any incorrect lower bounds, let us know or propose a fix. pbr!=2.1.0,>=2.0.0 # Apache-2.0 horizon>=24.0.0 # Apache-2.0 openstacksdk>=4.5.0 # Apache-2.0 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765455.3870573 neutron_vpnaas_dashboard-15.0.0/setup.cfg0000664000175000017500000000012215257164617017322 0ustar00zuulzuul[metadata] name = neutron-vpnaas-dashboard [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2954316 neutron_vpnaas_dashboard-15.0.0/setup.py0000664000175000017500000000127115257164532017215 0ustar00zuulzuul# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import setuptools setuptools.setup( setup_requires=['pbr>=2.0.0'], pbr=True) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1790765402.2964318 neutron_vpnaas_dashboard-15.0.0/test-requirements.txt0000664000175000017500000000015215257164532021741 0ustar00zuulzuulhacking>=6.1.0,<6.2.0 # Apache-2.0 coverage!=4.4,>=4.0 # Apache-2.0 flake8-import-order~=0.19.0 # LGPLv3 ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1790765402.297432 neutron_vpnaas_dashboard-15.0.0/tox.ini0000664000175000017500000000424015257164532017015 0ustar00zuulzuul[tox] envlist = py3,pep8 minversion = 3.18.0 skipsdist = True [testenv] usedevelop = True deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt commands = python manage.py test {posargs} --settings=neutron_vpnaas_dashboard.test.settings [testenv:pep8] commands = flake8 {posargs} {envpython} {toxinidir}/manage.py extract_messages --module neutron_vpnaas_dashboard --verbosity 0 --check-only [testenv:venv] commands = {posargs} [testenv:cover] commands = coverage erase coverage run {toxinidir}/manage.py test neutron_vpnaas_dashboard --settings=neutron_vpnaas_dashboard.test.settings {posargs} coverage xml --omit '.tox/cover/*' -o 'cover/coverage.xml' coverage html --omit '.tox/cover/*' -d 'cover/htmlcov' [testenv:docs] deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/doc/requirements.txt commands = sphinx-build -W -b html doc/source doc/build/html [testenv:pdf-docs] deps = {[testenv:docs]deps} allowlist_externals = make commands = sphinx-build -W -b latex doc/source doc/build/pdf make -C doc/build/pdf [testenv:releasenotes] deps = {[testenv:docs]deps} commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html [flake8] exclude = .venv,.git,.tox,dist,*lib/python*,*egg,build,node_modules,.tmp # Enable the following hacking rules which are disabled by default # H203 Use assertIs(Not)None to check for None # H904 Delay string interpolations at logging calls enable-extensions = H203,H904 # W504 line break after binary operator # (W503 and W504 are incompatible and we need to choose one of them. # Existing codes follows W503, so we disable W504.) # F405 TEMPLATES may be undefined, or defined from star imports # (because it is not easy to avoid this in openstack_dashboard.test.settings) ignore = W504,F405 max-complexity = 20 # flake8-import-order configurations import-order-style = pep8 application-import-names = neutron_vpnaas_dashboard [flake8:local-plugins] extension = M322 = horizon.hacking.checks:no_mutable_default_args