Move plugin stuff to clientmanager

The OSC plugins work by adding an object as an attribute to a
ClientManager instance.  The initialization and management of
thos plugins belongs in clientmanager.py.

At this point the only part not moved is the API version dict
initialization bcause the timing and connection to the
CommandManager initialization.  It gets refactored anyway when
API discovery becomes operational.

Change-Id: If9cb9a0c45a3a577082a5cdbb793769211f20ebb
This commit is contained in:
Dean Troyer 2014-10-13 11:13:48 -05:00
parent 28fada95f7
commit 3139990548
2 changed files with 30 additions and 18 deletions

View File

@ -29,6 +29,8 @@ from openstackclient.identity import client as identity_client
LOG = logging.getLogger(__name__)
PLUGIN_MODULES = []
class ClientCache(object):
"""Descriptor class for caching created client handles."""
@ -123,11 +125,13 @@ class ClientManager(object):
return endpoint
def get_extension_modules(group):
"""Add extension clients"""
# Plugin Support
def get_plugin_modules(group):
"""Find plugin entry points"""
mod_list = []
for ep in pkg_resources.iter_entry_points(group):
LOG.debug('found extension %r', ep.name)
LOG.debug('Found plugin %r', ep.name)
__import__(ep.module_name)
module = sys.modules[ep.module_name]
@ -136,6 +140,7 @@ def get_extension_modules(group):
if init_func:
init_func('x')
# Add the plugin to the ClientManager
setattr(
ClientManager,
module.API_NAME,
@ -144,3 +149,22 @@ def get_extension_modules(group):
),
)
return mod_list
def build_plugin_option_parser(parser):
"""Add plugin options to the parser"""
# Loop through extensions to get parser additions
for mod in PLUGIN_MODULES:
parser = mod.build_option_parser(parser)
return parser
# Get list of base plugin modules
PLUGIN_MODULES = get_plugin_modules(
'openstack.cli.base',
)
# Append list of external plugin modules
PLUGIN_MODULES.extend(get_plugin_modules(
'openstack.cli.extension',
))

View File

@ -68,19 +68,6 @@ class OpenStackShell(app.App):
# Assume TLS host certificate verification is enabled
self.verify = True
# Get list of base modules
self.ext_modules = clientmanager.get_extension_modules(
'openstack.cli.base',
)
# Append list of extension modules
self.ext_modules.extend(clientmanager.get_extension_modules(
'openstack.cli.extension',
))
# Loop through extensions to get parser additions
for mod in self.ext_modules:
self.parser = mod.build_option_parser(self.parser)
# NOTE(dtroyer): This hack changes the help action that Cliff
# automatically adds to the parser so we can defer
# its execution until after the api-versioned commands
@ -170,6 +157,7 @@ class OpenStackShell(app.App):
parser = super(OpenStackShell, self).build_option_parser(
description,
version)
# service token auth argument
parser.add_argument(
'--os-url',
@ -214,7 +202,7 @@ class OpenStackShell(app.App):
help="Print API call timing info",
)
return parser
return clientmanager.build_plugin_option_parser(parser)
def authenticate_user(self):
"""Verify the required authentication credentials are present"""
@ -332,7 +320,7 @@ class OpenStackShell(app.App):
self.default_domain = self.options.os_default_domain
# Loop through extensions to get API versions
for mod in self.ext_modules:
for mod in clientmanager.PLUGIN_MODULES:
version_opt = getattr(self.options, mod.API_VERSION_OPTION, None)
if version_opt:
api = mod.API_NAME