Skip to content

Commit d5aaba9

Browse files
author
Steve Martinelli
committed
Refactor oauth1 code for updates
The keystoneclient code for oauth1 support has changed. As such, we should remove the delete, list and authenticate functions, since they are not in keystoneclient. Also, we must now pass in the project id when creating a request token. Additionally we must now pass in roles when authorizing a request token. Added functional tests to ensure output and input args are the same. bp add-oauth-support Change-Id: I559c18a73ad95a0c8b7a6a95f463b78334186f61
1 parent 0da5bfe commit d5aaba9

6 files changed

Lines changed: 451 additions & 144 deletions

File tree

‎openstackclient/identity/v3/consumer.py‎

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def get_parser(self, prog_name):
4343
def take_action(self, parsed_args):
4444
self.log.debug('take_action(%s)', parsed_args)
4545
identity_client = self.app.client_manager.identity
46-
consumer = identity_client.consumers.create_consumer(
46+
consumer = identity_client.oauth1.consumers.create(
4747
parsed_args.description
4848
)
4949
info = {}
@@ -69,8 +69,8 @@ def take_action(self, parsed_args):
6969
self.log.debug('take_action(%s)', parsed_args)
7070
identity_client = self.app.client_manager.identity
7171
consumer = utils.find_resource(
72-
identity_client.consumers, parsed_args.consumer)
73-
identity_client.consumers.delete_consumer(consumer.id)
72+
identity_client.oauth1.consumers, parsed_args.consumer)
73+
identity_client.oauth1.consumers.delete(consumer.id)
7474
return
7575

7676

@@ -82,7 +82,7 @@ class ListConsumer(lister.Lister):
8282
def take_action(self, parsed_args):
8383
self.log.debug('take_action(%s)', parsed_args)
8484
columns = ('ID', 'Description')
85-
data = self.app.client_manager.identity.consumers.list_consumers()
85+
data = self.app.client_manager.identity.oauth1.consumers.list()
8686
return (columns,
8787
(utils.get_item_properties(
8888
s, columns,
@@ -113,7 +113,7 @@ def take_action(self, parsed_args):
113113
self.log.debug('take_action(%s)', parsed_args)
114114
identity_client = self.app.client_manager.identity
115115
consumer = utils.find_resource(
116-
identity_client.consumers, parsed_args.consumer)
116+
identity_client.oauth1.consumers, parsed_args.consumer)
117117
kwargs = {}
118118
if parsed_args.description:
119119
kwargs['description'] = parsed_args.description
@@ -122,14 +122,9 @@ def take_action(self, parsed_args):
122122
sys.stdout.write("Consumer not updated, no arguments present")
123123
return
124124

125-
consumer = identity_client.consumers.update_consumer(
126-
consumer.id,
127-
**kwargs
128-
)
129-
130-
info = {}
131-
info.update(consumer._info)
132-
return zip(*sorted(six.iteritems(info)))
125+
consumer = identity_client.oauth1.consumers.update(
126+
consumer.id, **kwargs)
127+
return
133128

134129

135130
class ShowConsumer(show.ShowOne):
@@ -150,7 +145,7 @@ def take_action(self, parsed_args):
150145
self.log.debug('take_action(%s)', parsed_args)
151146
identity_client = self.app.client_manager.identity
152147
consumer = utils.find_resource(
153-
identity_client.consumers, parsed_args.consumer)
148+
identity_client.oauth1.consumers, parsed_args.consumer)
154149

155150
info = {}
156151
info.update(consumer._info)

‎openstackclient/identity/v3/token.py‎

Lines changed: 29 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -18,55 +18,8 @@
1818
import logging
1919
import six
2020

21-
from cliff import command
22-
from cliff import lister
2321
from cliff import show
2422

25-
from openstackclient.common import utils
26-
27-
28-
class AuthenticateAccessToken(show.ShowOne):
29-
"""Authenticate access token to receive keystone token"""
30-
31-
api = 'identity'
32-
log = logging.getLogger(__name__ + '.AuthenticateAccessToken')
33-
34-
def get_parser(self, prog_name):
35-
parser = super(AuthenticateAccessToken, self).get_parser(prog_name)
36-
parser.add_argument(
37-
'--consumer-key',
38-
metavar='<consumer-key>',
39-
help='Consumer key',
40-
required=True
41-
)
42-
parser.add_argument(
43-
'--consumer-secret',
44-
metavar='<consumer-secret>',
45-
help='Consumer secret',
46-
required=True
47-
)
48-
parser.add_argument(
49-
'--access-key',
50-
metavar='<access-key>',
51-
help='Access token key',
52-
required=True
53-
)
54-
parser.add_argument(
55-
'--access-secret',
56-
metavar='<access-secret>',
57-
help='Access token secret',
58-
required=True
59-
)
60-
return parser
61-
62-
def take_action(self, parsed_args):
63-
self.log.debug('take_action(%s)', parsed_args)
64-
token_client = self.app.client_manager.identity.tokens
65-
keystone_token = token_client.authenticate_access_token(
66-
parsed_args.consumer_key, parsed_args.consumer_secret,
67-
parsed_args.access_key, parsed_args.access_secret)
68-
return zip(*sorted(six.iteritems(keystone_token)))
69-
7023

7124
class AuthorizeRequestToken(show.ShowOne):
7225
"""Authorize request token command"""
@@ -78,17 +31,28 @@ def get_parser(self, prog_name):
7831
parser.add_argument(
7932
'--request-key',
8033
metavar='<request-key>',
81-
help='Consumer key',
34+
help='Request token key',
35+
required=True
36+
)
37+
parser.add_argument(
38+
'--role-ids',
39+
metavar='<role-ids>',
40+
help='Requested role IDs',
8241
required=True
8342
)
8443
return parser
8544

8645
def take_action(self, parsed_args):
87-
self.log.debug('take_action(%s)', parsed_args)
88-
token_client = self.app.client_manager.identity.tokens
46+
self.log.debug('take_action(%s)' % parsed_args)
47+
identity_client = self.app.client_manager.identity
8948

90-
verifier_pin = token_client.authorize_request_token(
91-
parsed_args.request_key)
49+
roles = []
50+
for r_id in parsed_args.role_ids.split():
51+
roles.append(r_id)
52+
53+
verifier_pin = identity_client.oauth1.request_tokens.authorize(
54+
parsed_args.request_key,
55+
roles)
9256
info = {}
9357
info.update(verifier_pin._info)
9458
return zip(*sorted(six.iteritems(info)))
@@ -134,13 +98,15 @@ def get_parser(self, prog_name):
13498
return parser
13599

136100
def take_action(self, parsed_args):
137-
self.log.debug('take_action(%s)', parsed_args)
138-
token_client = self.app.client_manager.identity.tokens
139-
access_token = token_client.create_access_token(
101+
self.log.debug('take_action(%s)' % parsed_args)
102+
token_client = self.app.client_manager.identity.oauth1.access_tokens
103+
access_token = token_client.create(
140104
parsed_args.consumer_key, parsed_args.consumer_secret,
141105
parsed_args.request_key, parsed_args.request_secret,
142106
parsed_args.verifier)
143-
return zip(*sorted(six.iteritems(access_token)))
107+
info = {}
108+
info.update(access_token._info)
109+
return zip(*sorted(six.iteritems(info)))
144110

145111

146112
class CreateRequestToken(show.ShowOne):
@@ -162,27 +128,24 @@ def get_parser(self, prog_name):
162128
help='Consumer secret',
163129
required=True
164130
)
165-
parser.add_argument(
166-
'--role-ids',
167-
metavar='<role-ids>',
168-
help='Requested role IDs',
169-
)
170131
parser.add_argument(
171132
'--project-id',
172133
metavar='<project-id>',
173134
help='Requested project ID',
135+
required=True
174136
)
175137
return parser
176138

177139
def take_action(self, parsed_args):
178-
self.log.debug('take_action(%s)', parsed_args)
179-
token_client = self.app.client_manager.identity.tokens
180-
request_token = token_client.create_request_token(
140+
self.log.debug('take_action(%s)' % parsed_args)
141+
token_client = self.app.client_manager.identity.oauth1.request_tokens
142+
request_token = token_client.create(
181143
parsed_args.consumer_key,
182144
parsed_args.consumer_secret,
183-
parsed_args.role_ids,
184145
parsed_args.project_id)
185-
return zip(*sorted(six.iteritems(request_token)))
146+
info = {}
147+
info.update(request_token._info)
148+
return zip(*sorted(six.iteritems(info)))
186149

187150

188151
class CreateToken(show.ShowOne):
@@ -201,64 +164,3 @@ def take_action(self, parsed_args):
201164
if 'tenant_id' in token:
202165
token['project_id'] = token.pop('tenant_id')
203166
return zip(*sorted(six.iteritems(token)))
204-
205-
206-
class DeleteAccessToken(command.Command):
207-
"""Delete access token command"""
208-
209-
log = logging.getLogger(__name__ + '.DeleteAccessToken')
210-
211-
def get_parser(self, prog_name):
212-
parser = super(DeleteAccessToken, self).get_parser(prog_name)
213-
parser.add_argument(
214-
'user',
215-
metavar='<user>',
216-
help='Name or ID of user',
217-
)
218-
parser.add_argument(
219-
'access_key',
220-
metavar='<access-key>',
221-
help='Access token to be deleted',
222-
)
223-
return parser
224-
225-
def take_action(self, parsed_args):
226-
self.log.debug('take_action(%s)', parsed_args)
227-
228-
identity_client = self.app.client_manager.identity
229-
user = utils.find_resource(
230-
identity_client.users, parsed_args.user).id
231-
identity_client.tokens.delete_access_token(user,
232-
parsed_args.access_key)
233-
return
234-
235-
236-
class ListAccessToken(lister.Lister):
237-
"""List access tokens command"""
238-
239-
log = logging.getLogger(__name__ + '.ListAccessToken')
240-
241-
def get_parser(self, prog_name):
242-
parser = super(ListAccessToken, self).get_parser(prog_name)
243-
parser.add_argument(
244-
'user',
245-
metavar='<user>',
246-
help='Name or ID of user',
247-
)
248-
return parser
249-
250-
def take_action(self, parsed_args):
251-
self.log.debug('take_action(%s)', parsed_args)
252-
253-
identity_client = self.app.client_manager.identity
254-
user = utils.find_resource(
255-
identity_client.users, parsed_args.user).id
256-
257-
columns = ('ID', 'Consumer ID', 'Expires At',
258-
'Project Id', 'Authorizing User Id')
259-
data = identity_client.tokens.list_access_tokens(user)
260-
return (columns,
261-
(utils.get_item_properties(
262-
s, columns,
263-
formatters={},
264-
) for s in data))

‎openstackclient/tests/identity/v3/fakes.py‎

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,13 +139,52 @@
139139
'role': {'id': role_id},
140140
}
141141

142+
consumer_id = 'test consumer id'
143+
consumer_description = 'someone we trust'
144+
consumer_secret = 'test consumer secret'
145+
146+
OAUTH_CONSUMER = {
147+
'id': consumer_id,
148+
'secret': consumer_secret,
149+
'description': consumer_description
150+
}
151+
152+
access_token_id = 'test access token id'
153+
access_token_secret = 'test access token secret'
154+
access_token_expires = '2014-05-18T03:13:18.152071Z'
155+
156+
OAUTH_ACCESS_TOKEN = {
157+
'id': access_token_id,
158+
'expires': access_token_expires,
159+
'key': access_token_id,
160+
'secret': access_token_secret
161+
}
162+
163+
request_token_id = 'test request token id'
164+
request_token_secret = 'test request token secret'
165+
request_token_expires = '2014-05-17T11:10:51.511336Z'
166+
167+
OAUTH_REQUEST_TOKEN = {
168+
'id': request_token_id,
169+
'expires': request_token_expires,
170+
'key': request_token_id,
171+
'secret': request_token_secret
172+
}
173+
174+
oauth_verifier_pin = '6d74XaDS'
175+
OAUTH_VERIFIER = {
176+
'oauth_verifier': oauth_verifier_pin
177+
}
178+
142179

143180
class FakeIdentityv3Client(object):
144181
def __init__(self, **kwargs):
145182
self.domains = mock.Mock()
146183
self.domains.resource_class = fakes.FakeResource(None, {})
147184
self.groups = mock.Mock()
148185
self.groups.resource_class = fakes.FakeResource(None, {})
186+
self.oauth1 = mock.Mock()
187+
self.oauth1.resource_class = fakes.FakeResource(None, {})
149188
self.projects = mock.Mock()
150189
self.projects.resource_class = fakes.FakeResource(None, {})
151190
self.roles = mock.Mock()
@@ -169,6 +208,18 @@ def __init__(self, **kwargs):
169208
self.identity_providers.resource_class = fakes.FakeResource(None, {})
170209

171210

211+
class FakeOAuth1Client(FakeIdentityv3Client):
212+
def __init__(self, **kwargs):
213+
super(FakeOAuth1Client, self).__init__(**kwargs)
214+
215+
self.access_tokens = mock.Mock()
216+
self.access_tokens.resource_class = fakes.FakeResource(None, {})
217+
self.consumers = mock.Mock()
218+
self.consumers.resource_class = fakes.FakeResource(None, {})
219+
self.request_tokens = mock.Mock()
220+
self.request_tokens.resource_class = fakes.FakeResource(None, {})
221+
222+
172223
class TestIdentityv3(utils.TestCommand):
173224
def setUp(self):
174225
super(TestIdentityv3, self).setUp()
@@ -187,3 +238,13 @@ def setUp(self):
187238
endpoint=fakes.AUTH_URL,
188239
token=fakes.AUTH_TOKEN
189240
)
241+
242+
243+
class TestOAuth1(utils.TestCommand):
244+
def setUp(self):
245+
super(TestOAuth1, self).setUp()
246+
247+
self.app.client_manager.identity = FakeOAuth1Client(
248+
endpoint=fakes.AUTH_URL,
249+
token=fakes.AUTH_TOKEN
250+
)

0 commit comments

Comments
 (0)