diff -Nru keystone-18.0.0/ChangeLog keystone-18.0.0+git2020120911.b0b93c039/ChangeLog --- keystone-18.0.0/ChangeLog 2020-10-14 10:07:59.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/ChangeLog 2020-12-09 16:50:51.000000000 +0000 @@ -1,6 +1,12 @@ CHANGES ======= +* Generalize release note for bug 1878938 +* Implement more robust connection handling for asynchronous LDAP calls +* Imported Translations from Zanata +* Add vine to lower-constraints +* Simplify default config test + 18.0.0 ------ @@ -16,7 +22,9 @@ * Spelling Fix * NIT: Spelling Fix * Properly handle octet (byte) strings when converting LDAP responses +* Add support for functional RBAC tests * Fix invalid assertTrue which should be assertEqual +* Delete system role assignments from system\_assignment table * Fix api-ref for list endpoints * Fix lower-constraint for PyMySQL * Fix doc for package mod\_wsgi on Centos8/RHEL8 diff -Nru keystone-18.0.0/debian/changelog keystone-18.0.0+git2020120911.b0b93c039/debian/changelog --- keystone-18.0.0/debian/changelog 2020-10-15 14:04:15.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/debian/changelog 2020-12-09 16:51:18.000000000 +0000 @@ -1,3 +1,13 @@ +keystone (2:18.0.0+git2020120911.b0b93c039-0ubuntu1) hirsute; urgency=medium + + * New upstream snapshot for OpenStack Wallaby. + * d/control: Align (Build-)Depends with upstream. + * d/rules: Update PBR_VERSION for new snapshot version format. + * d/control: Set min BD version of python-oslo.db to 8.5.0+really.8.4.0 to + align with upper-constraints. + + -- Corey Bryant Wed, 09 Dec 2020 11:51:18 -0500 + keystone (2:18.0.0-0ubuntu1) groovy; urgency=medium * d/control: Update VCS paths for move to lp:~ubuntu-openstack-dev. diff -Nru keystone-18.0.0/debian/control keystone-18.0.0+git2020120911.b0b93c039/debian/control --- keystone-18.0.0/debian/control 2020-10-15 14:04:15.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/debian/control 2020-12-09 16:51:18.000000000 +0000 @@ -20,13 +20,13 @@ python3-bcrypt (>= 3.1.3), python3-coverage (>= 4.0), python3-cryptography (>= 2.7), - python3-dogpile.cache (>= 1.0.1), + python3-dogpile.cache (>= 1.0.2), python3-fixtures (>= 3.0.0), python3-flake8-docstrings (>= 0.2.1.post1), python3-flask (>= 1.0.2), python3-flask-restful (>= 0.3.5), python3-freezegun (>= 0.3.6), - python3-hacking (>= 1.1.0), + python3-hacking, python3-jsonschema (>= 3.2.0), python3-jwt (>= 1.6.1), python3-keystoneclient (>= 1:3.8.0), @@ -44,7 +44,7 @@ python3-oslo.cache (>= 1.26.0), python3-oslo.config (>= 1:5.2.0), python3-oslo.context (>= 1:2.22.0), - python3-oslo.db (>= 6.0.0), + python3-oslo.db (>= 8.5.0+really.8.4.0), python3-oslo.i18n (>= 3.15.3), python3-oslo.log (>= 3.44.0), python3-oslo.messaging (>= 5.29.0), @@ -151,7 +151,7 @@ keystone-common (= ${source:Version}), python3-bcrypt (>= 3.1.3), python3-cryptography (>= 2.7), - python3-dogpile.cache (>= 1.0.1), + python3-dogpile.cache (>= 1.0.2), python3-flask (>= 1.0.2), python3-flask-restful (>= 0.3.5), python3-jsonschema (>= 3.2.0), @@ -165,7 +165,7 @@ python3-oslo.cache (>= 1.26.0), python3-oslo.config (>= 1:5.2.0), python3-oslo.context (>= 1:2.22.0), - python3-oslo.db (>= 6.0.0), + python3-oslo.db (>= 8.5.0+really.8.4.0), python3-oslo.i18n (>= 3.15.3), python3-oslo.log (>= 3.44.0), python3-oslo.messaging (>= 5.29.0), diff -Nru keystone-18.0.0/debian/rules keystone-18.0.0+git2020120911.b0b93c039/debian/rules --- keystone-18.0.0/debian/rules 2020-10-15 14:04:15.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/debian/rules 2020-12-09 16:51:18.000000000 +0000 @@ -8,7 +8,7 @@ SHELL := /bin/sh -e DEBVERS ?= $(shell dpkg-parsechangelog | sed -n -e 's/^Version: //p') -VERSION ?= $(shell echo '$(DEBVERS)' | sed -e 's/^[[:digit:]]*://' -e 's/[-].*//' -e 's/[+].*//' -e 's/~git.*//g' -e 's/~/./g') +VERSION ?= $(shell echo '$(DEBVERS)' | sed -e 's/^[[:digit:]]*://' -e 's/[-].*//' -e 's/[+].*//' -e 's/~git.*//g' -e 's/+git.*//g' -e 's/~/./g') export PBR_VERSION=$(VERSION) include /usr/share/openstack-pkg-tools/pkgos.make diff -Nru keystone-18.0.0/devstack/lib/scope.sh keystone-18.0.0+git2020120911.b0b93c039/devstack/lib/scope.sh --- keystone-18.0.0/devstack/lib/scope.sh 1970-01-01 00:00:00.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/devstack/lib/scope.sh 2020-12-09 16:50:47.000000000 +0000 @@ -0,0 +1,26 @@ +# Copyright 2019 SUSE LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +function configure_enforce_scope { + iniset $KEYSTONE_CONF oslo_policy enforce_scope true + iniset $KEYSTONE_CONF oslo_policy policy_file policy.yaml + sudo systemctl restart devstack@keystone + oslopolicy-policy-generator --namespace keystone > /etc/keystone/policy.yaml +} + +function configure_protection_tests { + iniset $TEMPEST_CONFIG identity-feature-enabled enforce_scope true + iniset $TEMPEST_CONFIG auth admin_system true + iniset $TEMPEST_CONFIG auth admin_project_name '' +} diff -Nru keystone-18.0.0/devstack/plugin.sh keystone-18.0.0+git2020120911.b0b93c039/devstack/plugin.sh --- keystone-18.0.0/devstack/plugin.sh 2020-10-14 10:06:12.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/devstack/plugin.sh 2020-12-09 16:50:47.000000000 +0000 @@ -15,6 +15,7 @@ KEYSTONE_PLUGIN=$DEST/keystone/devstack source $KEYSTONE_PLUGIN/lib/federation.sh +source $KEYSTONE_PLUGIN/lib/scope.sh # For more information on Devstack plugins, including a more detailed # explanation on when the different steps are executed please see: @@ -47,6 +48,12 @@ if is_service_enabled keystone-saml2-federation; then configure_tests_settings fi + if [[ "$(trueorfalse False KEYSTONE_ENFORCE_SCOPE)" == "True" ]] ; then + # devstack and tempest assume enforce_scope is false, so need to wait + # until the final phase to turn it on + configure_enforce_scope + configure_protection_tests + fi fi if [[ "$1" == "unstack" ]]; then diff -Nru keystone-18.0.0/keystone/assignment/backends/sql.py keystone-18.0.0+git2020120911.b0b93c039/keystone/assignment/backends/sql.py --- keystone-18.0.0/keystone/assignment/backends/sql.py 2020-10-14 10:06:12.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/keystone/assignment/backends/sql.py 2020-12-09 16:50:47.000000000 +0000 @@ -269,6 +269,11 @@ q = q.filter_by(role_id=role_id) q.delete(False) + with sql.session_for_write() as session: + q = session.query(SystemRoleAssignment) + q = q.filter_by(role_id=role_id) + q.delete(False) + def delete_domain_assignments(self, domain_id): with sql.session_for_write() as session: q = session.query(RoleAssignment) diff -Nru keystone-18.0.0/keystone/identity/backends/ldap/common.py keystone-18.0.0+git2020120911.b0b93c039/keystone/identity/backends/ldap/common.py --- keystone-18.0.0/keystone/identity/backends/ldap/common.py 2020-10-14 10:06:12.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/keystone/identity/backends/ldap/common.py 2020-12-09 16:50:47.000000000 +0000 @@ -14,7 +14,6 @@ import abc import codecs -import functools import os.path import re import sys @@ -635,10 +634,36 @@ tls_req_cert) -class MsgId(list): - """Wrapper class to hold connection and msgid.""" +class AsynchronousMessage(object): + """A container for handling asynchronous LDAP responses. - pass + Some LDAP APIs, like `search_ext`, are asynchronous and return a message ID + when the server successfully initiates the operation. Clients can use this + message ID and the original connection to make the request to fetch the + results using `result3`. + + This object holds the message ID, the original connection, and a callable + weak reference Finalizer that cleans up context managers specific to the + connection associated to the message ID. + + :param message_id: The message identifier (str). + :param connection: The connection associated with the message identifier + (ldappool.StateConnector). + + The `clean` attribute is a callable that cleans up the context manager used + to create or return the connection object (weakref.finalize). + + """ + + def __init__(self, message_id, connection, context_manager): + self.id = message_id + self.connection = connection + self.clean = weakref.finalize( + self, self._cleanup_connection_context_manager, context_manager + ) + + def _cleanup_connection_context_manager(self, context_manager): + context_manager.__exit__(None, None, None) def use_conn_pool(func): @@ -792,15 +817,17 @@ filterstr='(objectClass=*)', attrlist=None, attrsonly=0, serverctrls=None, clientctrls=None, timeout=-1, sizelimit=0): - """Return a ``MsgId`` instance, it asynchronous API. + """Return an AsynchronousMessage instance, it asynchronous API. - The ``MsgId`` instance can be safely used in a call to ``result3()``. + The AsynchronousMessage instance can be safely used in a call to + `result3()`. - To work with ``result3()`` API in predictable manner, the same LDAP - connection is needed which originally provided the ``msgid``. So, this - method wraps the existing connection and ``msgid`` in a new ``MsgId`` - instance. The connection associated with ``search_ext`` is released - once last hard reference to the ``MsgId`` instance is freed. + To work with `result3()` API in predictable manner, the same LDAP + connection is needed which originally provided the `msgid`. So, this + method wraps the existing connection and `msgid` in a new + `AsynchronousMessage` instance. The connection associated with + `search_ext()` is released after `result3()` fetches the data + associated with `msgid`. """ conn_ctxt = self._get_pool_connection() @@ -813,30 +840,33 @@ except Exception: conn_ctxt.__exit__(*sys.exc_info()) raise - res = MsgId((conn, msgid)) - weakref.ref(res, functools.partial(conn_ctxt.__exit__, - None, None, None)) - return res + return AsynchronousMessage(msgid, conn, conn_ctxt) - def result3(self, msgid, all=1, timeout=None, + def result3(self, message, all=1, timeout=None, resp_ctrl_classes=None): - """Wait for and return the result. + """Wait for and return the result to an asynchronous message. This method returns the result of an operation previously initiated by - one of the LDAP asynchronous operation routines (eg search_ext()). It - returned an invocation identifier (a message id) upon successful - initiation of their operation. - - Input msgid is expected to be instance of class MsgId which has LDAP - session/connection used to execute search_ext and message idenfier. - - The connection associated with search_ext is released once last hard - reference to MsgId object is freed. This will happen when function - which requested msgId and used it in result3 exits. + one of the LDAP asynchronous operation routines (e.g., `search_ext()`). + The `search_ext()` method in python-ldap returns an invocation + identifier, or a message ID, upon successful initiation of the + operation by the LDAP server. + + The `message` is expected to be instance of class + `AsynchronousMessage`, which contains the message ID and the connection + used to make the original request. + + The connection and context manager associated with `search_ext()` are + cleaned up when message.clean() is called. """ - conn, msg_id = msgid - return conn.result3(msg_id, all, timeout) + results = message.connection.result3(message.id, all, timeout) + + # Now that we have the results from the LDAP server for the message, we + # don't need the the context manager used to create the connection. + message.clean() + + return results @use_conn_pool def modify_s(self, conn, dn, modlist): @@ -997,15 +1027,15 @@ cookie='') page_ctrl_oid = ldap.controls.SimplePagedResultsControl.controlType - msgid = self.conn.search_ext(base, - scope, - filterstr, - attrlist, - serverctrls=[lc]) + message = self.conn.search_ext(base, + scope, + filterstr, + attrlist, + serverctrls=[lc]) # Endless loop request pages on ldap server until it has no data while True: # Request to the ldap server a page with 'page_size' entries - rtype, rdata, rmsgid, serverctrls = self.conn.result3(msgid) + rtype, rdata, rmsgid, serverctrls = self.conn.result3(message) # Receive the data res.extend(rdata) pctrls = [c for c in serverctrls @@ -1021,11 +1051,11 @@ if cookie: # There is more data still on the server # so we request another page - msgid = self.conn.search_ext(base, - scope, - filterstr, - attrlist, - serverctrls=[lc]) + message = self.conn.search_ext(base, + scope, + filterstr, + attrlist, + serverctrls=[lc]) else: # Exit condition no more data on server break diff -Nru keystone-18.0.0/keystone/tests/unit/assignment/test_backends.py keystone-18.0.0+git2020120911.b0b93c039/keystone/tests/unit/assignment/test_backends.py --- keystone-18.0.0/keystone/tests/unit/assignment/test_backends.py 2020-10-14 10:06:12.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/keystone/tests/unit/assignment/test_backends.py 2020-12-09 16:50:47.000000000 +0000 @@ -4225,3 +4225,22 @@ group_id, role['id'] ) + + def test_delete_role_with_system_assignments(self): + role = unit.new_role_ref() + PROVIDERS.role_api.create_role(role['id'], role) + domain = unit.new_domain_ref() + PROVIDERS.resource_api.create_domain(domain['id'], domain) + user = unit.new_user_ref(domain_id=domain['id']) + user = PROVIDERS.identity_api.create_user(user) + + # creating a system grant for user + PROVIDERS.assignment_api.create_system_grant_for_user( + user['id'], role['id'] + ) + # deleting the role user has on system + PROVIDERS.role_api.delete_role(role['id']) + system_roles = PROVIDERS.assignment_api.list_role_assignments( + role_id=role['id'] + ) + self.assertEqual(len(system_roles), 0) diff -Nru keystone-18.0.0/keystone/tests/unit/test_config.py keystone-18.0.0+git2020120911.b0b93c039/keystone/tests/unit/test_config.py --- keystone-18.0.0/keystone/tests/unit/test_config.py 2020-10-14 10:06:12.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/keystone/tests/unit/test_config.py 2020-12-09 16:50:47.000000000 +0000 @@ -39,9 +39,7 @@ def test_config_default(self): self.assertIsNone(CONF.auth.password) self.assertIsNone(CONF.auth.token) - - def test_profiler_config_default(self): - """Check config.set_config_defaults() has set [profiler]enabled.""" + # Check config.set_config_defaults() has set [profiler]enabled. self.assertEqual(False, CONF.profiler.enabled) diff -Nru keystone-18.0.0/keystone.egg-info/pbr.json keystone-18.0.0+git2020120911.b0b93c039/keystone.egg-info/pbr.json --- keystone-18.0.0/keystone.egg-info/pbr.json 2020-10-14 10:08:00.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/keystone.egg-info/pbr.json 2020-12-09 16:50:52.000000000 +0000 @@ -1 +1 @@ -{"git_version": "db25e505a", "is_release": true} \ No newline at end of file +{"git_version": "b0b93c039", "is_release": false} \ No newline at end of file diff -Nru keystone-18.0.0/keystone.egg-info/PKG-INFO keystone-18.0.0+git2020120911.b0b93c039/keystone.egg-info/PKG-INFO --- keystone-18.0.0/keystone.egg-info/PKG-INFO 2020-10-14 10:08:00.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/keystone.egg-info/PKG-INFO 2020-12-09 16:50:52.000000000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: keystone -Version: 18.0.0 +Version: 18.0.1.dev9 Summary: OpenStack Identity Home-page: https://docs.openstack.org/keystone/latest Author: OpenStack diff -Nru keystone-18.0.0/keystone.egg-info/SOURCES.txt keystone-18.0.0+git2020120911.b0b93c039/keystone.egg-info/SOURCES.txt --- keystone-18.0.0/keystone.egg-info/SOURCES.txt 2020-10-14 10:08:00.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/keystone.egg-info/SOURCES.txt 2020-12-09 16:50:52.000000000 +0000 @@ -315,6 +315,7 @@ devstack/files/federation/shib_apache_handler.txt devstack/files/federation/shibboleth2.xml devstack/lib/federation.sh +devstack/lib/scope.sh doc/Makefile doc/README.rst doc/requirements.txt @@ -1562,9 +1563,11 @@ releasenotes/notes/bug-1872753-e2a934eac919ccde.yaml releasenotes/notes/bug-1872755-2c81d3267b89f124.yaml releasenotes/notes/bug-1873290-ff7f8e4cee15b75a.yaml +releasenotes/notes/bug-1878938-70ee2af6fdf66004.yaml releasenotes/notes/bug-1880252-51036d5353125e15.yaml releasenotes/notes/bug-1886017-bc2ad648d57101a2.yaml releasenotes/notes/bug-1889936-78d6853b5212b8f1.yaml +releasenotes/notes/bug-1896125-b17a4d12730fe493.yaml releasenotes/notes/bug1828565-0790c4c60ba34100.yaml releasenotes/notes/bug_1526462-df9a3f3974d9040f.yaml releasenotes/notes/bug_1543048_and_1668503-7ead4e15faaab778.yaml @@ -1667,7 +1670,9 @@ releasenotes/source/_static/.placeholder releasenotes/source/_templates/.placeholder releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po +releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po +releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po tools/cover.sh tools/fast8.sh tools/sample_data.sh diff -Nru keystone-18.0.0/lower-constraints.txt keystone-18.0.0+git2020120911.b0b93c039/lower-constraints.txt --- keystone-18.0.0/lower-constraints.txt 2020-10-14 10:06:12.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/lower-constraints.txt 2020-12-09 16:50:47.000000000 +0000 @@ -62,6 +62,7 @@ tempest==17.1.0 testtools==2.2.0 urllib3==1.22 +vine==1.3.0 WebOb==1.7.1 WebTest==2.0.27 Werkzeug==0.14.1 diff -Nru keystone-18.0.0/PKG-INFO keystone-18.0.0+git2020120911.b0b93c039/PKG-INFO --- keystone-18.0.0/PKG-INFO 2020-10-14 10:08:00.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/PKG-INFO 2020-12-09 16:50:53.058760000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: keystone -Version: 18.0.0 +Version: 18.0.1.dev9 Summary: OpenStack Identity Home-page: https://docs.openstack.org/keystone/latest Author: OpenStack diff -Nru keystone-18.0.0/releasenotes/notes/bug-1878938-70ee2af6fdf66004.yaml keystone-18.0.0+git2020120911.b0b93c039/releasenotes/notes/bug-1878938-70ee2af6fdf66004.yaml --- keystone-18.0.0/releasenotes/notes/bug-1878938-70ee2af6fdf66004.yaml 1970-01-01 00:00:00.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/releasenotes/notes/bug-1878938-70ee2af6fdf66004.yaml 2020-12-09 16:50:47.000000000 +0000 @@ -0,0 +1,16 @@ +--- +fixes: + - | + [`bug 1878938 `_] + Previously when a user used to have system role assignment and tries to delete + the same role, the system role assignments still existed in system_assignment + table. This causes keystone to return `HTTP 404 Not Found` errors when listing + role assignments with names (e.g., `--names` or `?include_names`). + + If you are affected by this bug, you must remove stale role assignments + manually. The following is an example SQL statement you can use to fix the + issue, but you should verify it's applicability to your deployment's SQL + implementation and version. + + SQL: + - delete from system_assignment where role_id not in (select id from role); diff -Nru keystone-18.0.0/releasenotes/notes/bug-1896125-b17a4d12730fe493.yaml keystone-18.0.0+git2020120911.b0b93c039/releasenotes/notes/bug-1896125-b17a4d12730fe493.yaml --- keystone-18.0.0/releasenotes/notes/bug-1896125-b17a4d12730fe493.yaml 1970-01-01 00:00:00.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/releasenotes/notes/bug-1896125-b17a4d12730fe493.yaml 2020-12-09 16:50:47.000000000 +0000 @@ -0,0 +1,7 @@ +--- +fixes: + - | + [`bug 1896125 `_] + Introduced more robust connection handling for asynchronous LDAP requests + to address memory leaks fetching data from LDAP backends with low page + sizes. diff -Nru keystone-18.0.0/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po keystone-18.0.0+git2020120911.b0b93c039/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po --- keystone-18.0.0/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po 1970-01-01 00:00:00.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po 2020-12-09 16:50:47.000000000 +0000 @@ -0,0 +1,120 @@ +# Gérald LONLAS , 2016. #zanata +msgid "" +msgstr "" +"Project-Id-Version: Keystone Release Notes\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-30 05:00+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2016-10-22 05:03+0000\n" +"Last-Translator: Gérald LONLAS \n" +"Language-Team: French\n" +"Language: fr\n" +"X-Generator: Zanata 4.3.3\n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" + +msgid "10.0.0" +msgstr "10.0.0" + +msgid "8.0.1" +msgstr "8.0.1" + +msgid "8.1.0" +msgstr "8.1.0" + +msgid "9.0.0" +msgstr "9.0.0" + +msgid "9.2.0" +msgstr "9.2.0" + +msgid "Bug Fixes" +msgstr "Corrections de bugs" + +msgid "Critical Issues" +msgstr "Erreurs critiques" + +msgid "Current Series Release Notes" +msgstr "Note de la release actuelle" + +msgid "Deprecation Notes" +msgstr "Notes dépréciées " + +msgid "Keystone Release Notes" +msgstr "Note de release de Keystone" + +msgid "Liberty Series Release Notes" +msgstr "Note de release pour Liberty" + +msgid "Mitaka Series Release Notes" +msgstr "Note de release pour Mitaka" + +msgid "New Features" +msgstr "Nouvelles fonctionnalités" + +msgid "Newton Series Release Notes" +msgstr "Note de release pour Newton" + +msgid "Other Notes" +msgstr "Autres notes" + +msgid "Security Issues" +msgstr "Problèmes de sécurités" + +msgid "Upgrade Notes" +msgstr "Notes de mises à jours" + +msgid "``add user to group``" +msgstr "``add user to group``" + +msgid "``create group``" +msgstr "``create group``" + +msgid "``create user``" +msgstr "``create user``" + +msgid "``delete group``" +msgstr "``delete group``" + +msgid "``delete user``" +msgstr "``delete user``" + +msgid "``keystone/common/cache/backends/memcache_pool``" +msgstr "``keystone/common/cache/backends/memcache_pool``" + +msgid "``keystone/common/cache/backends/mongo``" +msgstr "``keystone/common/cache/backends/mongo``" + +msgid "``keystone/common/cache/backends/noop``" +msgstr "``keystone/common/cache/backends/noop``" + +msgid "``keystone/contrib/admin_crud``" +msgstr "``keystone/contrib/admin_crud``" + +msgid "``keystone/contrib/endpoint_filter``" +msgstr "``keystone/contrib/endpoint_filter``" + +msgid "``keystone/contrib/federation``" +msgstr "``keystone/contrib/federation``" + +msgid "``keystone/contrib/oauth1``" +msgstr "``keystone/contrib/oauth1``" + +msgid "``keystone/contrib/revoke``" +msgstr "``keystone/contrib/revoke``" + +msgid "``keystone/contrib/simple_cert``" +msgstr "``keystone/contrib/simple_cert``" + +msgid "``keystone/contrib/user_crud``" +msgstr "``keystone/contrib/user_crud``" + +msgid "``remove user from group``" +msgstr "``remove user from group``" + +msgid "``update group``" +msgstr "``update group``" + +msgid "``update user``" +msgstr "``update user``" diff -Nru keystone-18.0.0/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po keystone-18.0.0+git2020120911.b0b93c039/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po --- keystone-18.0.0/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po 1970-01-01 00:00:00.000000000 +0000 +++ keystone-18.0.0+git2020120911.b0b93c039/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po 2020-12-09 16:50:47.000000000 +0000 @@ -0,0 +1,202 @@ +# Sungjin Kang , 2017. #zanata +# Ian Y. Choi , 2018. #zanata +msgid "" +msgstr "" +"Project-Id-Version: Keystone Release Notes\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-30 05:00+0000\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2018-02-14 07:39+0000\n" +"Last-Translator: Ian Y. Choi \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 "'/' and ',' are not allowed to be in a tag" +msgstr "'/' 및 ',' 는 태그 내에서 허용하지 않습니다" + +msgid "" +"**Experimental** - Domain specific configuration options can be stored in " +"SQL instead of configuration files, using the new REST APIs." +msgstr "" +"**실험적 기능** - 도메인에 특화된 구성 옵션을 구성 파일 대신 SQL에 새로운 " +"REST API를 사용하여 저장 가능합니다." + +msgid "" +"**Experimental** - Keystone now supports tokenless authorization with X.509 " +"SSL client certificate." +msgstr "" +"**실험적 기능** - Keystone이 이제 X.509 SSL 클라이언트 인증서를 사용한 토큰" +"이 없는 인증 방식 (tokenless authorization)을 지원합니다." + +msgid "10.0.0" +msgstr "10.0.0" + +msgid "10.0.1" +msgstr "10.0.1" + +msgid "10.0.3" +msgstr "10.0.3" + +msgid "11.0.0" +msgstr "11.0.0" + +msgid "11.0.1" +msgstr "11.0.1" + +msgid "11.0.3" +msgstr "11.0.3" + +msgid "12.0.0" +msgstr "12.0.0" + +msgid "8.0.1" +msgstr "8.0.1" + +msgid "8.1.0" +msgstr "8.1.0" + +msgid "9.0.0" +msgstr "9.0.0" + +msgid "9.2.0" +msgstr "9.2.0" + +msgid "Bug Fixes" +msgstr "버그 수정" + +msgid "Critical Issues" +msgstr "치명적인 이슈" + +msgid "Current Series Release Notes" +msgstr "현재 시리즈 릴리즈 노트" + +msgid "Deprecation Notes" +msgstr "지원 종료된 기능 노트" + +msgid "" +"For additional details see: `event notifications `_" +msgstr "" +"추가적으로 자세한 사항을 확인하려면 : `event notifications `_" + +msgid "Keystone Release Notes" +msgstr "Keystone 릴리즈 노트" + +msgid "Liberty Series Release Notes" +msgstr "Liberty 시리즈 릴리즈 노트" + +msgid "Mitaka Series Release Notes" +msgstr "Mitaka 시리즈 릴리즈 노트" + +msgid "New Features" +msgstr "새로운 기능" + +msgid "Newton Series Release Notes" +msgstr "Newton 시리즈 릴리즈 노트" + +msgid "Ocata Series Release Notes" +msgstr "Ocata 시리즈 릴리즈 노트" + +msgid "Other Notes" +msgstr "기타 기능" + +msgid "Pike Series Release Notes" +msgstr "Pike 시리즈 릴리즈 노트" + +msgid "Queens Series Release Notes" +msgstr "Queens 시리즈 릴리즈 노트" + +msgid "Security Issues" +msgstr "보안 이슈" + +msgid "To::" +msgstr "To::" + +msgid "Upgrade Notes" +msgstr "업그레이드 노트" + +msgid "``add user to group``" +msgstr "``add user to group``" + +msgid "``create group``" +msgstr "``create group``" + +msgid "``create user``" +msgstr "``create user``" + +msgid "``delete group``" +msgstr "``delete group``" + +msgid "``delete user``" +msgstr "``delete user``" + +msgid "``issue_v2_token``" +msgstr "``issue_v2_token``" + +msgid "``issue_v3_token``" +msgstr "``issue_v3_token``" + +msgid "``keystone.common.kvs.backends.inmemdb.MemoryBackend``" +msgstr "``keystone.common.kvs.backends.inmemdb.MemoryBackend``" + +msgid "``keystone.common.kvs.backends.memcached.MemcachedBackend``" +msgstr "``keystone.common.kvs.backends.memcached.MemcachedBackend``" + +msgid "``keystone.token.persistence.backends.kvs.Token``" +msgstr "``keystone.token.persistence.backends.kvs.Token``" + +msgid "``keystone/common/cache/backends/memcache_pool``" +msgstr "``keystone/common/cache/backends/memcache_pool``" + +msgid "``keystone/common/cache/backends/mongo``" +msgstr "``keystone/common/cache/backends/mongo``" + +msgid "``keystone/common/cache/backends/noop``" +msgstr "``keystone/common/cache/backends/noop``" + +msgid "``keystone/contrib/admin_crud``" +msgstr "``keystone/contrib/admin_crud``" + +msgid "``keystone/contrib/endpoint_filter``" +msgstr "``keystone/contrib/endpoint_filter``" + +msgid "``keystone/contrib/federation``" +msgstr "``keystone/contrib/federation``" + +msgid "``keystone/contrib/oauth1``" +msgstr "``keystone/contrib/oauth1``" + +msgid "``keystone/contrib/revoke``" +msgstr "``keystone/contrib/revoke``" + +msgid "``keystone/contrib/simple_cert``" +msgstr "``keystone/contrib/simple_cert``" + +msgid "``keystone/contrib/user_crud``" +msgstr "``keystone/contrib/user_crud``" + +msgid "``remove user from group``" +msgstr "``remove user from group``" + +msgid "``update group``" +msgstr "``update group``" + +msgid "``update user``" +msgstr "``update user``" + +msgid "``validate_non_persistent_token``" +msgstr "``validate_non_persistent_token``" + +msgid "``validate_v2_token``" +msgstr "``validate_v2_token``" + +msgid "``validate_v3_token``" +msgstr "``validate_v3_token``" + +msgid "to::" +msgstr "to::"