Merge Master in geni-v3 conflict resolution
[sfa.git] / sfa / client / common.py
1 # a few utilities common to sfi and sfaadmin
2
3 def optparse_listvalue_callback(option, opt, value, parser):
4     former=getattr(parser.values,option.dest)
5     if not former: former=[]
6     setattr(parser.values, option.dest, former+value.split(','))
7
8 def optparse_dictvalue_callback (option, option_string, value, parser):
9     try:
10         (k,v)=value.split('=',1)
11         d=getattr(parser.values, option.dest)
12         d[k]=v
13     except:
14         parser.print_help()
15         sys.exit(1)
16
17 # a code fragment that could be helpful for argparse which unfortunately is 
18 # available with 2.7 only, so this feels like too strong a requirement for the client side
19 #class ExtraArgAction  (argparse.Action):
20 #    def __call__ (self, parser, namespace, values, option_string=None):
21 # would need a try/except of course
22 #        (k,v)=values.split('=')
23 #        d=getattr(namespace,self.dest)
24 #        d[k]=v
25 #####
26 #parser.add_argument ("-X","--extra",dest='extras', default={}, action=ExtraArgAction,
27 #                     help="set extra flags, testbed dependent, e.g. --extra enabled=true")
28     
29 ##############################
30 # these are not needed from the outside
31 def terminal_render_plural (how_many, name,names=None):
32     if not names: names="%ss"%name
33     if how_many<=0: return "No %s"%name
34     elif how_many==1: return "1 %s"%name
35     else: return "%d %s"%(how_many,names)
36
37 def terminal_render_default (record,options):
38     print "%s (%s)" % (record['hrn'], record['type'])
39 def terminal_render_user (record, options):
40     print "%s (User)"%record['hrn'],
41     if record.get('reg-pi-authorities',None): print " [PI at %s]"%(" and ".join(record['reg-pi-authorities'])),
42     if record.get('reg-slices',None): print " [IN slices %s]"%(" and ".join(record['reg-slices'])),
43     user_keys=record.get('reg-keys',[])
44     if not options.verbose:
45         print " [has %s]"%(terminal_render_plural(len(user_keys),"key"))
46     else:
47         print ""
48         for key in user_keys: print 8*' ',key.strip("\n")
49         
50 def terminal_render_slice (record, options):
51     print "%s (Slice)"%record['hrn'],
52     if record.get('reg-researchers',None): print " [USERS %s]"%(" and ".join(record['reg-researchers'])),
53 #    print record.keys()
54     print ""
55 def terminal_render_authority (record, options):
56     print "%s (Authority)"%record['hrn'],
57     if record.get('reg-pis',None): print " [PIS %s]"%(" and ".join(record['reg-pis'])),
58     print ""
59 def terminal_render_node (record, options):
60     print "%s (Node)"%record['hrn']
61
62
63 ### used in sfi list
64 def terminal_render (records,options):
65     # sort records by type
66     grouped_by_type={}
67     for record in records:
68         type=record['type']
69         if type not in grouped_by_type: grouped_by_type[type]=[]
70         grouped_by_type[type].append(record)
71     group_types=grouped_by_type.keys()
72     group_types.sort()
73     for type in group_types:
74         group=grouped_by_type[type]
75 #        print 20 * '-', type
76         try:    renderer=eval('terminal_render_'+type)
77         except: renderer=terminal_render_default
78         for record in group: renderer(record,options)
79
80
81 ####################
82 def filter_records(type, records):
83     filtered_records = []
84     for record in records:
85         if (record['type'] == type) or (type == "all"):
86             filtered_records.append(record)
87     return filtered_records
88
89