From bf582a2d56e6eaaaf20f8b399dd6bdd7789e056f Mon Sep 17 00:00:00 2001
From: Doug Hellmann <doug.hellmann@dreamhost.com>
Date: Thu, 10 May 2012 15:20:40 -0400
Subject: [PATCH] look at the command the user is going to run before trying to
 authenticate them

Change-Id: I4edc6a0f1e16be4cd80fe01f62869094b50ef120
---
 openstackclient/common/clientmanager.py |  3 --
 openstackclient/shell.py                | 46 ++++++++++++++++---------
 2 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/openstackclient/common/clientmanager.py b/openstackclient/common/clientmanager.py
index aa50e65253..e3f8588a28 100644
--- a/openstackclient/common/clientmanager.py
+++ b/openstackclient/common/clientmanager.py
@@ -71,9 +71,6 @@ class ClientManager(object):
         self._image_api_version = image_api_version
         self._service_catalog = None
 
-        # Create the identity client
-        self.identity
-
         if not self._url:
             # Populate other password flow attributes
             self._token = self.identity.auth_token
diff --git a/openstackclient/shell.py b/openstackclient/shell.py
index 986cdcdbfa..8ffe81fd01 100644
--- a/openstackclient/shell.py
+++ b/openstackclient/shell.py
@@ -124,24 +124,10 @@ class OpenStackShell(App):
 
         return parser
 
-    def initialize_app(self):
-        """Global app init bits:
-
-        * set up API versions
-        * validate authentication info
-        * authenticate against Identity if requested
+    def authenticate_user(self):
+        """Make sure the user has provided all of the authentication
+        info we need.
         """
-
-        super(OpenStackShell, self).initialize_app()
-
-        # stash selected API versions for later
-        # TODO(dtroyer): how do extenstions add their version requirements?
-        self.api_version = {
-            'compute': self.options.os_compute_api_version,
-            'identity': self.options.os_identity_api_version,
-            'image': self.options.os_image_api_version,
-        }
-
         self.log.debug('validating authentication options')
         if self.options.os_token or self.options.os_url:
             # Token flow auth takes priority
@@ -190,6 +176,32 @@ class OpenStackShell(App):
             compute_api_version=self.options.os_compute_api_version,
             image_api_version=self.options.os_image_api_version,
             )
+        return
+
+    def initialize_app(self, argv):
+        """Global app init bits:
+
+        * set up API versions
+        * validate authentication info
+        * authenticate against Identity if requested
+        """
+
+        super(OpenStackShell, self).initialize_app(argv)
+
+        # stash selected API versions for later
+        # TODO(dtroyer): how do extenstions add their version requirements?
+        self.api_version = {
+            'compute': self.options.os_compute_api_version,
+            'identity': self.options.os_identity_api_version,
+            'image': self.options.os_image_api_version,
+        }
+
+        # If the user is not asking for help, make sure they
+        # have given us auth.
+        cmd_info = self.command_manager.find_command(argv)
+        cmd_factory, cmd_name, sub_argv = cmd_info
+        if cmd_name != 'help':
+            self.authenticate_user()
 
         self.log.debug("API: Identity=%s Compute=%s Image=%s" % (
             self.api_version['identity'],