From 713908385a183cada8c9e77bb74c2ca381a38660 Mon Sep 17 00:00:00 2001
From: Steve Martinelli <stevemar@ca.ibm.com>
Date: Wed, 3 Jul 2013 15:26:33 -0500
Subject: [PATCH] Add authenticate method to oauth code

Forgot to add one last method when I initially checked in
the first set of code; the authenticate method will return an
actual keystone token that the user may now use.

Also, I added some changes to other methods because the client
has been updated.

Change-Id: Ie2707689e0df1fb1bc92177f932baf23fe1ca920
---
 openstackclient/identity/v3/oauth.py | 107 ++++++++++++++++++++-------
 setup.cfg                            |   1 +
 2 files changed, 81 insertions(+), 27 deletions(-)

diff --git a/openstackclient/identity/v3/oauth.py b/openstackclient/identity/v3/oauth.py
index 0b5ae4dba7..d3345f0021 100644
--- a/openstackclient/identity/v3/oauth.py
+++ b/openstackclient/identity/v3/oauth.py
@@ -25,6 +25,49 @@ from cliff import show
 from openstackclient.common import utils
 
 
+class AuthenticateAccessToken(show.ShowOne):
+    """Authenticate access token - receive keystone token"""
+
+    api = 'identity'
+    log = logging.getLogger(__name__ + '.AuthenticateAccessToken')
+
+    def get_parser(self, prog_name):
+        parser = super(AuthenticateAccessToken, self).get_parser(prog_name)
+        parser.add_argument(
+            '--consumer-key',
+            metavar='<consumer-key>',
+            help='Consumer key',
+            required=True
+        )
+        parser.add_argument(
+            '--consumer-secret',
+            metavar='<consumer-secret>',
+            help='Consumer secret',
+            required=True
+        )
+        parser.add_argument(
+            '--access-key',
+            metavar='<access-key>',
+            help='Access token key',
+            required=True
+        )
+        parser.add_argument(
+            '--access-secret',
+            metavar='<access-secret>',
+            help='Access token secret',
+            required=True
+        )
+        return parser
+
+    def take_action(self, parsed_args):
+        self.log.debug('take_action(%s)' % parsed_args)
+        oauth_client = self.app.client_manager.identity.oauth
+        keystone_token = oauth_client.authenticate(
+            parsed_args.consumer_key, parsed_args.consumer_secret,
+            parsed_args.access_key, parsed_args.access_secret)
+        return zip(*sorted(keystone_token.iteritems()))
+
+
 class AuthorizeRequestToken(show.ShowOne):
     """Authorize request token command"""
 
@@ -39,12 +82,6 @@ class AuthorizeRequestToken(show.ShowOne):
             help='Consumer key',
             required=True
         )
-        parser.add_argument(
-            '--user-token',
-            metavar='<user-token>',
-            help='Token of authorizing user',
-            required=True
-        )
         parser.add_argument(
             '--roles',
             metavar='<roles>',
@@ -55,11 +92,10 @@ class AuthorizeRequestToken(show.ShowOne):
 
     def take_action(self, parsed_args):
         self.log.debug('take_action(%s)' % parsed_args)
-        oauth_client = self.app.client_manager.identity.oauths
+        oauth_client = self.app.client_manager.identity.oauth
 
         verifier_pin = oauth_client.authorize_request_token(
-            parsed_args.request_key, parsed_args.user_token,
-            parsed_args.roles)
+            parsed_args.request_key, parsed_args.roles)
         info = {}
         info.update(verifier_pin._info)
         return zip(*sorted(info.iteritems()))
@@ -79,10 +115,22 @@ class CreateAccessToken(show.ShowOne):
             help='Consumer key',
             required=True
         )
+        parser.add_argument(
+            '--consumer-secret',
+            metavar='<consumer-secret>',
+            help='Consumer secret',
+            required=True
+        )
         parser.add_argument(
             '--request-key',
             metavar='<request-key>',
-            help='Consumer key',
+            help='Request token key',
+            required=True
+        )
+        parser.add_argument(
+            '--request-secret',
+            metavar='<request-secret>',
+            help='Request token secret',
             required=True
         )
         parser.add_argument(
@@ -95,13 +143,12 @@ class CreateAccessToken(show.ShowOne):
 
     def take_action(self, parsed_args):
         self.log.debug('take_action(%s)' % parsed_args)
-        oauth_client = self.app.client_manager.identity.oauths
+        oauth_client = self.app.client_manager.identity.oauth
         access_token = oauth_client.create_access_token(
-            parsed_args.consumer_key, parsed_args.request_key,
+            parsed_args.consumer_key, parsed_args.consumer_secret,
+            parsed_args.request_key, parsed_args.request_secret,
             parsed_args.verifier)
-        info = {}
-        info.update(access_token._info)
-        return zip(*sorted(info.iteritems()))
+        return zip(*sorted(access_token.iteritems()))
 
 
 class CreateConsumer(show.ShowOne):
@@ -122,7 +169,7 @@ class CreateConsumer(show.ShowOne):
     def take_action(self, parsed_args):
         self.log.debug('take_action(%s)' % parsed_args)
         identity_client = self.app.client_manager.identity
-        consumer = identity_client.oauths.create_consumer(
+        consumer = identity_client.oauth.create_consumer(
             parsed_args.name
         )
         info = {}
@@ -144,6 +191,12 @@ class CreateRequestToken(show.ShowOne):
             help='Consumer key',
             required=True
         )
+        parser.add_argument(
+            '--consumer-secret',
+            metavar='<consumer-secret>',
+            help='Consumer secret',
+            required=True
+        )
         parser.add_argument(
             '--roles',
             metavar='<roles>',
@@ -153,12 +206,12 @@ class CreateRequestToken(show.ShowOne):
 
     def take_action(self, parsed_args):
         self.log.debug('take_action(%s)' % parsed_args)
-        oauth_client = self.app.client_manager.identity.oauths
+        oauth_client = self.app.client_manager.identity.oauth
         request_token = oauth_client.create_request_token(
-            parsed_args.consumer_key, parsed_args.roles)
-        info = {}
-        info.update(request_token._info)
-        return zip(*sorted(info.iteritems()))
+            parsed_args.consumer_key,
+            parsed_args.consumer_secret,
+            parsed_args.roles)
+        return zip(*sorted(request_token.iteritems()))
 
 
 class DeleteConsumer(command.Command):
@@ -180,8 +233,8 @@ class DeleteConsumer(command.Command):
         self.log.debug('take_action(%s)' % parsed_args)
         identity_client = self.app.client_manager.identity
         consumer = utils.find_resource(
-            identity_client.oauths, parsed_args.consumer)
-        identity_client.oauths.delete_consumer(consumer.id)
+            identity_client.oauth, parsed_args.consumer)
+        identity_client.oauth.delete_consumer(consumer.id)
         return
 
 
@@ -194,7 +247,7 @@ class ListConsumer(lister.Lister):
     def take_action(self, parsed_args):
         self.log.debug('take_action(%s)' % parsed_args)
         columns = ('ID', 'Name', 'Consumer Key', 'Consumer Secret')
-        data = self.app.client_manager.identity.oauths.list_consumers()
+        data = self.app.client_manager.identity.oauth.list_consumers()
         return (columns,
                 (utils.get_item_properties(
                     s, columns,
@@ -226,7 +279,7 @@ class SetConsumer(command.Command):
         self.log.debug('take_action(%s)' % parsed_args)
         identity_client = self.app.client_manager.identity
         consumer = utils.find_resource(
-            identity_client.oauths, parsed_args.consumer)
+            identity_client.oauth, parsed_args.consumer)
         kwargs = {}
         if parsed_args.name:
             kwargs['name'] = parsed_args.name
@@ -234,7 +287,7 @@ class SetConsumer(command.Command):
         if not len(kwargs):
             sys.stdout.write("Consumer not updated, no arguments present")
             return
-        identity_client.oauths.update_consumer(consumer.id, **kwargs)
+        identity_client.oauth.update_consumer(consumer.id, **kwargs)
         return
 
 
@@ -257,7 +310,7 @@ class ShowConsumer(show.ShowOne):
         self.log.debug('take_action(%s)' % parsed_args)
         identity_client = self.app.client_manager.identity
         consumer = utils.find_resource(
-            identity_client.oauths, parsed_args.consumer)
+            identity_client.oauth, parsed_args.consumer)
 
         info = {}
         info.update(consumer._info)
diff --git a/setup.cfg b/setup.cfg
index 2068a92a5a..2aae47df48 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -69,6 +69,7 @@ openstack.identity.v2_0 =
     user_show = openstackclient.identity.v2_0.user:ShowUser
 
 openstack.identity.v3 =
+    access_token_authenticate = openstackclient.identity.v3.oauth:AuthenticateAccessToken
     access_token_create = openstackclient.identity.v3.oauth:CreateAccessToken
 
     consumer_create = openstackclient.identity.v3.oauth:CreateConsumer