Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
json_data = data()
try:
parameter = loads(json_data)
except ValueError:
raise generate_http_error(400, 'ValueError', 'cannot decode json parameter dictionary')
try:
bytes = parameter['bytes']
except KeyError as exception:
if exception.args[0] == 'type':
raise generate_http_error(400, 'KeyError', '%s not defined' % str(exception))
except TypeError:
raise generate_http_error(400, 'TypeError', 'body must be a json dictionary')
try:
set_local_account_limit(account=account, rse=rse, bytes=bytes, issuer=ctx.env.get('issuer'))
except AccessDenied as exception:
raise generate_http_error(401, 'AccessDenied', exception.args[0])
except RSENotFound as exception:
raise generate_http_error(404, 'RSENotFound', exception.args[0])
except AccountNotFound as exception:
raise generate_http_error(404, 'AccountNotFound', exception.args[0])
except Exception as exception:
print(format_exc())
raise InternalError(exception)
raise Created()
def set_metadata(scope, name, key, value, issuer, recursive=False, vo='def'):
"""
Add metadata to data did.
:param scope: The scope name.
:param name: The data identifier name.
:param key: the key.
:param value: the value.
:param issuer: The issuer account.
:param recursive: Option to propagate the metadata update to content.
:param vo: The VO to act on.
"""
kwargs = {'scope': scope, 'name': name, 'key': key, 'value': value, 'issuer': issuer}
if key in RESERVED_KEYS:
raise rucio.common.exception.AccessDenied('Account %s can not change this metadata value to data identifier %s:%s' % (issuer, scope, name))
if not rucio.api.permission.has_permission(issuer=issuer, vo=vo, action='set_metadata', kwargs=kwargs):
raise rucio.common.exception.AccessDenied('Account %s can not add metadata to data identifier %s:%s' % (issuer, scope, name))
scope = InternalScope(scope, vo=vo)
return did.set_metadata(scope=scope, name=name, key=key, value=value, recursive=recursive)
:param rule_id: The rule to delete.
:param purge_replicas: Purge the replicas immediately.
:param soft: Only perform a soft deletion.
:param nowait: Nowait parameter for the FOR UPDATE statement.
:param session: The database session in use.
:raises: RuleNotFound if no Rule can be found.
:raises: AccessDenied if the Rule is locked.
"""
with record_timer_block('rule.delete_rule'):
try:
rule = session.query(models.ReplicationRule).filter(models.ReplicationRule.id == rule_id).with_for_update(nowait=nowait).one()
except NoResultFound:
raise RuleNotFound('No rule with the id %s found' % (rule_id))
if rule.locked:
raise AccessDenied('The replication rule is locked and has to be unlocked before it can be deleted.')
if purge_replicas is not None:
rule.purge_replicas = purge_replicas
if soft:
if rule.expires_at:
rule.expires_at = min(datetime.utcnow() + timedelta(seconds=3600), rule.expires_at)
else:
rule.expires_at = datetime.utcnow() + timedelta(seconds=3600)
insert_rule_history(rule=rule, recent=True, longterm=False, session=session)
return
locks = session.query(models.ReplicaLock).filter(models.ReplicaLock.rule_id == rule_id).with_for_update(nowait=nowait).yield_per(100)
# Remove locks, set tombstone if applicable
transfers_to_delete = [] # [{'scope': , 'name':, 'rse_id':}]
def list_heartbeats(issuer=None):
"""
Return a list of tuples of all heartbeats.
:param issuer: The issuer account.
:returns: List of tuples [('Executable', 'Hostname', ...), ...]
"""
kwargs = {'issuer': issuer}
if not permission.has_permission(issuer=issuer, action='list_heartbeats', kwargs=kwargs):
raise exception.AccessDenied('%s cannot list heartbeats' % issuer)
return heartbeat.list_heartbeats()
def del_rse_attribute(rse, key, issuer):
"""
Delete a RSE attribute.
:param rse: the name of the rse_module.
:param key: the attribute key.
:return: True if RSE attribute was deleted successfully, False otherwise.
"""
rse_id = rse_module.get_rse_id(rse=rse)
kwargs = {'rse': rse, 'rse_id': rse_id, 'key': key}
if not permission.has_permission(issuer=issuer, action='del_rse_attribute', kwargs=kwargs):
raise exception.AccessDenied('Account %s can not delete RSE attributes' % (issuer))
return rse_module.del_rse_attribute(rse_id=rse_id, key=key)
header('Cache-Control', 'no-cache, no-store, max-age=0, must-revalidate')
header('Cache-Control', 'post-check=0, pre-check=0', False)
header('Pragma', 'no-cache')
account = ctx.env.get('HTTP_X_RUCIO_ACCOUNT')
gsscred = ctx.env.get('REMOTE_USER')
appid = ctx.env.get('HTTP_X_RUCIO_APPID')
if appid is None:
appid = 'unknown'
ip = ctx.env.get('HTTP_X_FORWARDED_FOR')
if ip is None:
ip = ctx.ip
try:
result = get_auth_token_gss(account, gsscred, appid, ip)
except AccessDenied:
raise generate_http_error(401, 'CannotAuthenticate', 'Cannot authenticate to account %(account)s with given credentials' % locals())
if result is None:
raise generate_http_error(401, 'CannotAuthenticate', 'Cannot authenticate to account %(account)s with given credentials' % locals())
else:
header('X-Rucio-Auth-Token', result.token)
header('X-Rucio-Auth-Token-Expires', date_to_str(result.expired_at))
return str()
raise BadRequest()
def move_replication_rule(rule_id, rse_expression, issuer, vo='def'):
"""
Move a replication rule to another RSE and, once done, delete the original one.
:param rule_id: Rule to be moved.
:param rse_expression: RSE expression of the new rule.
:param session: The DB Session.
:param vo: The VO to act on.
:raises: RuleNotFound, RuleReplaceFailed
"""
kwargs = {'rule_id': rule_id, 'rse_expression': rse_expression}
if not has_permission(issuer=issuer, vo=vo, action='access_rule_vo', kwargs=kwargs):
raise AccessDenied('Account %s can not access rules at other VOs.' % (issuer))
if not has_permission(issuer=issuer, vo=vo, action='move_rule', kwargs=kwargs):
raise AccessDenied('Account %s can not move this replication rule.' % (issuer))
return rule.move_rule(rule_id=rule_id, rse_expression=rse_expression)
def add_vo(new_vo, issuer, description=None, email=None, vo='def'):
'''
Add a new VO.
:param new_vo: The name/tag of the VO to add (3 characters).
:param description: A description of the VO. e.g the full name or a brief description
:param email: A contact for the VO.
:param issuer: The user issuing the command.
:param vo: The vo of the user issuing the command.
'''
validate_schema('vo', new_vo)
kwargs = {}
if not has_permission(issuer=issuer, action='add_vo', kwargs=kwargs, vo=vo):
raise exception.AccessDenied('Account {} cannot add a VO'.format(issuer))
vo_core.add_vo(vo=new_vo, description=description, email=email)
def list_vos(issuer, vo='def'):
'''
List the VOs.
:param issuer: The user issuing the command.
:param vo: The vo of the user issuing the command.
'''
kwargs = {}
if not has_permission(issuer=issuer, action='list_vos', kwargs=kwargs, vo=vo):
raise exception.AccessDenied('Account {} cannot list VOs'.format(issuer))
return vo_core.list_vos()
def get_global_account_usage(account, rse_expression, issuer):
"""
Get the account usage and connect it with (if available) the account limits of the account.
:param account: The account to read.
:param rse_expression: The rse expression to read (If none, get all).
:param issuer: The issuer account.
:returns: List of dicts {'rse_id', 'bytes_used', 'files_used', 'bytes_limit'}
"""
kwargs = {'account': account, 'rse_expression': rse_expression}
if not rucio.api.permission.has_permission(issuer=issuer, action='get_global_account_usage', kwargs=kwargs):
raise rucio.common.exception.AccessDenied('Account %s can not list global account usage.' % (issuer))
account = InternalAccount(account)
if not account_exists(account=account):
raise rucio.common.exception.AccountNotFound('Account %s does not exist' % (account))
return account_limit_core.get_global_account_usage(account=account, rse_expression=rse_expression)