def add_did(scope, name, did_type, issuer, account=None, statuses={}, meta={}, rules=[], lifetime=None, dids=[], rse=None, vo='def', session=None): """ Add data did. :param scope: The scope name. :param name: The data identifier name. :param did_type: The data identifier type. :param issuer: The issuer account. :param account: The account owner. If None, then issuer is selected as owner. :param statuses: Dictionary with statuses, e.g.g {'monotonic':True}. :meta: Meta-data associated with the data identifier is represented using key/value pairs in a dictionary. :rules: Replication rules associated with the data did. A list of dictionaries, e.g., [{'copies': 2, 'rse_expression': 'TIERS1'}, ]. :param lifetime: DID's lifetime (in seconds). :param dids: The content. :param rse: The RSE name when registering replicas. :param vo: The VO to act on. :param session: The database session in use. """ v_did = {'name': name, 'type': did_type.upper(), 'scope': scope} validate_schema(name='did', obj=v_did, vo=vo) validate_schema(name='dids', obj=dids, vo=vo) validate_schema(name='rse', obj=rse, vo=vo) kwargs = {'scope': scope, 'name': name, 'type': did_type, 'issuer': issuer, 'account': account, 'statuses': statuses, 'meta': meta, 'rules': rules, 'lifetime': lifetime} if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='add_did', kwargs=kwargs, session=session): raise rucio.common.exception.AccessDenied('Account %s can not add data identifier to scope %s' % (issuer, scope)) if account is not None: account = InternalAccount(account, vo=vo) issuer = InternalAccount(issuer, vo=vo) scope = InternalScope(scope, vo=vo) for d in dids: d['scope'] = InternalScope(d['scope'], vo=vo) for r in rules: r['account'] = InternalAccount(r['account'], vo=vo) rse_id = None if rse is not None: rse_id = get_rse_id(rse=rse, vo=vo, session=session) if did_type == 'DATASET': # naming_convention validation extra_meta = naming_convention.validate_name(scope=scope, name=name, did_type='D', session=session) # merge extra_meta with meta for k in extra_meta or {}: if k not in meta: meta[k] = extra_meta[k] elif meta[k] != extra_meta[k]: print("Provided metadata %s doesn't match the naming convention: %s != %s" % (k, meta[k], extra_meta[k])) raise rucio.common.exception.InvalidObject("Provided metadata %s doesn't match the naming convention: %s != %s" % (k, meta[k], extra_meta[k])) # Validate metadata meta_core.validate_meta(meta=meta, did_type=DIDType[did_type.upper()], session=session) return did.add_did(scope=scope, name=name, did_type=DIDType[did_type.upper()], account=account or issuer, statuses=statuses, meta=meta, rules=rules, lifetime=lifetime, dids=dids, rse_id=rse_id, session=session)
def add_did(scope, name, type, issuer, account=None, statuses={}, meta={}, rules=[], lifetime=None, dids=[], rse=None): """ Add data did. :param scope: The scope name. :param name: The data identifier name. :param type: The data identifier type. :param issuer: The issuer account. :param account: The account owner. If None, then issuer is selected as owner. :param statuses: Dictionary with statuses, e.g.g {'monotonic':True}. :meta: Meta-data associated with the data identifier is represented using key/value pairs in a dictionary. :rules: Replication rules associated with the data did. A list of dictionaries, e.g., [{'copies': 2, 'rse_expression': 'TIERS1'}, ]. :param lifetime: DID's lifetime (in seconds). :param dids: The content. :param rse: The RSE name when registering replicas. """ validate_schema(name='name', obj=name) validate_schema(name='scope', obj=scope) validate_schema(name='dids', obj=dids) validate_schema(name='rse', obj=rse) kwargs = {'scope': scope, 'name': name, 'type': type, 'issuer': issuer, 'account': account, 'statuses': statuses, 'meta': meta, 'rules': rules, 'lifetime': lifetime} if not rucio.api.permission.has_permission(issuer=issuer, action='add_did', kwargs=kwargs): raise rucio.common.exception.AccessDenied('Account %s can not add data identifier to scope %s' % (issuer, scope)) if type == 'DATASET': # naming_convention validation extra_meta = naming_convention.validate_name(scope=scope, name=name, did_type='D') # merge extra_meta with meta for k in extra_meta or {}: if k not in meta: meta[k] = extra_meta[k] elif meta[k] != extra_meta[k]: print "Provided metadata %s doesn't match the naming convention: %s != %s" % (k, meta[k], extra_meta[k]) raise rucio.common.exception.InvalidObject("Provided metadata %s doesn't match the naming convention: %s != %s" % (k, meta[k], extra_meta[k])) # Validate metadata meta_core.validate_meta(meta=meta, did_type=DIDType.from_sym(type)) return did.add_did(scope=scope, name=name, type=DIDType.from_sym(type), account=account or issuer, statuses=statuses, meta=meta, rules=rules, lifetime=lifetime, dids=dids, rse=rse)