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.i18n import _
|
||||
from keystone.server import common
|
||||
from keystone import service as keystone_service
|
||||
from keystone.version import service as keystone_service
|
||||
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
@ -30,7 +30,7 @@ from keystone.common import environment
|
||||
from keystone import config
|
||||
import keystone.middleware.core as middleware_core
|
||||
from keystone.server import common
|
||||
from keystone import service as keystone_service
|
||||
from keystone.version import service as keystone_service
|
||||
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
@ -12,120 +12,50 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import functools
|
||||
import sys
|
||||
from oslo_log import versionutils
|
||||
import six
|
||||
|
||||
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 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
|
||||
from keystone.version import service
|
||||
|
||||
|
||||
CONF = cfg.CONF
|
||||
LOG = log.getLogger(__name__)
|
||||
def deprecated_to_version(f):
|
||||
"""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):
|
||||
# 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
|
||||
@deprecated_to_version
|
||||
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)])
|
||||
return service.public_app_factory(global_conf, **local_conf)
|
||||
|
||||
|
||||
@fail_gracefully
|
||||
@deprecated_to_version
|
||||
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()])
|
||||
return service.admin_app_factory(global_conf, **local_conf)
|
||||
|
||||
|
||||
@fail_gracefully
|
||||
@deprecated_to_version
|
||||
def public_version_app_factory(global_conf, **local_conf):
|
||||
return wsgi.ComposingRouter(routes.Mapper(),
|
||||
[routers.Versions('public')])
|
||||
return service.public_version_app_factory(global_conf, **local_conf)
|
||||
|
||||
|
||||
@fail_gracefully
|
||||
@deprecated_to_version
|
||||
def admin_version_app_factory(global_conf, **local_conf):
|
||||
return wsgi.ComposingRouter(routes.Mapper(),
|
||||
[routers.Versions('admin')])
|
||||
return service.admin_app_factory(global_conf, **local_conf)
|
||||
|
||||
|
||||
@fail_gracefully
|
||||
@deprecated_to_version
|
||||
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)
|
||||
return service.v3_app_factory(global_conf, **local_conf)
|
||||
|
@ -19,9 +19,9 @@ from oslo_serialization import jsonutils
|
||||
|
||||
from keystone.common import utils as common_utils
|
||||
from keystone import exception
|
||||
from keystone import service
|
||||
from keystone.tests import unit
|
||||
from keystone.tests.unit import utils
|
||||
from keystone.version import service
|
||||
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
@ -51,13 +51,13 @@ from keystone.common import kvs
|
||||
from keystone.common.kvs import core as kvs_core
|
||||
from keystone.common import sql
|
||||
from keystone import config
|
||||
from keystone import controllers
|
||||
from keystone import exception
|
||||
from keystone import notifications
|
||||
from keystone.policy.backends import rules
|
||||
from keystone.server import common
|
||||
from keystone import service
|
||||
from keystone.tests.unit import ksfixtures
|
||||
from keystone.version import controllers
|
||||
from keystone.version import service
|
||||
|
||||
|
||||
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.user_crud import core as user_crud_core
|
||||
from keystone.identity import core as identity_core
|
||||
from keystone import service
|
||||
from keystone.version import service
|
||||
|
||||
|
||||
class TestSingularPlural(object):
|
||||
|
@ -25,9 +25,9 @@ from testtools import matchers as tt_matchers
|
||||
import webob
|
||||
|
||||
from keystone.common import json_home
|
||||
from keystone import controllers
|
||||
from keystone.tests import unit
|
||||
from keystone.tests.unit import utils
|
||||
from keystone.version import controllers
|
||||
|
||||
|
||||
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 = []
|
||||
|
||||
# NOTE(blk-u): latest_app will be set by keystone.service.loadapp(). It gets
|
||||
# set to the application that was just loaded. In the case of keystone-all,
|
||||
# NOTE(blk-u): latest_app will be set by keystone.version.service.loadapp(). It
|
||||
# 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
|
||||
# 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
|
@ -23,7 +23,7 @@ For example, the ``ComposableRouter`` for ``identity`` belongs in::
|
||||
|
||||
|
||||
from keystone.common import wsgi
|
||||
from keystone import controllers
|
||||
from keystone.version import controllers
|
||||
|
||||
|
||||
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
|
||||
|
||||
paste.app_factory =
|
||||
admin_service = keystone.service:admin_app_factory
|
||||
admin_version_service = keystone.service:admin_version_app_factory
|
||||
public_service = keystone.service:public_app_factory
|
||||
public_version_service = keystone.service:public_version_app_factory
|
||||
service_v3 = keystone.service:v3_app_factory
|
||||
admin_service = keystone.version.service:admin_app_factory
|
||||
admin_version_service = keystone.version.service:admin_version_app_factory
|
||||
public_service = keystone.version.service:public_app_factory
|
||||
public_version_service = keystone.version.service:public_version_app_factory
|
||||
service_v3 = keystone.version.service:v3_app_factory
|
||||
|
Loading…
Reference in New Issue
Block a user