Dynamically load services
Change-Id: I3af2dc14bf15e172c6b10d6b5bbd96edf5baf8e3 Closes-Bug: 1420931
This commit is contained in:
		| @@ -119,6 +119,9 @@ class ProfileAction(argparse.Action): | ||||
|  | ||||
|     @classmethod | ||||
|     def set_option(cls, var, values): | ||||
|         if var == '--os-extensions': | ||||
|             cls.prof.load_extension(values) | ||||
|             return | ||||
|         if var == 'OS_REGION_NAME': | ||||
|             var = 'region' | ||||
|         var = var.replace('--os-api-', '') | ||||
| @@ -246,6 +249,15 @@ def option_parser(): | ||||
|         default=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( | ||||
|         '--os-api-name', | ||||
|         dest='preferences', | ||||
|   | ||||
| @@ -18,6 +18,19 @@ from stevedore import extension | ||||
| 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): | ||||
|  | ||||
|     def __init__(self): | ||||
|   | ||||
| @@ -51,6 +51,7 @@ The resulting preference print out would look something like:: | ||||
|     service_type=identity,region=zion,version=v3 | ||||
| """ | ||||
|  | ||||
| import logging | ||||
| import six | ||||
|  | ||||
| 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.message import message_service | ||||
| from openstack.metric import metric_service | ||||
| from openstack import module_loader | ||||
| from openstack.network import network_service | ||||
| from openstack.object_store import object_store_service | ||||
| from openstack.orchestration import orchestration_service | ||||
| from openstack.telemetry import telemetry_service | ||||
|  | ||||
| _logger = logging.getLogger(__name__) | ||||
|  | ||||
|  | ||||
| class Profile(object): | ||||
|  | ||||
|     ALL = "*" | ||||
|     """Wildcard service identifier representing all services.""" | ||||
|  | ||||
|     def __init__(self): | ||||
|         """Preferences for each service. | ||||
|     def __init__(self, extensions=None): | ||||
|         """User preference for each service. | ||||
|  | ||||
|         :param list extensions: List of entry point namespace to load. | ||||
|  | ||||
|         Create a new :class:`~openstack.profile.Profile` | ||||
|         object with no preferences defined, but knowledge of the services. | ||||
| @@ -129,11 +135,27 @@ class Profile(object): | ||||
|         serv.set_visibility(None) | ||||
|         self._services[serv.service_type] = serv | ||||
|  | ||||
|         if extensions: | ||||
|             for extension in extensions: | ||||
|                 self.load_extension(extension) | ||||
|         self.service_names = sorted(self._services.keys()) | ||||
|  | ||||
|     def __repr__(self): | ||||
|         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): | ||||
|         """Get a service preference. | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Terry Howe
					Terry Howe