def GET(self, rse): """ get locks for a given rse. HTTP Success: 200 OK HTTP Error: 404 Not Found 406 Not Acceptable 500 InternalError :returns: JSON dict containing informations about the requested user. """ header('Content-Type', 'application/x-json-stream') did_type = None if ctx.query: params = parse_qs(ctx.query[1:]) if 'did_type' in params: did_type = params['did_type'][0] try: if did_type == 'dataset': for lock in get_dataset_locks_by_rse(rse, vo=ctx.env.get('vo')): yield render_json(**lock) + '\n' else: raise InternalError('Wrong did_type specified') except RSENotFound as error: raise generate_http_error(404, error.__class__.__name__, error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: raise InternalError(error)
def GET(self, scope, name): """ Return all rules of a given DID. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 406 Not Acceptable 404 Not Found :param scope: The scope name. """ header('Content-Type', 'application/x-json-stream') try: for rule in list_replication_rules({ 'scope': scope, 'name': name }, vo=ctx.env.get('vo')): yield dumps(rule, cls=APIEncoder) + '\n' except RuleNotFound as error: raise generate_http_error(404, 'RuleNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: raise InternalError(error)
def GET(self, guid): """ Return the file associated to a GUID. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 406 Not Acceptable 404 Not Found :param scope: The scope name. """ header('Content-Type', 'application/x-json-stream') try: for dataset in get_dataset_by_guid(guid, vo=ctx.env.get('vo')): yield dumps(dataset, cls=APIEncoder) + '\n' except DataIdentifierNotFound as error: raise generate_http_error(404, 'DataIdentifierNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: raise InternalError(error)
def GET(self, scope, name): """ Return all users following a specific DID. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 406 Not Acceptable 404 Not Found :param name: The data identifier name. :param scope: The scope name. """ header('Content-Type', 'application/json') try: # Get the users following a did and render it as json. for user in get_users_following_did(scope=scope, name=name, vo=ctx.env.get('vo')): yield render_json(**user) + '\n' except DataIdentifierNotFound as error: raise generate_http_error(404, 'DataIdentifierNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error)
def GET(self, scope, name): """ List all replicas of a data identifier. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 406 Not Acceptable 500 InternalError :returns: A dictionary containing all replicas information. """ header('Content-Type', 'application/x-json-stream') long = False if ctx.query: params = parse_qs(ctx.query[1:]) if 'long' in params: long = True try: for file in list_files(scope=scope, name=name, long=long, vo=ctx.env.get('vo')): yield dumps(file) + "\n" except DataIdentifierNotFound as error: raise generate_http_error(404, 'DataIdentifierNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error)
def GET(self, rse): """ Get RSE usage information. :param rse: the RSE name. """ header('Content-Type', 'application/x-json-stream') usage = None source = None per_account = False if ctx.query: params = parse_qs(ctx.query[1:]) if 'source' in params: source = params['source'][0] if 'per_account' in params: per_account = params['per_account'][0] == 'True' try: usage = get_rse_usage(rse, issuer=ctx.env.get('issuer'), source=source, per_account=per_account, vo=ctx.env.get('vo')) except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error) for u in usage: yield render_json(**u) + '\n'
def GET(self): """ List all RSEs. HTTP Success: 200 OK HTTP Error: 400 Bad request 401 Unauthorized 404 Resource not Found 406 Not Acceptable 500 InternalError :returns: A list containing all RSEs. """ header('Content-Type', 'application/x-json-stream') params = input() if 'expression' in params: try: for rse in parse_rse_expression(params['expression'], vo=ctx.env.get('vo')): item = {'rse': rse} yield render_json(**item) + '\n' except InvalidRSEExpression as error: raise generate_http_error(400, 'InvalidRSEExpression', error.args[0]) except InvalidObject as error: raise generate_http_error(400, 'InvalidObject', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) else: for rse in list_rses(vo=ctx.env.get('vo')): yield render_json(**rse) + '\n'
def GET(self): """ Retrieve all exceptions. HTTP Success: 200 OK HTTP Error: 404 Not Found 406 Not Acceptable 500 Internal Error """ header('Content-Type', 'application/x-json-stream') try: for exception in list_exceptions(vo=ctx.env.get('vo')): yield dumps(exception, cls=APIEncoder) + '\n' except LifetimeExceptionNotFound as error: raise generate_http_error(404, 'LifetimeExceptionNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: raise InternalError(error)
def GET(self, account): """ list all attributes for an account. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 404 Not Found 406 Not Acceptable 500 InternalError :param Rucio-Account: Account identifier. :param Rucio-Auth-Token: as an 32 character hex string. :returns: JSON dict containing informations about the requested account. """ header('Content-Type', 'application/json') try: attribs = list_account_attributes(account, vo=ctx.env.get('vo')) except AccountNotFound as error: raise generate_http_error(404, 'AccountNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error) return dumps(attribs)
def POST(self, account, scope): """ Creates scope with given scope name. HTTP Success: 201 Created HTTP Error: 401 Unauthorized 404 Not Found 409 Conflict 500 Internal Error :param Rucio-Auth-Account: Account identifier. :param Rucio-Auth-Token: as an 32 character hex string. :params Rucio-Account: account belonging to the new scope. """ try: add_scope(scope, account, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except Duplicate as error: raise generate_http_error(409, 'Duplicate', error.args[0]) except AccountNotFound as error: raise generate_http_error(404, 'AccountNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: raise InternalError(error) raise Created()
def DELETE(self, account, rse_expression): """ Delete an account limit. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 404 Not Found 500 Internal Error :param X-Rucio-Auth-Account: Account identifier. :param X-Rucio-Auth-Token: As an 32 character hex string. :param account: Account name. :param rse_expression: RSE expression. """ try: delete_global_account_limit(account=account, rse_expression=rse_expression, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except AccessDenied as exception: raise generate_http_error(401, 'AccessDenied', exception.args[0]) except AccountNotFound as exception: raise generate_http_error(404, 'AccountNotFound', exception.args[0]) except RSENotFound as exception: raise generate_http_error(404, 'RSENotFound', exception.args[0]) except Exception as exception: print(format_exc()) raise InternalError(exception) raise OK()
def PUT(self, exception_id): """ Approve/Reject an execption. HTTP Success: 201 Created HTTP Error: 400 Bad Request 401 Unauthorized 404 Not Found 500 Internal Error """ json_data = data() try: params = loads(json_data) except ValueError: raise generate_http_error(400, 'ValueError', 'Cannot decode json parameter list') try: state = params['state'] except KeyError: state = None try: update_exception(exception_id=exception_id, state=state, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except UnsupportedOperation as error: raise generate_http_error(400, 'UnsupportedOperation', error.args[0]) except AccessDenied as error: raise generate_http_error(401, 'AccessDenied', error.args[0]) except LifetimeExceptionNotFound as error: raise generate_http_error(404, 'LifetimeExceptionNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: raise InternalError(error) raise Created()
def GET(self, rse): """ Get RSE usage information. :param rse: the RSE name. """ header('Content-Type', 'application/x-json-stream') source = None if ctx.query: params = parse_qs(ctx.query[1:]) if 'source' in params: source = params['source'][0] try: for usage in list_rse_usage_history(rse=rse, issuer=ctx.env.get('issuer'), source=source, vo=ctx.env.get('vo')): yield render_json(**usage) + '\n' except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error)
def DELETE(self, rse, key): """ delete RSE attribute HTTP Success: 200 OK HTTP Error: 401 Unauthorized 404 Not Found 500 InternalError """ try: del_rse_attribute(rse=rse, key=key, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except AccessDenied as error: raise generate_http_error(401, 'AccessDenied', error.args[0]) except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except RSEAttributeNotFound as error: raise generate_http_error(404, 'RSEAttributeNotFound', error.args[0]) except Exception as error: raise InternalError(error) raise OK()
def GET(self, rse, scheme): """ List all references of the provided RSE for the given protocol. HTTP Success: 200 OK HTTP Error: 404 Resource not Found 406 Not Acceptable 500 InternalError :returns: A list with detailed protocol information. """ header('Content-Type', 'application/json') p_list = None try: p_list = get_rse_protocols(rse, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except RSEProtocolNotSupported as error: raise generate_http_error(404, 'RSEProtocolNotSupported', error.args[0]) except RSEProtocolDomainNotSupported as error: raise generate_http_error(404, 'RSEProtocolDomainNotSupported', error.args[0]) except Exception as error: print(error) print(format_exc()) raise InternalError(error) return dumps(p_list)
def GET(self, account): """ list all scopes for an account. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 404 Not Found 406 Not Acceptable 500 InternalError :param Rucio-Account: Account identifier. :param Rucio-Auth-Token: as an 32 character hex string. :returns: A list containing all scope names for an account. """ header('Content-Type', 'application/json') try: scopes = get_scopes(account, vo=ctx.env.get('vo')) except AccountNotFound as error: raise generate_http_error(404, 'AccountNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error) if not len(scopes): raise generate_http_error( 404, 'ScopeNotFound', 'no scopes found for account ID \'%s\'' % account) return dumps(scopes)
def DELETE(self, rse, scheme, hostname=None, port=None): """ Deletes a protocol entry for the provided RSE. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 404 Resource not Found 500 InternalError """ try: del_protocols(rse, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo'), scheme=scheme, hostname=hostname, port=port) except RSEProtocolNotSupported as error: raise generate_http_error(404, 'RSEProtocolNotSupported', error.args[0]) except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(error) print(format_exc()) raise InternalError(error) raise OK()
def DELETE(self, account): """ disable account with given account name. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 404 Not Found 500 InternalError :param Rucio-Account: Account identifier. :param Rucio-Auth-Token: as an 32 character hex string. """ try: del_account(account, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except AccessDenied as error: raise generate_http_error(401, 'AccessDenied', error.args[0]) except AccountNotFound as error: raise generate_http_error(404, 'AccountNotFound', error.args[0]) except Exception as error: raise InternalError(error) raise OK()
def DELETE(self, rse): """ Delete RSE limits. HTTP Success: 200 Updated HTTP Error: 400 Bad Request 401 Unauthorized 404 Not Found 409 Conflict 500 Internal Error :param rse: The RSE name. """ header('Content-Type', 'application/json') json_data = data().decode() try: parameter = loads(json_data) except ValueError: raise generate_http_error(400, 'ValueError', 'Cannot decode json parameter dictionary') try: delete_rse_limits(rse=rse, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo'), **parameter) except AccessDenied as error: raise generate_http_error(401, 'AccessDenied', error.args[0]) except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error) raise OK()
def GET(self, account, rse_expression=None): """ Return the account usage of the account. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 406 Not Acceptable 404 Not Found :param account: The account name. :param rse_expression: The RSE expression. """ header('Content-Type', 'application/x-json-stream') try: for usage in get_global_account_usage( account=account, rse_expression=rse_expression, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')): yield dumps(usage, cls=APIEncoder) + '\n' except AccountNotFound as error: raise generate_http_error(404, 'AccountNotFound', error.args[0]) except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except AccessDenied as error: raise generate_http_error(401, 'AccessDenied', error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error)
def PUT(self): """ Update a file replicas state at a given RSE. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 500 Internal Error """ json_data = data() try: parameters = parse_response(json_data) except ValueError: raise generate_http_error(400, 'ValueError', 'Cannot decode json parameter list') try: update_replicas_states(rse=parameters['rse'], files=parameters['files'], issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except AccessDenied as error: raise generate_http_error(401, 'AccessDenied', error.args[0]) except UnsupportedOperation as error: raise generate_http_error(500, 'UnsupportedOperation', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error) raise OK()
def GET(self): """ List all VOs. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 409 Conflict 500 InternalError :returns: A list containing all VOs. """ header('Content-Type', 'application/x-json-stream') try: for vo in list_vos(issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')): yield render_json(**vo) + '\n' except AccessDenied as error: raise generate_http_error(401, 'AccessDenied', error.args[0]) except UnsupportedOperation as error: raise generate_http_error(409, 'UnsupportedOperation', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(error) print(format_exc()) raise InternalError(error)
def GET(self, scope, name): """ Returns the contents history of a data identifier. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 406 Not Acceptable 500 InternalError :param scope: The scope of the data identifier. :param name: The name of the data identifier. :returns: A list with the contents. """ header('Content-Type', 'application/x-json-stream') try: for did in list_content_history(scope=scope, name=name, vo=ctx.env.get('vo')): yield render_json(**did) + '\n' except DataIdentifierNotFound as error: raise generate_http_error(404, 'DataIdentifierNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error)
def DELETE(self, rse): """ Disable RSE with given account name. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 404 Not Found 500 InternalError :param rse: RSE name. """ try: del_rse(rse=rse, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except RSEOperationNotSupported as error: raise generate_http_error(404, 'RSEOperationNotSupported', error.args[0]) except AccessDenied as error: raise generate_http_error(401, 'AccessDenied', error.args[0]) except CounterNotFound as error: raise generate_http_error(404, 'CounterNotFound', error.args[0]) raise OK()
def GET(self, scope, name): """ List all parents of a data identifier. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 406 Not Acceptable 500 InternalError :returns: A list of dictionary containing all dataset information. """ header('Content-Type', 'application/x-json-stream') try: for dataset in list_parent_dids(scope=scope, name=name, vo=ctx.env.get('vo')): yield render_json(**dataset) + "\n" except DataIdentifierNotFound as error: raise generate_http_error(404, 'DataIdentifierNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error)
def GET(self, rse): """ list all RSE attributes for a RSE. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 404 Not Found 406 Not Acceptable 500 InternalError :param rse: RSE name. :returns: A list containing all RSE attributes. """ header('Content-Type', 'application/json') try: rse_attr = list_rse_attributes(rse, vo=ctx.env.get('vo')) except AccessDenied as error: raise generate_http_error(401, 'AccessDenied', error.args[0]) except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except Exception as error: print(format_exc()) raise InternalError(error) return dumps(rse_attr)
def GET(self, scope, name): """ Return all associated rules of a file. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 406 Not Acceptable 404 Not Found :param scope: The scope name. """ header('Content-Type', 'application/x-json-stream') try: for rule in list_associated_replication_rules_for_file( scope=scope, name=name, vo=ctx.env.get('vo')): yield dumps(rule, cls=APIEncoder) + '\n' except DataIdentifierNotFound as error: raise generate_http_error(404, 'DataIdentifierNotFound', error.args[0]) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) except Exception as error: raise InternalError(error)
def GET(self, rse): """ List all supported protocols of the given RSE. HTTP Success: 200 OK HTTP Error: 404 Resource not Found 406 Not Acceptable 500 InternalError :returns: A list containing all supported protocols and all their attributes. """ header('Content-Type', 'application/json') p_list = None try: p_list = get_rse_protocols(rse, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except RSEOperationNotSupported as error: raise generate_http_error(404, 'RSEOperationNotSupported', error.args[0]) except RSENotFound as error: raise generate_http_error(404, 'RSENotFound', error.args[0]) except RSEProtocolNotSupported as error: raise generate_http_error(404, 'RSEProtocolNotSupported', error.args[0]) except RSEProtocolDomainNotSupported as error: raise generate_http_error(404, 'RSEProtocolDomainNotSupported', error.args[0]) except Exception as error: print(error) print(format_exc()) raise InternalError(error) if len(p_list['protocols']): return dumps(p_list['protocols']) else: raise generate_http_error(404, 'RSEProtocolNotSupported', 'No prptocols found for this RSE')
def POST(self): """ Import data into Rucio. HTTP Success: 200 OK HTTP Error: 400 Bad request 401 Unauthorized 404 Resource not Found 500 InternalError """ header('Content-Type', 'application/x-json-stream') json_data = data() try: data_to_import = json_data and parse_response(json_data) except ValueError: raise generate_http_error( 400, 'ValueError', 'Cannot decode json parameter dictionary') try: import_data(data=data_to_import, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except RucioException as error: raise generate_http_error(500, error.__class__.__name__, error.args[0]) raise Created()
def POST(self): """ Set the value of an option. If the option does not exist, create it. HTTP Success: 200 OK HTTP Error: 401 Unauthorized 400 The input data is invalid or incomplete 500 ConfigurationError :param Rucio-Auth-Account: Account identifier. :param Rucio-Auth-Token: 32 character hex string. """ json_data = data().decode() try: input_data = json.loads(json_data) except ValueError: raise generate_http_error(400, 'ValueError', 'Cannot decode json parameter dictionary') section, option, value = _config_items_from_input(input_data) if section is None or option is None or value is None: raise generate_http_error(400, 'ValueError', 'Invalid input data') try: config.set(section=section, option=option, value=value, issuer=ctx.env.get('issuer'), vo=ctx.env.get('vo')) except ConfigurationError: raise generate_http_error(500, 'ConfigurationError', 'Could not set value \'%s\' for section \'%s\' option \'%s\'' % (value, section, option)) except Exception as error: print(format_exc()) raise InternalError(error) raise Created()