Avoid _get_keystone_session() if auth_plugin

Avoid calling _get_keystone_session() if auth_plugin is provided by the
user

Closes-Bug: 1421433
Change-Id: I37a7139107c357caf1a25ac3d0a3457afade0f83
This commit is contained in:
Derrick J. Wippler
2015-02-12 16:28:35 -06:00
parent bb7443c6ce
commit e3a0556e56
3 changed files with 59 additions and 6 deletions

View File

@@ -680,8 +680,11 @@ class OpenStackCinderShell(object):
"You must provide an authentication URL " "You must provide an authentication URL "
"through --os-auth-url or env[OS_AUTH_URL].") "through --os-auth-url or env[OS_AUTH_URL].")
auth_session = self._get_keystone_session() auth_session = None
if not service_type_input or not api_version_input: if not auth_plugin:
auth_session = self._get_keystone_session()
if auth_session and (not service_type_input or not api_version_input):
# NOTE(thingee): Unfortunately the v2 shell is tied to volumev2 # NOTE(thingee): Unfortunately the v2 shell is tied to volumev2
# service_type. If the service_catalog just contains service_type # service_type. If the service_catalog just contains service_type
# volume with x.x.x.x:8776 for discovery, and the user sets version # volume with x.x.x.x:8776 for discovery, and the user sets version

View File

@@ -47,9 +47,9 @@ def mock_http_request(resp=None):
"endpoints": [ "endpoints": [
{ {
"region": "RegionOne", "region": "RegionOne",
"adminURL": "http://localhost:8774/v1.1", "adminURL": "http://localhost:8774/v1",
"internalURL": "http://localhost:8774/v1.1", "internalURL": "http://localhost:8774/v1",
"publicURL": "http://localhost:8774/v1.1/", "publicURL": "http://localhost:8774/v1/",
}, },
], ],
}, },

View File

@@ -18,12 +18,17 @@ import sys
import fixtures import fixtures
from keystoneclient import fixture as keystone_client_fixture from keystoneclient import fixture as keystone_client_fixture
import mock import mock
import pkg_resources
import requests_mock import requests_mock
import requests
from six import moves from six import moves
from testtools import matchers from testtools import matchers
from cinderclient import exceptions from cinderclient import exceptions
from cinderclient import auth_plugin
from cinderclient import shell from cinderclient import shell
from cinderclient.tests.unit.test_auth_plugins import mock_http_request
from cinderclient.tests.unit.test_auth_plugins import requested_headers
from cinderclient.tests.unit.fixture_data import base as fixture_base from cinderclient.tests.unit.fixture_data import base as fixture_base
from cinderclient.tests.unit.fixture_data import keystone_client from cinderclient.tests.unit.fixture_data import keystone_client
from cinderclient.tests.unit import utils from cinderclient.tests.unit import utils
@@ -41,8 +46,9 @@ class ShellTest(utils.TestCase):
} }
# Patch os.environ to avoid required auth info. # Patch os.environ to avoid required auth info.
def make_env(self, exclude=None): def make_env(self, exclude=None, include=None):
env = dict((k, v) for k, v in self.FAKE_ENV.items() if k != exclude) env = dict((k, v) for k, v in self.FAKE_ENV.items() if k != exclude)
env.update(include or {})
self.useFixture(fixtures.MonkeyPatch('os.environ', env)) self.useFixture(fixtures.MonkeyPatch('os.environ', env))
def setUp(self): def setUp(self):
@@ -324,6 +330,50 @@ class ShellTest(utils.TestCase):
# Make sure we are actually prompted. # Make sure we are actually prompted.
mock_getpass.assert_called_with('OS Password: ') mock_getpass.assert_called_with('OS Password: ')
@mock.patch.object(requests, "request")
@mock.patch.object(pkg_resources, "iter_entry_points")
def test_auth_system_not_keystone(self, mock_iter_entry_points,
mock_request):
"""Test that we can authenticate using the auth plugin system."""
non_keystone_auth_url = "http://non-keystone-url.com/v2.0"
class MockEntrypoint(pkg_resources.EntryPoint):
def load(self):
return FakePlugin
class FakePlugin(auth_plugin.BaseAuthPlugin):
def authenticate(self, cls, auth_url):
cls._authenticate(auth_url, {"fake": "me"})
def get_auth_url(self):
return non_keystone_auth_url
mock_iter_entry_points.side_effect = lambda _t: [
MockEntrypoint("fake", "fake", ["FakePlugin"])]
mock_request.side_effect = mock_http_request()
# Tell the shell we wish to use our 'fake' auth instead of keystone
# and the auth plugin will provide the auth url
self.make_env(exclude="OS_AUTH_URL",
include={'OS_AUTH_SYSTEM': 'fake'})
# This should fail as we have not setup a mock response for 'list',
# however auth should have been called
_shell = shell.OpenStackCinderShell()
self.assertRaises(KeyError, _shell.main, ['list'])
headers = requested_headers(_shell.cs)
token_url = _shell.cs.client.auth_url + "/tokens"
self.assertEqual(non_keystone_auth_url + "/tokens", token_url)
mock_request.assert_any_called(
"POST",
token_url,
headers=headers,
data='{"fake": "me"}',
allow_redirects=True,
**self.TEST_REQUEST_BASE)
class CinderClientArgumentParserTest(utils.TestCase): class CinderClientArgumentParserTest(utils.TestCase):