1 # a few utilities common to sfi and sfaadmin
3 def optparse_listvalue_callback(option, opt, value, parser):
4 former=getattr(parser.values,option.dest)
5 if not former: former=[]
6 # support for using e.g. sfi update -t slice -x the.slice.hrn -r none
7 # instead of -r '' which is painful and does not pass well through ssh
8 if value.lower()=='none':
11 newvalue=former+value.split(',')
12 setattr(parser.values, option.dest, newvalue)
14 def optparse_dictvalue_callback (option, option_string, value, parser):
16 (k,v)=value.split('=',1)
17 d=getattr(parser.values, option.dest)
23 # a code fragment that could be helpful for argparse which unfortunately is
24 # available with 2.7 only, so this feels like too strong a requirement for the client side
25 #class ExtraArgAction (argparse.Action):
26 # def __call__ (self, parser, namespace, values, option_string=None):
27 # would need a try/except of course
28 # (k,v)=values.split('=')
29 # d=getattr(namespace,self.dest)
32 #parser.add_argument ("-X","--extra",dest='extras', default={}, action=ExtraArgAction,
33 # help="set extra flags, testbed dependent, e.g. --extra enabled=true")
35 ##############################
36 # these are not needed from the outside
37 def terminal_render_plural (how_many, name,names=None):
38 if not names: names="%ss"%name
39 if how_many<=0: return "No %s"%name
40 elif how_many==1: return "1 %s"%name
41 else: return "%d %s"%(how_many,names)
43 def terminal_render_default (record,options):
44 print "%s (%s)" % (record['hrn'], record['type'])
45 def terminal_render_user (record, options):
46 print "%s (User)"%record['hrn'],
47 if record.get('reg-pi-authorities',None): print " [PI at %s]"%(" and ".join(record['reg-pi-authorities'])),
48 if record.get('reg-slices',None): print " [IN slices %s]"%(" and ".join(record['reg-slices'])),
49 user_keys=record.get('reg-keys',[])
50 if not options.verbose:
51 print " [has %s]"%(terminal_render_plural(len(user_keys),"key"))
54 for key in user_keys: print 8*' ',key.strip("\n")
56 def terminal_render_slice (record, options):
57 print "%s (Slice)"%record['hrn'],
58 if record.get('reg-researchers',None): print " [USERS %s]"%(" and ".join(record['reg-researchers'])),
61 def terminal_render_authority (record, options):
62 print "%s (Authority)"%record['hrn'],
63 if record.get('reg-pis',None): print " [PIS %s]"%(" and ".join(record['reg-pis'])),
65 def terminal_render_node (record, options):
66 print "%s (Node)"%record['hrn']
70 def terminal_render (records,options):
71 # sort records by type
73 for record in records:
75 if type not in grouped_by_type: grouped_by_type[type]=[]
76 grouped_by_type[type].append(record)
77 group_types=grouped_by_type.keys()
79 for type in group_types:
80 group=grouped_by_type[type]
81 # print 20 * '-', type
82 try: renderer=eval('terminal_render_'+type)
83 except: renderer=terminal_render_default
84 for record in group: renderer(record,options)
88 def filter_records(type, records):
90 for record in records:
91 if (record['type'] == type) or (type == "all"):
92 filtered_records.append(record)
93 return filtered_records