Create a version package
There are files hanging around the top level directory that only handle the versioning routes of keystone (/v2.0 and /v3). These should be moved to their own package to further isolate these APIs. Closes-Bug: #1504892 DocImpact Change-Id: Ica0ddcbeb6f7fc00a4ad3919fa16bf135637a607
This commit is contained in:
parent
8500d76e35
commit
64c491f932
@ -37,7 +37,7 @@ from keystone.common import utils
|
|||||||
from keystone import config
|
from keystone import config
|
||||||
from keystone.i18n import _
|
from keystone.i18n import _
|
||||||
from keystone.server import common
|
from keystone.server import common
|
||||||
from keystone import service as keystone_service
|
from keystone.version import service as keystone_service
|
||||||
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
@ -30,7 +30,7 @@ from keystone.common import environment
|
|||||||
from keystone import config
|
from keystone import config
|
||||||
import keystone.middleware.core as middleware_core
|
import keystone.middleware.core as middleware_core
|
||||||
from keystone.server import common
|
from keystone.server import common
|
||||||
from keystone import service as keystone_service
|
from keystone.version import service as keystone_service
|
||||||
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
@ -12,120 +12,50 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import functools
|
from oslo_log import versionutils
|
||||||
import sys
|
import six
|
||||||
|
|
||||||
from oslo_config import cfg
|
from keystone.version import service
|
||||||
from oslo_log import log
|
|
||||||
from paste import deploy
|
|
||||||
import routes
|
|
||||||
|
|
||||||
from keystone import assignment
|
|
||||||
from keystone import auth
|
|
||||||
from keystone import catalog
|
|
||||||
from keystone.common import wsgi
|
|
||||||
from keystone import controllers
|
|
||||||
from keystone import credential
|
|
||||||
from keystone import endpoint_policy
|
|
||||||
from keystone import identity
|
|
||||||
from keystone import policy
|
|
||||||
from keystone import resource
|
|
||||||
from keystone import routers
|
|
||||||
from keystone import token
|
|
||||||
from keystone import trust
|
|
||||||
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
def deprecated_to_version(f):
|
||||||
LOG = log.getLogger(__name__)
|
"""Specialized deprecation wrapper for service module.
|
||||||
|
|
||||||
|
This wraps the standard deprecation wrapper and fills in the method
|
||||||
|
names automatically.
|
||||||
|
|
||||||
|
"""
|
||||||
|
@six.wraps(f)
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
x = versionutils.deprecated(
|
||||||
|
what='keystone.service.' + f.__name__ + '()',
|
||||||
|
as_of=versionutils.deprecated.MITAKA,
|
||||||
|
remove_in=+2,
|
||||||
|
in_favor_of='keystone.version.service.' + f.__name__ + '()')
|
||||||
|
return x(f)
|
||||||
|
return wrapper()
|
||||||
|
|
||||||
|
|
||||||
def loadapp(conf, name):
|
@deprecated_to_version
|
||||||
# NOTE(blk-u): Save the application being loaded in the controllers module.
|
|
||||||
# This is similar to how public_app_factory() and v3_app_factory()
|
|
||||||
# register the version with the controllers module.
|
|
||||||
controllers.latest_app = deploy.loadapp(conf, name=name)
|
|
||||||
return controllers.latest_app
|
|
||||||
|
|
||||||
|
|
||||||
def fail_gracefully(f):
|
|
||||||
"""Logs exceptions and aborts."""
|
|
||||||
@functools.wraps(f)
|
|
||||||
def wrapper(*args, **kw):
|
|
||||||
try:
|
|
||||||
return f(*args, **kw)
|
|
||||||
except Exception as e:
|
|
||||||
LOG.debug(e, exc_info=True)
|
|
||||||
|
|
||||||
# exception message is printed to all logs
|
|
||||||
LOG.critical(e)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
return wrapper
|
|
||||||
|
|
||||||
|
|
||||||
@fail_gracefully
|
|
||||||
def public_app_factory(global_conf, **local_conf):
|
def public_app_factory(global_conf, **local_conf):
|
||||||
controllers.register_version('v2.0')
|
return service.public_app_factory(global_conf, **local_conf)
|
||||||
return wsgi.ComposingRouter(routes.Mapper(),
|
|
||||||
[assignment.routers.Public(),
|
|
||||||
token.routers.Router(),
|
|
||||||
routers.VersionV2('public'),
|
|
||||||
routers.Extension(False)])
|
|
||||||
|
|
||||||
|
|
||||||
@fail_gracefully
|
@deprecated_to_version
|
||||||
def admin_app_factory(global_conf, **local_conf):
|
def admin_app_factory(global_conf, **local_conf):
|
||||||
controllers.register_version('v2.0')
|
return service.admin_app_factory(global_conf, **local_conf)
|
||||||
return wsgi.ComposingRouter(routes.Mapper(),
|
|
||||||
[identity.routers.Admin(),
|
|
||||||
assignment.routers.Admin(),
|
|
||||||
token.routers.Router(),
|
|
||||||
resource.routers.Admin(),
|
|
||||||
routers.VersionV2('admin'),
|
|
||||||
routers.Extension()])
|
|
||||||
|
|
||||||
|
|
||||||
@fail_gracefully
|
@deprecated_to_version
|
||||||
def public_version_app_factory(global_conf, **local_conf):
|
def public_version_app_factory(global_conf, **local_conf):
|
||||||
return wsgi.ComposingRouter(routes.Mapper(),
|
return service.public_version_app_factory(global_conf, **local_conf)
|
||||||
[routers.Versions('public')])
|
|
||||||
|
|
||||||
|
|
||||||
@fail_gracefully
|
@deprecated_to_version
|
||||||
def admin_version_app_factory(global_conf, **local_conf):
|
def admin_version_app_factory(global_conf, **local_conf):
|
||||||
return wsgi.ComposingRouter(routes.Mapper(),
|
return service.admin_app_factory(global_conf, **local_conf)
|
||||||
[routers.Versions('admin')])
|
|
||||||
|
|
||||||
|
|
||||||
@fail_gracefully
|
@deprecated_to_version
|
||||||
def v3_app_factory(global_conf, **local_conf):
|
def v3_app_factory(global_conf, **local_conf):
|
||||||
controllers.register_version('v3')
|
return service.v3_app_factory(global_conf, **local_conf)
|
||||||
mapper = routes.Mapper()
|
|
||||||
sub_routers = []
|
|
||||||
_routers = []
|
|
||||||
|
|
||||||
# NOTE(dstanek): Routers should be ordered by their frequency of use in
|
|
||||||
# a live system. This is due to the routes implementation. The most
|
|
||||||
# frequently used routers should appear first.
|
|
||||||
router_modules = [auth,
|
|
||||||
assignment,
|
|
||||||
catalog,
|
|
||||||
credential,
|
|
||||||
identity,
|
|
||||||
policy,
|
|
||||||
resource]
|
|
||||||
|
|
||||||
if CONF.trust.enabled:
|
|
||||||
router_modules.append(trust)
|
|
||||||
|
|
||||||
if CONF.endpoint_policy.enabled:
|
|
||||||
router_modules.append(endpoint_policy)
|
|
||||||
|
|
||||||
for module in router_modules:
|
|
||||||
routers_instance = module.routers.Routers()
|
|
||||||
_routers.append(routers_instance)
|
|
||||||
routers_instance.append_v3_routers(mapper, sub_routers)
|
|
||||||
|
|
||||||
# Add in the v3 version api
|
|
||||||
sub_routers.append(routers.VersionV3('public', _routers))
|
|
||||||
return wsgi.ComposingRouter(mapper, sub_routers)
|
|
||||||
|
@ -19,9 +19,9 @@ from oslo_serialization import jsonutils
|
|||||||
|
|
||||||
from keystone.common import utils as common_utils
|
from keystone.common import utils as common_utils
|
||||||
from keystone import exception
|
from keystone import exception
|
||||||
from keystone import service
|
|
||||||
from keystone.tests import unit
|
from keystone.tests import unit
|
||||||
from keystone.tests.unit import utils
|
from keystone.tests.unit import utils
|
||||||
|
from keystone.version import service
|
||||||
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
@ -51,13 +51,13 @@ from keystone.common import kvs
|
|||||||
from keystone.common.kvs import core as kvs_core
|
from keystone.common.kvs import core as kvs_core
|
||||||
from keystone.common import sql
|
from keystone.common import sql
|
||||||
from keystone import config
|
from keystone import config
|
||||||
from keystone import controllers
|
|
||||||
from keystone import exception
|
from keystone import exception
|
||||||
from keystone import notifications
|
from keystone import notifications
|
||||||
from keystone.policy.backends import rules
|
from keystone.policy.backends import rules
|
||||||
from keystone.server import common
|
from keystone.server import common
|
||||||
from keystone import service
|
|
||||||
from keystone.tests.unit import ksfixtures
|
from keystone.tests.unit import ksfixtures
|
||||||
|
from keystone.version import controllers
|
||||||
|
from keystone.version import service
|
||||||
|
|
||||||
|
|
||||||
config.configure()
|
config.configure()
|
||||||
|
@ -18,7 +18,7 @@ from keystone.contrib.admin_crud import core as admin_crud_core
|
|||||||
from keystone.contrib.s3 import core as s3_core
|
from keystone.contrib.s3 import core as s3_core
|
||||||
from keystone.contrib.user_crud import core as user_crud_core
|
from keystone.contrib.user_crud import core as user_crud_core
|
||||||
from keystone.identity import core as identity_core
|
from keystone.identity import core as identity_core
|
||||||
from keystone import service
|
from keystone.version import service
|
||||||
|
|
||||||
|
|
||||||
class TestSingularPlural(object):
|
class TestSingularPlural(object):
|
||||||
|
@ -25,9 +25,9 @@ from testtools import matchers as tt_matchers
|
|||||||
import webob
|
import webob
|
||||||
|
|
||||||
from keystone.common import json_home
|
from keystone.common import json_home
|
||||||
from keystone import controllers
|
|
||||||
from keystone.tests import unit
|
from keystone.tests import unit
|
||||||
from keystone.tests.unit import utils
|
from keystone.tests.unit import utils
|
||||||
|
from keystone.version import controllers
|
||||||
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
CONF = cfg.CONF
|
||||||
|
0
keystone/version/__init__.py
Normal file
0
keystone/version/__init__.py
Normal file
@ -28,8 +28,8 @@ MEDIA_TYPE_JSON = 'application/vnd.openstack.identity-%s+json'
|
|||||||
|
|
||||||
_VERSIONS = []
|
_VERSIONS = []
|
||||||
|
|
||||||
# NOTE(blk-u): latest_app will be set by keystone.service.loadapp(). It gets
|
# NOTE(blk-u): latest_app will be set by keystone.version.service.loadapp(). It
|
||||||
# set to the application that was just loaded. In the case of keystone-all,
|
# gets set to the application that was just loaded. In the case of keystone-all
|
||||||
# loadapp() gets called twice, once for the public app and once for the admin
|
# loadapp() gets called twice, once for the public app and once for the admin
|
||||||
# app. In the case of httpd/keystone, loadapp() gets called once for the public
|
# app. In the case of httpd/keystone, loadapp() gets called once for the public
|
||||||
# app if this is the public instance or loadapp() gets called for the admin app
|
# app if this is the public instance or loadapp() gets called for the admin app
|
@ -23,7 +23,7 @@ For example, the ``ComposableRouter`` for ``identity`` belongs in::
|
|||||||
|
|
||||||
|
|
||||||
from keystone.common import wsgi
|
from keystone.common import wsgi
|
||||||
from keystone import controllers
|
from keystone.version import controllers
|
||||||
|
|
||||||
|
|
||||||
class Extension(wsgi.ComposableRouter):
|
class Extension(wsgi.ComposableRouter):
|
131
keystone/version/service.py
Normal file
131
keystone/version/service.py
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
# Copyright 2012 OpenStack Foundation
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import functools
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from oslo_config import cfg
|
||||||
|
from oslo_log import log
|
||||||
|
from paste import deploy
|
||||||
|
import routes
|
||||||
|
|
||||||
|
from keystone import assignment
|
||||||
|
from keystone import auth
|
||||||
|
from keystone import catalog
|
||||||
|
from keystone.common import wsgi
|
||||||
|
from keystone import credential
|
||||||
|
from keystone import endpoint_policy
|
||||||
|
from keystone import identity
|
||||||
|
from keystone import policy
|
||||||
|
from keystone import resource
|
||||||
|
from keystone import token
|
||||||
|
from keystone import trust
|
||||||
|
from keystone.version import controllers
|
||||||
|
from keystone.version import routers
|
||||||
|
|
||||||
|
|
||||||
|
CONF = cfg.CONF
|
||||||
|
LOG = log.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def loadapp(conf, name):
|
||||||
|
# NOTE(blk-u): Save the application being loaded in the controllers module.
|
||||||
|
# This is similar to how public_app_factory() and v3_app_factory()
|
||||||
|
# register the version with the controllers module.
|
||||||
|
controllers.latest_app = deploy.loadapp(conf, name=name)
|
||||||
|
return controllers.latest_app
|
||||||
|
|
||||||
|
|
||||||
|
def fail_gracefully(f):
|
||||||
|
"""Logs exceptions and aborts."""
|
||||||
|
@functools.wraps(f)
|
||||||
|
def wrapper(*args, **kw):
|
||||||
|
try:
|
||||||
|
return f(*args, **kw)
|
||||||
|
except Exception as e:
|
||||||
|
LOG.debug(e, exc_info=True)
|
||||||
|
|
||||||
|
# exception message is printed to all logs
|
||||||
|
LOG.critical(e)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
@fail_gracefully
|
||||||
|
def public_app_factory(global_conf, **local_conf):
|
||||||
|
controllers.register_version('v2.0')
|
||||||
|
return wsgi.ComposingRouter(routes.Mapper(),
|
||||||
|
[assignment.routers.Public(),
|
||||||
|
token.routers.Router(),
|
||||||
|
routers.VersionV2('public'),
|
||||||
|
routers.Extension(False)])
|
||||||
|
|
||||||
|
|
||||||
|
@fail_gracefully
|
||||||
|
def admin_app_factory(global_conf, **local_conf):
|
||||||
|
controllers.register_version('v2.0')
|
||||||
|
return wsgi.ComposingRouter(routes.Mapper(),
|
||||||
|
[identity.routers.Admin(),
|
||||||
|
assignment.routers.Admin(),
|
||||||
|
token.routers.Router(),
|
||||||
|
resource.routers.Admin(),
|
||||||
|
routers.VersionV2('admin'),
|
||||||
|
routers.Extension()])
|
||||||
|
|
||||||
|
|
||||||
|
@fail_gracefully
|
||||||
|
def public_version_app_factory(global_conf, **local_conf):
|
||||||
|
return wsgi.ComposingRouter(routes.Mapper(),
|
||||||
|
[routers.Versions('public')])
|
||||||
|
|
||||||
|
|
||||||
|
@fail_gracefully
|
||||||
|
def admin_version_app_factory(global_conf, **local_conf):
|
||||||
|
return wsgi.ComposingRouter(routes.Mapper(),
|
||||||
|
[routers.Versions('admin')])
|
||||||
|
|
||||||
|
|
||||||
|
@fail_gracefully
|
||||||
|
def v3_app_factory(global_conf, **local_conf):
|
||||||
|
controllers.register_version('v3')
|
||||||
|
mapper = routes.Mapper()
|
||||||
|
sub_routers = []
|
||||||
|
_routers = []
|
||||||
|
|
||||||
|
# NOTE(dstanek): Routers should be ordered by their frequency of use in
|
||||||
|
# a live system. This is due to the routes implementation. The most
|
||||||
|
# frequently used routers should appear first.
|
||||||
|
router_modules = [auth,
|
||||||
|
assignment,
|
||||||
|
catalog,
|
||||||
|
credential,
|
||||||
|
identity,
|
||||||
|
policy,
|
||||||
|
resource]
|
||||||
|
|
||||||
|
if CONF.trust.enabled:
|
||||||
|
router_modules.append(trust)
|
||||||
|
|
||||||
|
if CONF.endpoint_policy.enabled:
|
||||||
|
router_modules.append(endpoint_policy)
|
||||||
|
|
||||||
|
for module in router_modules:
|
||||||
|
routers_instance = module.routers.Routers()
|
||||||
|
_routers.append(routers_instance)
|
||||||
|
routers_instance.append_v3_routers(mapper, sub_routers)
|
||||||
|
|
||||||
|
# Add in the v3 version api
|
||||||
|
sub_routers.append(routers.VersionV3('public', _routers))
|
||||||
|
return wsgi.ComposingRouter(mapper, sub_routers)
|
10
setup.cfg
10
setup.cfg
@ -196,8 +196,8 @@ paste.filter_factory =
|
|||||||
user_crud_extension = keystone.contrib.user_crud:CrudExtension.factory
|
user_crud_extension = keystone.contrib.user_crud:CrudExtension.factory
|
||||||
|
|
||||||
paste.app_factory =
|
paste.app_factory =
|
||||||
admin_service = keystone.service:admin_app_factory
|
admin_service = keystone.version.service:admin_app_factory
|
||||||
admin_version_service = keystone.service:admin_version_app_factory
|
admin_version_service = keystone.version.service:admin_version_app_factory
|
||||||
public_service = keystone.service:public_app_factory
|
public_service = keystone.version.service:public_app_factory
|
||||||
public_version_service = keystone.service:public_version_app_factory
|
public_version_service = keystone.version.service:public_version_app_factory
|
||||||
service_v3 = keystone.service:v3_app_factory
|
service_v3 = keystone.version.service:v3_app_factory
|
||||||
|
Loading…
x
Reference in New Issue
Block a user