Merge "Dynamically load services"
This commit is contained in:
@@ -119,6 +119,9 @@ class ProfileAction(argparse.Action):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def set_option(cls, var, values):
|
def set_option(cls, var, values):
|
||||||
|
if var == '--os-extensions':
|
||||||
|
cls.prof.load_extension(values)
|
||||||
|
return
|
||||||
if var == 'OS_REGION_NAME':
|
if var == 'OS_REGION_NAME':
|
||||||
var = 'region'
|
var = 'region'
|
||||||
var = var.replace('--os-api-', '')
|
var = var.replace('--os-api-', '')
|
||||||
@@ -246,6 +249,15 @@ def option_parser():
|
|||||||
default=env('OS_ACCESS_INFO'),
|
default=env('OS_ACCESS_INFO'),
|
||||||
help='Access info (Env: OS_ACCESS_INFO)',
|
help='Access info (Env: OS_ACCESS_INFO)',
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--os-extensions',
|
||||||
|
dest='user_preferences',
|
||||||
|
metavar='<namespace>',
|
||||||
|
action=ProfileAction,
|
||||||
|
default=ProfileAction.env('OS_EXTENSIONS'),
|
||||||
|
help='Entry point for namespace for service extensions'
|
||||||
|
' env[OS_EXTENSIONS]',
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--os-api-name',
|
'--os-api-name',
|
||||||
dest='preferences',
|
dest='preferences',
|
||||||
|
@@ -18,6 +18,19 @@ from stevedore import extension
|
|||||||
from openstack import exceptions
|
from openstack import exceptions
|
||||||
|
|
||||||
|
|
||||||
|
def load_service_extensions(namespace):
|
||||||
|
service_extensions = extension.ExtensionManager(
|
||||||
|
namespace=namespace,
|
||||||
|
invoke_on_load=True,
|
||||||
|
)
|
||||||
|
services = {}
|
||||||
|
for service in service_extensions:
|
||||||
|
service = service.obj
|
||||||
|
service.set_visibility(None)
|
||||||
|
services[service.service_type] = service
|
||||||
|
return services
|
||||||
|
|
||||||
|
|
||||||
class ModuleLoader(object):
|
class ModuleLoader(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@@ -51,6 +51,7 @@ The resulting preference print out would look something like::
|
|||||||
service_type=identity,region=zion,version=v3
|
service_type=identity,region=zion,version=v3
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import logging
|
||||||
import six
|
import six
|
||||||
|
|
||||||
from openstack.block_store import block_store_service
|
from openstack.block_store import block_store_service
|
||||||
@@ -63,19 +64,24 @@ from openstack.image import image_service
|
|||||||
from openstack.key_management import key_management_service
|
from openstack.key_management import key_management_service
|
||||||
from openstack.message import message_service
|
from openstack.message import message_service
|
||||||
from openstack.metric import metric_service
|
from openstack.metric import metric_service
|
||||||
|
from openstack import module_loader
|
||||||
from openstack.network import network_service
|
from openstack.network import network_service
|
||||||
from openstack.object_store import object_store_service
|
from openstack.object_store import object_store_service
|
||||||
from openstack.orchestration import orchestration_service
|
from openstack.orchestration import orchestration_service
|
||||||
from openstack.telemetry import telemetry_service
|
from openstack.telemetry import telemetry_service
|
||||||
|
|
||||||
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Profile(object):
|
class Profile(object):
|
||||||
|
|
||||||
ALL = "*"
|
ALL = "*"
|
||||||
"""Wildcard service identifier representing all services."""
|
"""Wildcard service identifier representing all services."""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, extensions=None):
|
||||||
"""Preferences for each service.
|
"""User preference for each service.
|
||||||
|
|
||||||
|
:param list extensions: List of entry point namespace to load.
|
||||||
|
|
||||||
Create a new :class:`~openstack.profile.Profile`
|
Create a new :class:`~openstack.profile.Profile`
|
||||||
object with no preferences defined, but knowledge of the services.
|
object with no preferences defined, but knowledge of the services.
|
||||||
@@ -129,11 +135,27 @@ class Profile(object):
|
|||||||
serv.set_visibility(None)
|
serv.set_visibility(None)
|
||||||
self._services[serv.service_type] = serv
|
self._services[serv.service_type] = serv
|
||||||
|
|
||||||
|
if extensions:
|
||||||
|
for extension in extensions:
|
||||||
|
self.load_extension(extension)
|
||||||
self.service_names = sorted(self._services.keys())
|
self.service_names = sorted(self._services.keys())
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return repr(self._preferences)
|
return repr(self._preferences)
|
||||||
|
|
||||||
|
def load_extension(self, namespace):
|
||||||
|
"""Load a service extension.
|
||||||
|
|
||||||
|
:param str namespace: Entry point namespace
|
||||||
|
"""
|
||||||
|
services = module_loader.load_service_extensions(namespace)
|
||||||
|
for service_type in services:
|
||||||
|
if service_type in self._services:
|
||||||
|
_logger.debug("Overriding %s with %s", service_type,
|
||||||
|
services[service_type])
|
||||||
|
self._services[service_type] = services[service_type]
|
||||||
|
self.service_names = sorted(self._services.keys())
|
||||||
|
|
||||||
def get_preference(self, service):
|
def get_preference(self, service):
|
||||||
"""Get a service preference.
|
"""Get a service preference.
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user