From c31c1365573d10bd09afad47ca1974af3e50b5eb Mon Sep 17 00:00:00 2001
From: Flavio Percoco <flaper87@gmail.com>
Date: Fri, 25 Sep 2015 10:54:29 +0200
Subject: [PATCH] No auth when token and endpoint are passed

The latest change to the auth_required logic introduced a bug were even
when the token and endpoint were passed, authentication was being
required.

This patch fixes that issue and makes sure that authentication is not
required when these 2 arguements are present.

Closes-bug: #1499540

Change-Id: I4c9c15ba526378970da5461511ed922d42c5a9f9
---
 glanceclient/shell.py                 | 17 ++++++-----------
 glanceclient/tests/unit/test_shell.py | 19 +++++++++++++++++++
 2 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/glanceclient/shell.py b/glanceclient/shell.py
index faa014c6..b00e6f73 100755
--- a/glanceclient/shell.py
+++ b/glanceclient/shell.py
@@ -443,18 +443,13 @@ class OpenStackImagesShell(object):
         return ks_session
 
     def _get_endpoint_and_token(self, args):
-        image_url = self._get_image_url(args)
+        endpoint = self._get_image_url(args)
         auth_token = args.os_auth_token
 
-        auth_reqd = (not (auth_token and image_url) or
-                     (hasattr(args, 'func') and
-                      utils.is_authentication_required(args.func)))
-
-        if not auth_reqd:
-            endpoint = image_url
-            token = args.os_auth_token
-        else:
+        auth_req = (hasattr(args, 'func') and
+                    utils.is_authentication_required(args.func))
 
+        if auth_req and not (endpoint and auth_token):
             if not args.os_username:
                 raise exc.CommandError(
                     _("You must provide a username via"
@@ -527,7 +522,7 @@ class OpenStackImagesShell(object):
                 'key': args.os_key
             }
             ks_session = self._get_keystone_session(**kwargs)
-            token = args.os_auth_token or ks_session.get_token()
+            auth_token = args.os_auth_token or ks_session.get_token()
 
             endpoint_type = args.os_endpoint_type or 'public'
             service_type = args.os_service_type or 'image'
@@ -536,7 +531,7 @@ class OpenStackImagesShell(object):
                 interface=endpoint_type,
                 region_name=args.os_region_name)
 
-        return endpoint, token
+        return endpoint, auth_token
 
     def _get_versioned_client(self, api_version, args):
         endpoint, token = self._get_endpoint_and_token(args)
diff --git a/glanceclient/tests/unit/test_shell.py b/glanceclient/tests/unit/test_shell.py
index 6c374624..3247d052 100644
--- a/glanceclient/tests/unit/test_shell.py
+++ b/glanceclient/tests/unit/test_shell.py
@@ -295,6 +295,25 @@ class ShellTest(testutils.TestCase):
         glance_shell.main(args.split())
         self._assert_auth_plugin_args()
 
+    @mock.patch('glanceclient.Client')
+    def test_endpoint_token_no_auth_req(self, mock_client):
+
+        def verify_input(version=None, endpoint=None, *args, **kwargs):
+            self.assertIn('token', kwargs)
+            self.assertEqual(TOKEN_ID, kwargs['token'])
+            self.assertEqual(DEFAULT_IMAGE_URL, endpoint)
+            return mock.MagicMock()
+
+        mock_client.side_effect = verify_input
+        glance_shell = openstack_shell.OpenStackImagesShell()
+        args = ['--os-image-api-version', '2',
+                '--os-auth-token', TOKEN_ID,
+                '--os-image-url', DEFAULT_IMAGE_URL,
+                'image-list']
+
+        glance_shell.main(args)
+        self.assertEqual(1, mock_client.call_count)
+
     @mock.patch('sys.stdin', side_effect=mock.MagicMock)
     @mock.patch('getpass.getpass', return_value='password')
     @mock.patch('glanceclient.v2.client.Client')