From 84d326920fc9e6592b8fe9a56adaf6be0d9358c3 Mon Sep 17 00:00:00 2001
From: Kiall Mac Innes <kiall@hp.com>
Date: Fri, 12 Apr 2013 13:11:46 +0100
Subject: [PATCH] Allow for controllers to be loaded dynamically.

Change-Id: If85de4c02406e8ffd49da3c04c23db58ad2df119
---
 monikerclient/shell.py       |  2 +-
 monikerclient/v1/__init__.py | 16 ++++++++--------
 setup.py                     |  8 +++++++-
 tools/pip-requires           |  1 +
 4 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/monikerclient/shell.py b/monikerclient/shell.py
index 42a9e476..51881c04 100644
--- a/monikerclient/shell.py
+++ b/monikerclient/shell.py
@@ -27,7 +27,7 @@ class MonikerShell(App):
         super(MonikerShell, self).__init__(
             description='Moniker Client',
             version=version.version_string(),
-            command_manager=CommandManager('moniker.cli'),
+            command_manager=CommandManager('monikerclient.cli'),
         )
 
         self.log = logging.getLogger(__name__)
diff --git a/monikerclient/v1/__init__.py b/monikerclient/v1/__init__.py
index eb24f3a6..67027fec 100644
--- a/monikerclient/v1/__init__.py
+++ b/monikerclient/v1/__init__.py
@@ -14,12 +14,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 import requests
+from stevedore import extension
 from monikerclient import exceptions
 from monikerclient.auth import KeystoneAuth
-from monikerclient.v1 import diagnostics
-from monikerclient.v1 import domains
-from monikerclient.v1 import records
-from monikerclient.v1 import servers
 
 
 class Client(object):
@@ -56,10 +53,13 @@ class Client(object):
         self.requests.auth = auth
         self.requests.headers.update(headers)
 
-        self.diagnostics = diagnostics.DiagnosticsController(client=self)
-        self.domains = domains.DomainsController(client=self)
-        self.records = records.RecordsController(client=self)
-        self.servers = servers.ServersController(client=self)
+        def _load_controller(ext):
+            controller = ext.plugin(client=self)
+            setattr(self, ext.name, controller)
+
+        # Load all controllers
+        mgr = extension.ExtensionManager('monikerclient.v1.controllers')
+        mgr.map(_load_controller)
 
     def wrap_api_call(self, func, *args, **kw):
         """
diff --git a/setup.py b/setup.py
index ba93e67e..0e75e2ac 100755
--- a/setup.py
+++ b/setup.py
@@ -47,7 +47,13 @@ setup(
     ],
     cmdclass=common_setup.get_cmdclass(),
     entry_points=textwrap.dedent("""
-        [moniker.cli]
+        [monikerclient.v1.controllers]
+        diagnostics = monikerclient.v1.diagnostics:DiagnosticsController
+        domains = monikerclient.v1.domains:DomainsController
+        records = monikerclient.v1.records:RecordsController
+        servers = monikerclient.v1.servers:ServersController
+
+        [monikerclient.cli]
         domain-list = monikerclient.cli.domains:ListDomainsCommand
         domain-get = monikerclient.cli.domains:GetDomainCommand
         domain-create = monikerclient.cli.domains:CreateDomainCommand
diff --git a/tools/pip-requires b/tools/pip-requires
index 6a4492aa..a358dc05 100644
--- a/tools/pip-requires
+++ b/tools/pip-requires
@@ -1,5 +1,6 @@
 cliff>=1.2.1
 jsonschema>=0.8,<1
+stevedore
 requests>=0.8.3,<1.0
 python-keystoneclient>=0.2.0
 keyring