From 270c7fe96727cedf81e7f4fe6361672c512fc150 Mon Sep 17 00:00:00 2001
From: Steve Martinelli <stevemar@ca.ibm.com>
Date: Thu, 3 Jul 2014 18:25:42 -0400
Subject: [PATCH] Add support to list compute extensions

Since novaclient has support to list extensions, we should add
some of the logic to our list extensions command.

Closes-Bug: #1337684
Change-Id: I3074225780142df265a34add03e60c0f7c64c711
---
 openstackclient/common/extension.py | 28 +++++++++++++++++++---------
 openstackclient/compute/client.py   |  7 +++++--
 2 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/openstackclient/common/extension.py b/openstackclient/common/extension.py
index a8b1a6b08b..a3f94c09dd 100644
--- a/openstackclient/common/extension.py
+++ b/openstackclient/common/extension.py
@@ -19,16 +19,14 @@ import logging
 
 from cliff import lister
 
-from openstackclient.common import exceptions as exc
 from openstackclient.common import utils
 
 
 class ListExtension(lister.Lister):
     """List extension command"""
 
-    # TODO(mfisch): add support for volume and compute
-    # when the underlying APIs support it. Add support
-    # for network when it's added to openstackclient.
+    # TODO(mfisch): add support for volume and network
+    # when the underlying APIs support it.
 
     log = logging.getLogger(__name__ + '.ListExtension')
 
@@ -44,6 +42,11 @@ class ListExtension(lister.Lister):
             action='store_true',
             default=False,
             help='List extensions for the Identity API')
+        parser.add_argument(
+            '--compute',
+            action='store_true',
+            default=False,
+            help='List extensions for the Compute API')
         return parser
 
     def take_action(self, parsed_args):
@@ -59,17 +62,24 @@ class ListExtension(lister.Lister):
 
         # by default we want to show everything, unless the
         # user specifies one or more of the APIs to show
-        # for now, only identity is supported
-        show_all = (not parsed_args.identity)
+        # for now, only identity and compute are supported.
+        show_all = (not parsed_args.identity and not parsed_args.compute)
 
         if parsed_args.identity or show_all:
             identity_client = self.app.client_manager.identity
             try:
                 data += identity_client.extensions.list()
             except Exception:
-                raise exc.CommandError(
-                    "Extensions list not supported by"
-                    " identity API")
+                message = "Extensions list not supported by Identity API"
+                self.log.warning(message)
+
+        if parsed_args.compute or show_all:
+            compute_client = self.app.client_manager.compute
+            try:
+                data += compute_client.list_extensions.show_all()
+            except Exception:
+                message = "Extensions list not supported by Compute API"
+                self.log.warning(message)
 
         return (columns,
                 (utils.get_item_properties(
diff --git a/openstackclient/compute/client.py b/openstackclient/compute/client.py
index 3dacee88cf..c87128095f 100644
--- a/openstackclient/compute/client.py
+++ b/openstackclient/compute/client.py
@@ -15,6 +15,9 @@
 
 import logging
 
+from novaclient import extension
+from novaclient.v1_1.contrib import list_extensions
+
 from openstackclient.common import utils
 
 LOG = logging.getLogger(__name__)
@@ -39,6 +42,7 @@ def make_client(instance):
     # Set client http_log_debug to True if verbosity level is high enough
     http_log_debug = utils.get_effective_log_level() <= logging.DEBUG
 
+    extensions = [extension.Extension('list_extensions', list_extensions)]
     client = compute_client(
         username=instance._username,
         api_key=instance._password,
@@ -49,8 +53,7 @@ def make_client(instance):
         region_name=instance._region_name,
         # FIXME(dhellmann): get endpoint_type from option?
         endpoint_type='publicURL',
-        # FIXME(dhellmann): add extension discovery
-        extensions=[],
+        extensions=extensions,
         service_type=API_NAME,
         # FIXME(dhellmann): what is service_name?
         service_name='',