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