Add service userinfo, rearange admin userinfo
authorStavros Sachtouris <saxtouri@admin.grnet.gr>
Tue, 11 Dec 2012 14:16:10 +0000 (16:16 +0200)
committerStavros Sachtouris <saxtouri@admin.grnet.gr>
Tue, 11 Dec 2012 14:16:10 +0000 (16:16 +0200)
Two modes: astakos service and astakos admin
They both have a userinfo command

kamaki/cli/command_shell.py
kamaki/cli/commands/astakos_cli.py
kamaki/clients/astakos.py

index f4f3443..46fd7e2 100644 (file)
@@ -257,7 +257,6 @@ class Shell(Cmd):
         return '%s commands:' % hdr
 
     def run(self, parser, path=''):
-        print('> > >')
         self._parser = parser
         self._history = History(
             parser.arguments['config'].get('history', 'file'))
@@ -271,7 +270,6 @@ class Shell(Cmd):
             self._register_command(subcmd.path)
 
         self.set_prompt(intro)
-        print('< < <')
 
         try:
             self.cmdloop()
index 9a86e2f..7336548 100644 (file)
 from kamaki.cli import command
 from kamaki.clients.astakos import AstakosClient
 from kamaki.cli.utils import print_dict
-from kamaki.cli.errors import raiseCLIError
+from kamaki.cli.errors import raiseCLIError, CLISyntaxError
 from kamaki.cli.commands import _command_init
 from kamaki.cli.command_tree import CommandTree
+from kamaki.cli.argument import ValueArgument
 
 astakos_cmds = CommandTree('astakos', 'Astakos API commands')
 _commands = [astakos_cmds]
@@ -67,26 +68,78 @@ class astakos_authenticate(_astakos_init):
 
 
 @command(astakos_cmds)
-class astakos_user_byemail(_astakos_init):
-    """Get user by e-mail"""
+class astakos_admin_userinfo(_astakos_init):
+    """Get user info, provided you have admin privileges"""
 
-    def main(self, email, token=None):
+    def __init__(self, arguments={}):
+        super(self.__class__, self).__init__(arguments)
+        self.arguments['email'] = ValueArgument('target user email', '--email')
+        self.arguments['username'] = ValueArgument('target username',
+            '--username')
+
+    def main(self, admin_token=None):
         super(self.__class__, self).main()
+        email = self.get_argument('email')
+        username = self.get_argument('username')
         try:
-            reply = self.client.get_user_by_email(email, token)
+            if email and username:
+                raise CLISyntaxError(
+                    'Arguments %s and %s are mutually exclusive' % (
+                        self.arguments['email'].parsed_name,
+                        self.arguments['username'].parsed_name
+                        ), importance=1)
+            elif email:
+                reply = self.client.get_user_by_email(email,
+                    admin=True,
+                    token=admin_token)
+            elif username:
+                reply = self.client.get_user_by_username(username,
+                    admin=True,
+                    token=admin_token)
+            else:
+                raise CLISyntaxError(
+                    'Exactly one of %s or %s is obligatory' % (
+                        self.arguments['email'].parsed_name,
+                        self.arguments['username'].parsed_name
+                        ), importance=1)
         except Exception as err:
             raiseCLIError(err)
         print_dict(reply)
 
 
 @command(astakos_cmds)
-class astakos_user_byusername(_astakos_init):
-    """Get user by e-mail"""
+class astakos_service_userinfo(_astakos_init):
+    """Get user by e-mail (with service token)"""
+
+    def __init__(self, arguments={}):
+        super(self.__class__, self).__init__(arguments)
+        self.arguments['email'] = ValueArgument('target user email', '--email')
+        self.arguments['username'] = ValueArgument('target username',
+            '--username')
 
-    def main(self, username, token=None):
+    def main(self, service_token=None):
         super(self.__class__, self).main()
+        email = self.get_argument('email')
+        username = self.get_argument('username')
         try:
-            reply = self.client.get_user_by_username(username, token)
+            if email and username:
+                raise CLISyntaxError(
+                    'Arguments %s and %s are mutually exclusive' % (
+                        self.arguments['email'].parsed_name,
+                        self.arguments['username'].parsed_name
+                        ), importance=1)
+            elif email:
+                reply = self.client.get_user_by_email(email,
+                    token=service_token)
+            elif username:
+                reply = self.client.get_user_by_username(username,
+                    token=service_token)
+            else:
+                raise CLISyntaxError(
+                    'Exactly one of %s or %s is obligatory' % (
+                        self.arguments['email'].parsed_name,
+                        self.arguments['username'].parsed_name
+                        ), importance=1)
         except Exception as err:
             raiseCLIError(err)
         print_dict(reply)
index ec1815e..738a028 100644 (file)
@@ -32,6 +32,7 @@
 # or implied, of GRNET S.A.
 
 from kamaki.clients import Client, ClientError
+from kamaki.clients.utils import path4url
 
 
 class AstakosClient(Client):
@@ -59,7 +60,7 @@ class AstakosClient(Client):
         r = self.get('/im/authenticate')
         return r.json
 
-    def get_user_by_email(self, email, token=None):
+    def get_user_by_email(self, email, admin=False, token=None):
         """
         :param email: (str)
 
@@ -76,10 +77,12 @@ class AstakosClient(Client):
         if token:
             self.token = token
         self.set_param('email', email)
-        r = self.get('/im/admin/api/2.0/users/')
+
+        path = path4url('im', 'admin' if admin else 'service', 'api/2.0/users')
+        r = self.get(path)
         return r.json
 
-    def get_user_by_username(self, username, token=None):
+    def get_user_by_username(self, username, admin=False, token=None):
         """
         :param username: (str)
 
@@ -93,5 +96,6 @@ class AstakosClient(Client):
         """
         if token:
             self.token = token
-        r = self.get('/im/admin/api/2.0/users/{%s}' % username)
+        path = path4url('im', 'admin' if admin else 'service', 'api/2.0/users')
+        r = self.get('%s/{%s}' % (path, username))
         return r.json