'sfi list' and 'sfaadmin list' display stuff the same way
authorThierry Parmentelat <thierry.parmentelat@inria.fr>
Wed, 13 Feb 2013 17:45:56 +0000 (18:45 +0100)
committerThierry Parmentelat <thierry.parmentelat@inria.fr>
Wed, 13 Feb 2013 17:45:56 +0000 (18:45 +0100)
usability : sfi update -p x1,x2 -p x3 will properly take all 3 PIs
(instead of one previously)

sfa/client/common.py [new file with mode: 0644]
sfa/client/sfaadmin.py
sfa/client/sfi.py

diff --git a/sfa/client/common.py b/sfa/client/common.py
new file mode 100644 (file)
index 0000000..b2e2fde
--- /dev/null
@@ -0,0 +1,89 @@
+# a few utilities common to sfi and sfaadmin
+
+def optparse_listvalue_callback(option, opt, value, parser):
+    former=getattr(parser.values,option.dest)
+    if not former: former=[]
+    setattr(parser.values, option.dest, former+value.split(','))
+
+def optparse_dictvalue_callback (option, option_string, value, parser):
+    try:
+        (k,v)=value.split('=',1)
+        d=getattr(parser.values, option.dest)
+        d[k]=v
+    except:
+        parser.print_help()
+        sys.exit(1)
+
+# a code fragment that could be helpful for argparse which unfortunately is 
+# available with 2.7 only, so this feels like too strong a requirement for the client side
+#class ExtraArgAction  (argparse.Action):
+#    def __call__ (self, parser, namespace, values, option_string=None):
+# would need a try/except of course
+#        (k,v)=values.split('=')
+#        d=getattr(namespace,self.dest)
+#        d[k]=v
+#####
+#parser.add_argument ("-X","--extra",dest='extras', default={}, action=ExtraArgAction,
+#                     help="set extra flags, testbed dependent, e.g. --extra enabled=true")
+    
+##############################
+# these are not needed from the outside
+def terminal_render_plural (how_many, name,names=None):
+    if not names: names="%ss"%name
+    if how_many<=0: return "No %s"%name
+    elif how_many==1: return "1 %s"%name
+    else: return "%d %s"%(how_many,names)
+
+def terminal_render_default (record,options):
+    print "%s (%s)" % (record['hrn'], record['type'])
+def terminal_render_user (record, options):
+    print "%s (User)"%record['hrn'],
+    if record.get('reg-pi-authorities',None): print " [PI at %s]"%(" and ".join(record['reg-pi-authorities'])),
+    if record.get('reg-slices',None): print " [IN slices %s]"%(" and ".join(record['reg-slices'])),
+    user_keys=record.get('reg-keys',[])
+    if not options.verbose:
+        print " [has %s]"%(terminal_render_plural(len(user_keys),"key"))
+    else:
+        print ""
+        for key in user_keys: print 8*' ',key.strip("\n")
+        
+def terminal_render_slice (record, options):
+    print "%s (Slice)"%record['hrn'],
+    if record.get('reg-researchers',None): print " [USERS %s]"%(" and ".join(record['reg-researchers'])),
+#    print record.keys()
+    print ""
+def terminal_render_authority (record, options):
+    print "%s (Authority)"%record['hrn'],
+    if record.get('reg-pis',None): print " [PIS %s]"%(" and ".join(record['reg-pis'])),
+    print ""
+def terminal_render_node (record, options):
+    print "%s (Node)"%record['hrn']
+
+
+### used in sfi list
+def terminal_render (records,options):
+    # sort records by type
+    grouped_by_type={}
+    for record in records:
+        type=record['type']
+        if type not in grouped_by_type: grouped_by_type[type]=[]
+        grouped_by_type[type].append(record)
+    group_types=grouped_by_type.keys()
+    group_types.sort()
+    for type in group_types:
+        group=grouped_by_type[type]
+#        print 20 * '-', type
+        try:    renderer=eval('terminal_render_'+type)
+        except: renderer=terminal_render_default
+        for record in group: renderer(record,options)
+
+
+####################
+def filter_records(type, records):
+    filtered_records = []
+    for record in records:
+        if (record['type'] == type) or (type == "all"):
+            filtered_records.append(record)
+    return filtered_records
+
+
index 48fe4c3..febb1ba 100755 (executable)
@@ -15,6 +15,8 @@ from sfa.trust.certificate import convert_public_key
 
 from sfa.client.candidates import Candidates
 
+from sfa.client.common import optparse_listvalue_callback, terminal_render, filter_records
+
 pprinter = PrettyPrinter(indent=4)
 
 try:
@@ -22,9 +24,6 @@ try:
 except:
     help_basedir='*unable to locate Hierarchy().basedir'
 
-def optparse_listvalue_callback(option, opt, value, parser):
-    setattr(parser.values, option.dest, value.split(','))
-
 def args(*args, **kwargs):
     def _decorator(func):
         func.__dict__.setdefault('options', []).insert(0, (args, kwargs))
@@ -52,15 +51,19 @@ class RegistryCommands(Commands):
     @args('-x', '--xrn', dest='xrn', metavar='<xrn>', help='authority to list (hrn/urn - mandatory)') 
     @args('-t', '--type', dest='type', metavar='<type>', help='object type', default=None) 
     @args('-r', '--recursive', dest='recursive', metavar='<recursive>', help='list all child records', 
-          action='store_true', default=False) 
-    def list(self, xrn, type=None, recursive=False):
+          action='store_true', default=False)
+    @args('-v', '--verbose', dest='verbose', action='store_true', default=False)
+    def list(self, xrn, type=None, recursive=False, verbose=False):
         """List names registered at a given authority - possibly filtered by type"""
         xrn = Xrn(xrn, type) 
-        options = {'recursive': recursive}    
-        records = self.api.manager.List(self.api, xrn.get_hrn(), options=options)
-        for record in records:
-            if not type or record['type'] == type:
-                print "%s (%s)" % (record['hrn'], record['type'])
+        options_dict = {'recursive': recursive}
+        records = self.api.manager.List(self.api, xrn.get_hrn(), options=options_dict)
+        list = filter_records(type, records)
+        # terminal_render expects an options object
+        class Options: pass
+        options=Options()
+        options.verbose=verbose
+        terminal_render (list, options)
 
 
     @args('-x', '--xrn', dest='xrn', metavar='<xrn>', help='object hrn/urn (mandatory)') 
@@ -222,6 +225,7 @@ Users having a GID/PubKey correpondence NOT OK: %s and are: \n%s\n\n"%(len(NOKEY
     def update(self, xrn, type=None, url=None, description=None, key=None, slices='', 
                pis='', researchers=''):
         """Update an existing Registry record""" 
+        print 'incoming PIS',pis
         record_dict = self._record_dict(xrn=xrn, type=type, url=url, description=description, 
                                         key=key, slices=slices, researchers=researchers, pis=pis)
         self.api.manager.Update(self.api, record_dict)
index 3203624..b0deeb9 100644 (file)
@@ -46,30 +46,8 @@ from sfa.client.candidates import Candidates
 
 CM_PORT=12346
 
-# utility methods here
-def optparse_listvalue_callback(option, option_string, value, parser):
-    setattr(parser.values, option.dest, value.split(','))
-
-# a code fragment that could be helpful for argparse which unfortunately is 
-# available with 2.7 only, so this feels like too strong a requirement for the client side
-#class ExtraArgAction  (argparse.Action):
-#    def __call__ (self, parser, namespace, values, option_string=None):
-# would need a try/except of course
-#        (k,v)=values.split('=')
-#        d=getattr(namespace,self.dest)
-#        d[k]=v
-#####
-#parser.add_argument ("-X","--extra",dest='extras', default={}, action=ExtraArgAction,
-#                     help="set extra flags, testbed dependent, e.g. --extra enabled=true")
-    
-def optparse_dictvalue_callback (option, option_string, value, parser):
-    try:
-        (k,v)=value.split('=',1)
-        d=getattr(parser.values, option.dest)
-        d[k]=v
-    except:
-        parser.print_help()
-        sys.exit(1)
+from sfa.client.common import optparse_listvalue_callback, optparse_dictvalue_callback, \
+    terminal_render, filter_records 
 
 # display methods
 def display_rspec(rspec, format='rspec'):
@@ -107,14 +85,6 @@ def display_record(record, dump=False):
     return
 
 
-def filter_records(type, records):
-    filtered_records = []
-    for record in records:
-        if (record['type'] == type) or (type == "all"):
-            filtered_records.append(record)
-    return filtered_records
-
-
 def credential_printable (credential_string):
     credential=Credential(string=credential_string)
     result=""
@@ -197,54 +167,6 @@ def save_record_to_file(filename, record_dict):
     f.close()
     return
 
-# used in sfi list
-def terminal_render (records,options):
-    # sort records by type
-    grouped_by_type={}
-    for record in records:
-        type=record['type']
-        if type not in grouped_by_type: grouped_by_type[type]=[]
-        grouped_by_type[type].append(record)
-    group_types=grouped_by_type.keys()
-    group_types.sort()
-    for type in group_types:
-        group=grouped_by_type[type]
-#        print 20 * '-', type
-        try:    renderer=eval('terminal_render_'+type)
-        except: renderer=terminal_render_default
-        for record in group: renderer(record,options)
-
-def render_plural (how_many, name,names=None):
-    if not names: names="%ss"%name
-    if how_many<=0: return "No %s"%name
-    elif how_many==1: return "1 %s"%name
-    else: return "%d %s"%(how_many,names)
-
-def terminal_render_default (record,options):
-    print "%s (%s)" % (record['hrn'], record['type'])
-def terminal_render_user (record, options):
-    print "%s (User)"%record['hrn'],
-    if record.get('reg-pi-authorities',None): print " [PI at %s]"%(" and ".join(record['reg-pi-authorities'])),
-    if record.get('reg-slices',None): print " [IN slices %s]"%(" and ".join(record['reg-slices'])),
-    user_keys=record.get('reg-keys',[])
-    if not options.verbose:
-        print " [has %s]"%(render_plural(len(user_keys),"key"))
-    else:
-        print ""
-        for key in user_keys: print 8*' ',key.strip("\n")
-        
-def terminal_render_slice (record, options):
-    print "%s (Slice)"%record['hrn'],
-    if record.get('reg-researchers',None): print " [USERS %s]"%(" and ".join(record['reg-researchers'])),
-#    print record.keys()
-    print ""
-def terminal_render_authority (record, options):
-    print "%s (Authority)"%record['hrn'],
-    if record.get('reg-pis',None): print " [PIS %s]"%(" and ".join(record['reg-pis'])),
-    print ""
-def terminal_render_node (record, options):
-    print "%s (Node)"%record['hrn']
-
 # minimally check a key argument
 def check_ssh_key (key):
     good_ssh_key = r'^.*(?:ssh-dss|ssh-rsa)[ ]+[A-Za-z0-9+/=]+(?: .*)?$'