Fixing auth for keystone v2.0

* Patch https://review.openstack.org/364267 broke
   the compatibility with Keystone API v2.0
 * This patch fixes the backward compatibility
   with Keystone v2.0

Change-Id: I612595c8460f577f5dc51714843d00e090e8c7a6
This commit is contained in:
Nikolay Mahotkin
2016-09-05 16:47:11 +03:00
parent 64bad97804
commit 9667cb1eae
2 changed files with 60 additions and 42 deletions

View File

@@ -51,14 +51,13 @@ def authenticate(mistral_url=None, username=None,
project_id = keystone.project_id
if not mistral_url:
catalog = keystone.service_catalog.get_endpoints(
service_type=service_type,
endpoint_type=endpoint_type
)
if service_type in catalog:
service = catalog.get(service_type)
mistral_url = service[0].get('url') if service else None
try:
mistral_url = keystone.service_catalog.url_for(
service_type=service_type,
endpoint_type=endpoint_type
)
except Exception:
mistral_url = None
return mistral_url, token, project_id, user_id

View File

@@ -24,14 +24,38 @@ import osprofiler.profiler
from mistralclient.api import client
AUTH_HTTP_URL = 'http://localhost:35357/v3'
AUTH_HTTPS_URL = AUTH_HTTP_URL.replace('http', 'https')
AUTH_HTTP_URL_v3 = 'http://localhost:35357/v3'
AUTH_HTTP_URL_v2_0 = 'http://localhost:35357/v2.0'
AUTH_HTTPS_URL = AUTH_HTTP_URL_v3.replace('http', 'https')
MISTRAL_HTTP_URL = 'http://localhost:8989/v2'
MISTRAL_HTTPS_URL = MISTRAL_HTTP_URL.replace('http', 'https')
PROFILER_HMAC_KEY = 'SECRET_HMAC_KEY'
class BaseClientTests(testtools.TestCase):
@mock.patch('keystoneclient.v2_0.client.Client')
def test_mistral_url_from_catalog_v2(self, keystone_client_mock):
keystone_client_instance = keystone_client_mock.return_value
keystone_client_instance.auth_token = str(uuid.uuid4())
keystone_client_instance.project_id = str(uuid.uuid4())
keystone_client_instance.user_id = str(uuid.uuid4())
url_for = mock.Mock(return_value='http://mistral_host:8989/v2')
keystone_client_instance.service_catalog.url_for = url_for
mistralclient = client.client(
username='mistral',
project_name='mistral',
auth_url=AUTH_HTTP_URL_v2_0,
service_type='workflowv2'
)
self.assertEqual(
'http://mistral_host:8989/v2',
mistralclient.http_client.base_url
)
@mock.patch('keystoneclient.v3.client.Client')
def test_mistral_url_from_catalog(self, keystone_client_mock):
keystone_client_instance = keystone_client_mock.return_value
@@ -39,25 +63,14 @@ class BaseClientTests(testtools.TestCase):
keystone_client_instance.project_id = str(uuid.uuid4())
keystone_client_instance.user_id = str(uuid.uuid4())
get_endpoints = mock.Mock()
get_endpoints.return_value = {
'workflowv2': [
{
'url': 'http://mistral_host:8989/v2',
'interface': 'public',
'region': None,
'region_id': None,
'id': '446eca511e8d45acae0924aea42a4c9f'
}
]
}
url_for = mock.Mock(return_value='http://mistral_host:8989/v2')
keystone_client_instance.service_catalog.get_endpoints = get_endpoints
keystone_client_instance.service_catalog.url_for = url_for
mistralclient = client.client(
username='mistral',
project_name='mistral',
auth_url=AUTH_HTTP_URL,
auth_url=AUTH_HTTP_URL_v3,
service_type='workflowv2'
)
@@ -68,11 +81,13 @@ class BaseClientTests(testtools.TestCase):
@mock.patch('keystoneclient.v3.client.Client')
@mock.patch('mistralclient.api.httpclient.HTTPClient')
def test_mistral_url_default(self, mock, keystone_client_mock):
def test_mistral_url_default(self, mocked, keystone_client_mock):
keystone_client_instance = keystone_client_mock.return_value
keystone_client_instance.auth_token = str(uuid.uuid4())
keystone_client_instance.project_id = str(uuid.uuid4())
keystone_client_instance.user_id = str(uuid.uuid4())
url_for = mock.Mock(side_effect=Exception)
keystone_client_instance.service_catalog.url_for = url_for
expected_args = (
MISTRAL_HTTP_URL,
@@ -91,20 +106,22 @@ class BaseClientTests(testtools.TestCase):
client.client(
username='mistral',
project_name='mistral',
auth_url=AUTH_HTTP_URL
auth_url=AUTH_HTTP_URL_v3
)
self.assertTrue(mock.called)
self.assertEqual(mock.call_args[0], expected_args)
self.assertDictEqual(mock.call_args[1], expected_kwargs)
self.assertTrue(mocked.called)
self.assertEqual(mocked.call_args[0], expected_args)
self.assertDictEqual(mocked.call_args[1], expected_kwargs)
@mock.patch('keystoneclient.v3.client.Client')
@mock.patch('mistralclient.api.httpclient.HTTPClient')
def test_mistral_url_https_insecure(self, mock, keystone_client_mock):
def test_mistral_url_https_insecure(self, mocked, keystone_client_mock):
keystone_client_instance = keystone_client_mock.return_value
keystone_client_instance.auth_token = str(uuid.uuid4())
keystone_client_instance.project_id = str(uuid.uuid4())
keystone_client_instance.user_id = str(uuid.uuid4())
url_for = mock.Mock(side_effect=Exception)
keystone_client_instance.service_catalog.url_for = url_for
expected_args = (
MISTRAL_HTTPS_URL,
@@ -124,14 +141,14 @@ class BaseClientTests(testtools.TestCase):
mistral_url=MISTRAL_HTTPS_URL,
username='mistral',
project_name='mistral',
auth_url=AUTH_HTTP_URL,
auth_url=AUTH_HTTP_URL_v3,
cacert=None,
insecure=True
)
self.assertTrue(mock.called)
self.assertEqual(mock.call_args[0], expected_args)
self.assertDictEqual(mock.call_args[1], expected_kwargs)
self.assertTrue(mocked.called)
self.assertEqual(mocked.call_args[0], expected_args)
self.assertDictEqual(mocked.call_args[1], expected_kwargs)
@mock.patch('keystoneclient.v3.client.Client')
@mock.patch('mistralclient.api.httpclient.HTTPClient')
@@ -162,7 +179,7 @@ class BaseClientTests(testtools.TestCase):
mistral_url=MISTRAL_HTTPS_URL,
username='mistral',
project_name='mistral',
auth_url=AUTH_HTTP_URL,
auth_url=AUTH_HTTP_URL_v3,
cacert=path,
insecure=False
)
@@ -187,7 +204,7 @@ class BaseClientTests(testtools.TestCase):
mistral_url=MISTRAL_HTTPS_URL,
username='mistral',
project_name='mistral',
auth_url=AUTH_HTTP_URL,
auth_url=AUTH_HTTP_URL_v3,
cacert='/path/to/foobar',
insecure=False
)
@@ -208,7 +225,7 @@ class BaseClientTests(testtools.TestCase):
mistral_url=MISTRAL_HTTPS_URL,
username='mistral',
project_name='mistral',
auth_url=AUTH_HTTP_URL,
auth_url=AUTH_HTTP_URL_v3,
cacert=path,
insecure=True
)
@@ -220,11 +237,13 @@ class BaseClientTests(testtools.TestCase):
@mock.patch('keystoneclient.v3.client.Client')
@mock.patch('mistralclient.api.httpclient.HTTPClient')
def test_mistral_profile_enabled(self, mock, keystone_client_mock):
def test_mistral_profile_enabled(self, mocked, keystone_client_mock):
keystone_client_instance = keystone_client_mock.return_value
keystone_client_instance.auth_token = str(uuid.uuid4())
keystone_client_instance.project_id = str(uuid.uuid4())
keystone_client_instance.user_id = str(uuid.uuid4())
url_for = mock.Mock(side_effect=Exception)
keystone_client_instance.service_catalog.url_for = url_for
expected_args = (
MISTRAL_HTTP_URL,
@@ -243,13 +262,13 @@ class BaseClientTests(testtools.TestCase):
client.client(
username='mistral',
project_name='mistral',
auth_url=AUTH_HTTP_URL,
auth_url=AUTH_HTTP_URL_v3,
profile=PROFILER_HMAC_KEY
)
self.assertTrue(mock.called)
self.assertEqual(mock.call_args[0], expected_args)
self.assertDictEqual(mock.call_args[1], expected_kwargs)
self.assertTrue(mocked.called)
self.assertEqual(mocked.call_args[0], expected_args)
self.assertDictEqual(mocked.call_args[1], expected_kwargs)
profiler = osprofiler.profiler.get()