Change Manilaclient to use --os-region-name param

Manilaclient ignores --os-region-param now. Change client from
'manilaclient/v1/client.py' to use first endpoint with a matching region.

Closes-bug: #1450613

Change-Id: I7fd76b0d874a91952513c40b4a7bdb0c45241dad
(cherry picked from commit 0d257aedce)
This commit is contained in:
Julia Varlamova 2015-09-18 08:56:58 -04:00 committed by Ben Swartzlander
parent 0bbd2144f7
commit 07be7c8ede
2 changed files with 80 additions and 2 deletions

View File

@ -13,14 +13,23 @@
import uuid
from keystoneclient import session
import mock
from manilaclient.common import constants
from manilaclient import exceptions
from manilaclient import httpclient
from manilaclient.tests.unit import utils
from manilaclient.v1 import client
class ClientTest(utils.TestCase):
def setUp(self):
super(ClientTest, self).setUp()
self.catalog = {
'share': [
{'region': 'TestRegion', 'publicURL': 'http://1.2.3.4'},
],
}
def test_adapter_properties(self):
# sample of properties, there are many more
@ -59,3 +68,65 @@ class ClientTest(utils.TestCase):
self.assertIsNotNone(c.client)
self.assertIsNone(c.keystone_client)
@mock.patch.object(httpclient, 'HTTPClient', mock.Mock())
@mock.patch.object(client.Client, '_get_keystone_client', mock.Mock())
def test_valid_region_name(self):
kc = client.Client._get_keystone_client.return_value
kc.service_catalog = mock.Mock()
kc.service_catalog.get_endpoints = mock.Mock(return_value=self.catalog)
c = client.Client(api_version=constants.MAX_API_VERSION,
region_name='TestRegion')
self.assertTrue(client.Client._get_keystone_client.called)
kc.service_catalog.get_endpoints.assert_called_once_with('share')
httpclient.HTTPClient.assert_called_once_with(
'http://1.2.3.4',
mock.ANY,
'python-manilaclient',
insecure=False,
cacert=None,
timeout=None,
retries=None,
http_log_debug=False,
api_version=constants.MAX_API_VERSION)
self.assertIsNotNone(c.client)
@mock.patch.object(client.Client, '_get_keystone_client', mock.Mock())
def test_nonexistent_region_name(self):
kc = client.Client._get_keystone_client.return_value
kc.service_catalog = mock.Mock()
kc.service_catalog.get_endpoints = mock.Mock(return_value=self.catalog)
self.assertRaises(RuntimeError, client.Client,
api_version=constants.MAX_API_VERSION,
region_name='FakeRegion')
self.assertTrue(client.Client._get_keystone_client.called)
kc.service_catalog.get_endpoints.assert_called_once_with('share')
@mock.patch.object(httpclient, 'HTTPClient', mock.Mock())
@mock.patch.object(client.Client, '_get_keystone_client', mock.Mock())
def test_regions_with_same_name(self):
catalog = {
'share': [
{'region': 'FirstRegion', 'publicURL': 'http://1.2.3.4'},
{'region': 'secondregion', 'publicURL': 'http://1.1.1.1'},
{'region': 'SecondRegion', 'publicURL': 'http://2.2.2.2'},
],
}
kc = client.Client._get_keystone_client.return_value
kc.service_catalog = mock.Mock()
kc.service_catalog.get_endpoints = mock.Mock(return_value=catalog)
c = client.Client(api_version=constants.MAX_API_VERSION,
region_name='SecondRegion')
self.assertTrue(client.Client._get_keystone_client.called)
kc.service_catalog.get_endpoints.assert_called_once_with('share')
httpclient.HTTPClient.assert_called_once_with(
'http://2.2.2.2',
mock.ANY,
'python-manilaclient',
insecure=False,
cacert=None,
timeout=None,
retries=None,
http_log_debug=False,
api_version=constants.MAX_API_VERSION)
self.assertIsNotNone(c.client)

View File

@ -145,9 +145,16 @@ class Client(object):
elif not service_catalog_url:
catalog = self.keystone_client.service_catalog.get_endpoints(
service_type)
if service_type in catalog:
for e_type, endpoint in catalog.get(service_type)[0].items():
if not region_name:
catalog_entry = catalog.get(service_type)[0]
else:
for catalog_entry in catalog.get(service_type):
if catalog_entry.get("region") == region_name:
break
else:
catalog_entry = {}
for e_type, endpoint in catalog_entry.items():
if str(e_type).lower() == str(endpoint_type).lower():
service_catalog_url = endpoint
break