from sfa.client.candidates import Candidates
+from sfa.client.common import optparse_listvalue_callback, optparse_dictvalue_callback, terminal_render, filter_records
+
pprinter = PrettyPrinter(indent=4)
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))
pprinter.pprint(version)
@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('-t', '--type', dest='type', metavar='<type>', help='object type', default='all')
@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)')
def _record_dict(self, xrn=None, type=None,
url=None, description=None, email='',
key=None,
- slices=[], researchers=[], pis=[]):
+ slices=[], researchers=[], pis=[], extras={}):
record_dict = {}
if xrn:
if type:
record_dict['email'] = email
if pis:
record_dict['pi'] = pis
+ if extras:
+ record_dict.update(extras)
return record_dict
@args('-x', '--xrn', dest='xrn', metavar='<xrn>', help='object hrn/urn', default=None)
@args('-t', '--type', dest='type', metavar='<type>', help='object type (mandatory)',)
@args('-a', '--all', dest='all', metavar='<all>', action='store_true', default=False, help='check all users GID')
- def check_gid(self, xrn=None, type=None, all=None):
+ @args('-v', '--verbose', dest='verbose', metavar='<verbose>', action='store_true', default=False, help='verbose mode: display user\'s hrn ')
+ def check_gid(self, xrn=None, type=None, all=None, verbose=None):
"""Check the correspondance between the GID and the PubKey"""
# db records
OK = []
NOK = []
+ ERROR = []
+ NOKEY = []
for record in records:
# get the pubkey stored in SFA DB
- db_pubkey_str = record.reg_keys[0].key
- db_pubkey_obj = convert_public_key(db_pubkey_str)
+ if record.reg_keys:
+ db_pubkey_str = record.reg_keys[0].key
+ try:
+ db_pubkey_obj = convert_public_key(db_pubkey_str)
+ except:
+ ERROR.append(record.hrn)
+ continue
+ else:
+ NOKEY.append(record.hrn)
+ continue
# get the pubkey from the gid
gid_str = record.gid
else:
NOK.append(record.hrn)
- print "GID/PubKey correpondence is OK for: %s\nGID/PubKey correpondence is NOT OK for: %s" %(OK,NOK)
+ if not verbose:
+ print "Users NOT having a PubKey: %s\n\
+Users having a non RSA PubKey: %s\n\
+Users having a GID/PubKey correpondence OK: %s\n\
+Users having a GID/PubKey correpondence Not OK: %s\n"%(len(NOKEY), len(ERROR), len(OK), len(NOK))
+ else:
+ print "Users NOT having a PubKey: %s and are: \n%s\n\n\
+Users having a non RSA PubKey: %s and are: \n%s\n\n\
+Users having a GID/PubKey correpondence OK: %s and are: \n%s\n\n\
+Users having a GID/PubKey correpondence NOT OK: %s and are: \n%s\n\n"%(len(NOKEY),NOKEY, len(ERROR), ERROR, len(OK), OK, len(NOK), NOK)
help='Description, useful for slices', default=None)
@args('-k', '--key', dest='key', metavar='<key>', help='public key string or file',
default=None)
- @args('-s', '--slices', dest='slices', metavar='<slices>', help='slice xrns',
+ @args('-s', '--slices', dest='slices', metavar='<slices>', help='Set/replace slice xrns',
default='', type="str", action='callback', callback=optparse_listvalue_callback)
- @args('-r', '--researchers', dest='researchers', metavar='<researchers>', help='slice researchers',
+ @args('-r', '--researchers', dest='researchers', metavar='<researchers>', help='Set/replace slice researchers',
default='', type="str", action='callback', callback=optparse_listvalue_callback)
@args('-p', '--pis', dest='pis', metavar='<PIs>',
- help='Principal Investigators/Project Managers ',
+ help='Set/replace Principal Investigators/Project Managers',
default='', type="str", action='callback', callback=optparse_listvalue_callback)
+ @args('-X','--extra',dest='extras',default={},type='str',metavar="<EXTRA_ASSIGNS>", action="callback", callback=optparse_dictvalue_callback, nargs=1, help="set extra/testbed-dependent flags, e.g. --extra enabled=true")
+
def register(self, xrn, type=None, url=None, description=None, key=None, slices='',
- pis='', researchers='',email=''):
+ pis='', researchers='',email='', extras={}):
"""Create a new Registry record"""
record_dict = self._record_dict(xrn=xrn, type=type, url=url, key=key,
- slices=slices, researchers=researchers, email=email, pis=pis)
+ slices=slices, researchers=researchers, email=email, pis=pis, extras=extras)
self.api.manager.Register(self.api, record_dict)
help='Description', default=None)
@args('-k', '--key', dest='key', metavar='<key>', help='public key string or file',
default=None)
- @args('-s', '--slices', dest='slices', metavar='<slices>', help='slice xrns',
+ @args('-s', '--slices', dest='slices', metavar='<slices>', help='Set/replace slice xrns',
default='', type="str", action='callback', callback=optparse_listvalue_callback)
- @args('-r', '--researchers', dest='researchers', metavar='<researchers>', help='slice researchers',
+ @args('-r', '--researchers', dest='researchers', metavar='<researchers>', help='Set/replace slice researchers',
default='', type="str", action='callback', callback=optparse_listvalue_callback)
@args('-p', '--pis', dest='pis', metavar='<PIs>',
- help='Principal Investigators/Project Managers ',
+ help='Set/replace Principal Investigators/Project Managers',
default='', type="str", action='callback', callback=optparse_listvalue_callback)
+ @args('-X','--extra',dest='extras',default={},type='str',metavar="<EXTRA_ASSIGNS>", action="callback", callback=optparse_dictvalue_callback, nargs=1, help="set extra/testbed-dependent flags, e.g. --extra enabled=true")
def update(self, xrn, type=None, url=None, description=None, key=None, slices='',
- pis='', researchers=''):
+ pis='', researchers='', extras={}):
"""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)
+ key=key, slices=slices, researchers=researchers, pis=pis, extras=extras)
self.api.manager.Update(self.api, record_dict)
@args('-x', '--xrn', dest='xrn', metavar='<xrn>', help='object hrn/urn (mandatory)')
"""Initialize or upgrade the db"""
from sfa.storage.dbschema import DBSchema
dbschema=DBSchema()
- dbschema.init_or_upgrade
+ dbschema.init_or_upgrade()
@args('-a', '--all', dest='all', metavar='<all>', action='store_true', default=False,
help='Remove all registry records and all files in %s area' % help_basedir)