Skip to content

Commit 68d1550

Browse files
author
Donagh McCabe
committed
Add region_name support
Add --os-region-name (and OS_REGION_NAME env) to bin/swift Add region_name to the os_options in Connection class. bug 1019832 Change-Id: Id8515d97e5351638dce10581c7368f61518e1fa7
1 parent 4b4fbf0 commit 68d1550

File tree

4 files changed

+41
-5
lines changed

4 files changed

+41
-5
lines changed

bin/swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,7 @@ def parse_args(parser, args, enforce_requires=True):
10281028
'endpoint_type': options.os_endpoint_type,
10291029
'auth_token': options.os_auth_token,
10301030
'object_storage_url': options.os_storage_url,
1031+
'region_name': options.os_region_name,
10311032
}
10321033

10331034
# Handle trailing '/' in URL
@@ -1127,6 +1128,13 @@ Example:
11271128
'Defaults to env[OS_STORAGE_URL]')
11281129
parser.add_option('--os_storage_url',
11291130
help=SUPPRESS_HELP)
1131+
parser.add_option('--os-region-name',
1132+
metavar='<region-name>',
1133+
default=environ.get('OS_REGION_NAME'),
1134+
help='Openstack region name. '
1135+
'Defaults to env[OS_REGION_NAME]')
1136+
parser.add_option('--os_region_name',
1137+
help=SUPPRESS_HELP)
11301138
parser.add_option('--os-service-type',
11311139
metavar='<service-type>',
11321140
default=environ.get('OS_SERVICE_TYPE'),

swiftclient/client.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,16 +236,23 @@ def get_keystoneclient_2_0(auth_url, user, key, os_options):
236236
We are using the keystoneclient library for our 2.0 authentication.
237237
"""
238238
from keystoneclient.v2_0 import client as ksclient
239+
from keystoneclient import exceptions
239240
_ksclient = ksclient.Client(username=user,
240241
password=key,
241242
tenant_name=os_options.get('tenant_name'),
242243
tenant_id=os_options.get('tenant_id'),
243244
auth_url=auth_url)
244245
service_type = os_options.get('service_type') or 'object-store'
245246
endpoint_type = os_options.get('endpoint_type') or 'publicURL'
246-
endpoint = _ksclient.service_catalog.url_for(
247-
service_type=service_type,
248-
endpoint_type=endpoint_type)
247+
try:
248+
endpoint = _ksclient.service_catalog.url_for(
249+
attr='region',
250+
filter_value=os_options.get('region_name'),
251+
service_type=service_type,
252+
endpoint_type=endpoint_type)
253+
except exceptions.EndpointNotFound:
254+
raise ClientException('Endpoint for %s not found - '
255+
'have you specified a region?' % service_type)
249256
return (endpoint, _ksclient.auth_token)
250257

251258

@@ -924,7 +931,7 @@ def __init__(self, authurl, user, key, retries=5, preauthurl=None,
924931
to a auth 2.0 system.
925932
:param os_options: The OpenStack options which can have tenant_id,
926933
auth_token, service_type, endpoint_type,
927-
tenant_name, object_storage_url
934+
tenant_name, object_storage_url, region_name
928935
"""
929936
self.authurl = authurl
930937
self.user = user

tests/test_swiftclient.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,25 @@ def test_auth_v2_with_os_options(self):
220220
self.assertTrue(url.startswith("http"))
221221
self.assertTrue(token)
222222

223+
def test_auth_v2_with_os_region_name(self):
224+
os_options={'region_name': 'good-region',
225+
'tenant_name': 'asdf'}
226+
c.get_keystoneclient_2_0 = fake_get_keystoneclient_2_0(os_options)
227+
url, token = c.get_auth('http://www.test.com', 'asdf', 'asdf',
228+
os_options=os_options,
229+
auth_version="2.0")
230+
self.assertTrue(url.startswith("http"))
231+
self.assertTrue(token)
232+
233+
def test_auth_v2_no_endpoint(self):
234+
os_options={'region_name': 'unknown_region',
235+
'tenant_name': 'asdf'}
236+
c.get_keystoneclient_2_0 = fake_get_keystoneclient_2_0(
237+
os_options,
238+
c.ClientException)
239+
self.assertRaises(c.ClientException, c.get_auth,
240+
'http://www.tests.com', 'asdf', 'asdf',
241+
os_options=os_options, auth_version='2.0')
223242

224243
class TestGetAccount(MockHttpTest):
225244

tests/utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616

1717
from eventlet import Timeout, sleep
1818

19-
def fake_get_keystoneclient_2_0(os_options):
19+
def fake_get_keystoneclient_2_0(os_options, exc=None):
2020
def fake_get_keystoneclient_2_0(auth_url,
2121
user,
2222
key,
2323
actual_os_options):
24+
if exc:
25+
raise exc('test')
2426
if actual_os_options != os_options:
2527
return "", None
2628
return ("http://url/", "token")

0 commit comments

Comments
 (0)