Skip to content

Commit 3c2e856

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Add os_tenant_name to bin/swift and common.client"
2 parents f26d2e5 + 208b8e8 commit 3c2e856

File tree

3 files changed

+70
-42
lines changed

3 files changed

+70
-42
lines changed

bin/swift

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -176,17 +176,6 @@ def json_request(method, url, **kwargs):
176176
return resp, body
177177

178178

179-
def get_conn(options):
180-
"""
181-
Return a connection building it from the options.
182-
"""
183-
return Connection(options.auth,
184-
options.user,
185-
options.key,
186-
snet=options.snet,
187-
auth_version=options.auth_version)
188-
189-
190179
def _get_auth_v1_0(url, user, key, snet):
191180
parsed, conn = http_connection(url)
192181
conn.request('GET', parsed.path, '',
@@ -209,15 +198,10 @@ def _get_auth_v1_0(url, user, key, snet):
209198
resp.getheader('x-auth-token'))
210199

211200

212-
def _get_auth_v2_0(url, user, key, snet):
213-
if ':' in user:
214-
tenant, user = user.split(':')
215-
else:
216-
tenant = user
217-
218-
body = {"auth": {"tenantName": tenant,
219-
"passwordCredentials":
220-
{"username": user, "password": key}}}
201+
def _get_auth_v2_0(url, user, tenant_name, key, snet):
202+
body = {'auth': {'passwordCredentials':
203+
{'password': key, 'username': user},
204+
'tenantName': tenant_name}}
221205
token_url = urljoin(url, "tokens")
222206
resp, body = json_request("POST", token_url, body=body)
223207
token_id = None
@@ -243,7 +227,7 @@ def _get_auth_v2_0(url, user, key, snet):
243227
return url, token_id
244228

245229

246-
def get_auth(url, user, key, snet=False, auth_version="1.0"):
230+
def get_auth(url, user, key, snet=False, tenant_name=None, auth_version="1.0"):
247231
"""
248232
Get authentication/authorization credentials.
249233
@@ -257,14 +241,18 @@ def get_auth(url, user, key, snet=False, auth_version="1.0"):
257241
:param user: user to authenticate as
258242
:param key: key or password for authorization
259243
:param snet: use SERVICENET internal network (see above), default is False
260-
:param auth_version: OpenStack authentication version (default is 1.0)
244+
:param auth_version: OpenStack auth version, default is 1.0
245+
:param tenant_name: The tenant/account name, required when connecting
246+
to a auth 2.0 system.
261247
:returns: tuple of (storage URL, auth token)
262248
:raises: ClientException: HTTP GET request to auth URL failed
263249
"""
264250
if auth_version in ["1.0", "1"]:
265251
return _get_auth_v1_0(url, user, key, snet)
266252
elif auth_version in ["2.0", "2"]:
267-
return _get_auth_v2_0(url, user, key, snet)
253+
if not tenant_name:
254+
raise ClientException('No tenant specified')
255+
return _get_auth_v2_0(url, user, tenant_name, key, snet)
268256

269257

270258
def get_account(url, token, marker=None, limit=None, prefix=None,
@@ -818,17 +806,20 @@ class Connection(object):
818806

819807
def __init__(self, authurl, user, key, retries=5, preauthurl=None,
820808
preauthtoken=None, snet=False, starting_backoff=1,
809+
tenant_name=None,
821810
auth_version="1"):
822811
"""
823-
:param authurl: authenitcation URL
812+
:param authurl: authentication URL
824813
:param user: user name to authenticate as
825814
:param key: key/password to authenticate with
826815
:param retries: Number of times to retry the request before failing
827816
:param preauthurl: storage URL (if you have already authenticated)
828817
:param preauthtoken: authentication token (if you have already
829818
authenticated)
830819
:param snet: use SERVICENET internal network default is False
831-
:param auth_version: Openstack auth version.
820+
:param auth_version: OpenStack auth version, default is 1.0
821+
:param tenant_name: The tenant/account name, required when connecting
822+
to a auth 2.0 system.
832823
"""
833824
self.authurl = authurl
834825
self.user = user
@@ -841,9 +832,12 @@ class Connection(object):
841832
self.snet = snet
842833
self.starting_backoff = starting_backoff
843834
self.auth_version = auth_version
835+
self.tenant_name = tenant_name
844836

845837
def get_auth(self):
846-
return get_auth(self.authurl, self.user, self.key, snet=self.snet,
838+
return get_auth(self.authurl, self.user,
839+
self.key, snet=self.snet,
840+
tenant_name=self.tenant_name,
847841
auth_version=self.auth_version)
848842

849843
def http_connection(self):
@@ -971,6 +965,18 @@ class Connection(object):
971965
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
972966

973967

968+
def get_conn(options):
969+
"""
970+
Return a connection building it from the options.
971+
"""
972+
return Connection(options.auth,
973+
options.user,
974+
options.key,
975+
snet=options.snet,
976+
tenant_name=options.os_tenant_name,
977+
auth_version=options.auth_version)
978+
979+
974980
def mkdirs(path):
975981
try:
976982
makedirs(path)
@@ -1931,6 +1937,9 @@ Example:
19311937
parser.add_option('--os_username', dest='os_username',
19321938
default=environ.get('OS_USERNAME'),
19331939
help=SUPPRESS_HELP)
1940+
parser.add_option('--os_tenant_name', dest='os_tenant_name',
1941+
default=environ.get('OS_TENANT_NAME'),
1942+
help=SUPPRESS_HELP)
19341943
parser.add_option('--os_password', dest='os_password',
19351944
default=environ.get('OS_PASSWORD'),
19361945
help=SUPPRESS_HELP)

swift/common/client.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -179,21 +179,17 @@ def _get_auth_v1_0(url, user, key, snet):
179179
if snet:
180180
parsed = list(urlparse(url))
181181
# Second item in the list is the netloc
182-
parsed[1] = 'snet-' + parsed[1]
182+
netloc = parsed[1]
183+
parsed[1] = 'snet-' + netloc
183184
url = urlunparse(parsed)
184185
return url, resp.getheader('x-storage-token',
185186
resp.getheader('x-auth-token'))
186187

187188

188-
def _get_auth_v2_0(url, user, key, snet):
189-
if ':' in user:
190-
tenant, user = user.split(':')
191-
else:
192-
tenant = user
193-
194-
body = {"auth": {"tenantName": tenant,
195-
"passwordCredentials":
196-
{"username": user, "password": key}}}
189+
def _get_auth_v2_0(url, user, tenant_name, key, snet):
190+
body = {'auth': {'passwordCredentials':
191+
{'password': key, 'username': user},
192+
'tenantName': tenant_name}}
197193
token_url = urljoin(url, "tokens")
198194
resp, body = json_request("POST", token_url, body=body)
199195
token_id = None
@@ -219,7 +215,7 @@ def _get_auth_v2_0(url, user, key, snet):
219215
return url, token_id
220216

221217

222-
def get_auth(url, user, key, snet=False, auth_version="1.0"):
218+
def get_auth(url, user, key, snet=False, tenant_name=None, auth_version="1.0"):
223219
"""
224220
Get authentication/authorization credentials.
225221
@@ -233,14 +229,18 @@ def get_auth(url, user, key, snet=False, auth_version="1.0"):
233229
:param user: user to authenticate as
234230
:param key: key or password for authorization
235231
:param snet: use SERVICENET internal network (see above), default is False
236-
:param auth_version: OpenStack authentication version (default is 1.0)
232+
:param auth_version: OpenStack auth version, default is 1.0
233+
:param tenant_name: The tenant/account name, required when connecting
234+
to a auth 2.0 system.
237235
:returns: tuple of (storage URL, auth token)
238236
:raises: ClientException: HTTP GET request to auth URL failed
239237
"""
240238
if auth_version in ["1.0", "1"]:
241239
return _get_auth_v1_0(url, user, key, snet)
242240
elif auth_version in ["2.0", "2"]:
243-
return _get_auth_v2_0(url, user, key, snet)
241+
if not tenant_name:
242+
raise ClientException('No tenant specified')
243+
return _get_auth_v2_0(url, user, tenant_name, key, snet)
244244

245245

246246
def get_account(url, token, marker=None, limit=None, prefix=None,
@@ -794,6 +794,7 @@ class Connection(object):
794794

795795
def __init__(self, authurl, user, key, retries=5, preauthurl=None,
796796
preauthtoken=None, snet=False, starting_backoff=1,
797+
tenant_name=None,
797798
auth_version="1"):
798799
"""
799800
:param authurl: authentication URL
@@ -804,7 +805,9 @@ def __init__(self, authurl, user, key, retries=5, preauthurl=None,
804805
:param preauthtoken: authentication token (if you have already
805806
authenticated)
806807
:param snet: use SERVICENET internal network default is False
807-
:param auth_version: Openstack auth version.
808+
:param auth_version: OpenStack auth version, default is 1.0
809+
:param tenant_name: The tenant/account name, required when connecting
810+
to a auth 2.0 system.
808811
"""
809812
self.authurl = authurl
810813
self.user = user
@@ -817,9 +820,12 @@ def __init__(self, authurl, user, key, retries=5, preauthurl=None,
817820
self.snet = snet
818821
self.starting_backoff = starting_backoff
819822
self.auth_version = auth_version
823+
self.tenant_name = tenant_name
820824

821825
def get_auth(self):
822-
return get_auth(self.authurl, self.user, self.key, snet=self.snet,
826+
return get_auth(self.authurl, self.user,
827+
self.key, snet=self.snet,
828+
tenant_name=self.tenant_name,
823829
auth_version=self.auth_version)
824830

825831
def http_connection(self):

test/unit/common/test_client.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,23 @@ def read(*args, **kwargs):
178178
return c.json_dumps(body)
179179
c.http_connection = self.fake_http_connection(200, return_read=read)
180180
url, token = c.get_auth('http://www.test.com', 'asdf', 'asdf',
181-
auth_version="2.0")
181+
tenant_name='asdf', auth_version="2.0")
182182
self.assertTrue(url.startswith("http"))
183183
self.assertTrue(token)
184184

185+
def test_auth_v2_no_tenant_name(self):
186+
def read(*args, **kwargs):
187+
acct_url = 'http://127.0.01/AUTH_FOO'
188+
body = {'access': {'serviceCatalog':
189+
[{u'endpoints': [{'publicURL': acct_url}],
190+
'type': 'object-store'}],
191+
'token': {'id': 'XXXXXXX'}}}
192+
return c.json_dumps(body)
193+
c.http_connection = self.fake_http_connection(200, return_read=read)
194+
self.assertRaises(c.ClientException, c.get_auth,
195+
'http://www.tests.com', 'asdf', 'asdf',
196+
auth_version='2.0')
197+
185198

186199
class TestGetAccount(MockHttpTest):
187200

0 commit comments

Comments
 (0)