summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorDean Troyer <dtroyer@gmail.com>2017-04-24 18:57:05 -0500
committerDean Troyer <dtroyer@gmail.com>2017-04-24 18:57:10 -0500
commitef99f444628282d06feae04514bd2a6328d87b93 (patch)
tree679a61d840cef175b03ba2f12c4ef5b47f932b29 /openstackclient
parentdb6081fb802559cdb6623bbc5dbff597cd287b07 (diff)
downloadpython-openstackclient-ef99f444628282d06feae04514bd2a6328d87b93.tar.gz
Improve no-auth path
The commands that do not require authentication sometimes still need to call ClientManager.is_network_endpoint_enabled() to see if Neutron is available. Optimize the paths a bit to skip auth when it is not necessary; the upshot is Neutron will be assumed in these cases now. This gets a LOT cleaner when it appears is a future osc-lib. Change-Id: Ifaddc57dfa192bde04d0482e2cdcce111313a22a
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/common/clientmanager.py15
-rw-r--r--openstackclient/shell.py6
-rw-r--r--openstackclient/tests/unit/common/test_clientmanager.py4
3 files changed, 23 insertions, 2 deletions
diff --git a/openstackclient/common/clientmanager.py b/openstackclient/common/clientmanager.py
index 27f3b705..67912f0c 100644
--- a/openstackclient/common/clientmanager.py
+++ b/openstackclient/common/clientmanager.py
@@ -41,6 +41,9 @@ class ClientManager(clientmanager.ClientManager):
# A simple incrementing version for the plugin to know what is available
PLUGIN_INTERFACE_VERSION = "2"
+ # Let the commands set this
+ _auth_required = False
+
def __init__(
self,
cli_options=None,
@@ -72,7 +75,10 @@ class ClientManager(clientmanager.ClientManager):
# because openstack_config is an optional argument to
# CloudConfig.__init__() and we'll die if it was not
# passed.
- if self._cli_options._openstack_config is not None:
+ if (
+ self._auth_required and
+ self._cli_options._openstack_config is not None
+ ):
self._cli_options._openstack_config._pw_callback = \
shell.prompt_for_password
try:
@@ -85,6 +91,13 @@ class ClientManager(clientmanager.ClientManager):
return super(ClientManager, self).setup_auth()
+ @property
+ def auth_ref(self):
+ if not self._auth_required:
+ return None
+ else:
+ return super(ClientManager, self).auth_ref
+
def _fallback_load_auth_plugin(self, e):
# NOTES(RuiChen): Hack to avoid auth plugins choking on data they don't
# expect, delete fake token and endpoint, then try to
diff --git a/openstackclient/shell.py b/openstackclient/shell.py
index 8fdf0b61..2e384f8f 100644
--- a/openstackclient/shell.py
+++ b/openstackclient/shell.py
@@ -182,6 +182,12 @@ class OpenStackShell(shell.OpenStackShell):
# get_one_Cloud()'s validation to avoid loading plugins
validate = cmd.auth_required
+ # Force skipping auth for commands that do not need it
+ # NOTE(dtroyer): This is here because ClientManager does not have
+ # visibility into the Command object to get
+ # auth_required. It needs to move into osc-lib
+ self.client_manager._auth_required = cmd.auth_required
+
# Validate auth options
self.cloud = self.cloud_config.get_one_cloud(
cloud=self.options.cloud,
diff --git a/openstackclient/tests/unit/common/test_clientmanager.py b/openstackclient/tests/unit/common/test_clientmanager.py
index 7f82c35d..f15f9af1 100644
--- a/openstackclient/tests/unit/common/test_clientmanager.py
+++ b/openstackclient/tests/unit/common/test_clientmanager.py
@@ -66,4 +66,6 @@ class TestClientManager(osc_lib_test_utils.TestClientManager):
)
self.assertFalse(client_manager.is_service_available('network'))
- self.assertFalse(client_manager.is_network_endpoint_enabled())
+ # This is True because ClientManager.auth_ref returns None in this
+ # test; "no service catalog" means use Network API by default now
+ self.assertTrue(client_manager.is_network_endpoint_enabled())