def PUT(self, rse): """ Update 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: set_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 PUT(self, rse): """ Update 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() try: parameter = loads(json_data) except ValueError: raise generate_http_error( 400, 'ValueError', 'Cannot decode json parameter dictionary') try: set_rse_limits(rse=rse, issuer=ctx.env.get('issuer'), **parameter) except AccessDenied, error: raise generate_http_error(401, 'AccessDenied', error.args[0][0])
def put(self, rse): """ Update RSE limits. .. :quickref: Limits; Update RSE limits. :param rse: The RSE name. :status 200: OK. :status 400: Cannot decode json parameter dictionary. :status 401: Invalid Auth Token. :status 404: RSE Not Found. :status 500: Internal Error. """ json_data = request.data try: parameter = loads(json_data) except ValueError: return generate_http_error_flask( 400, 'ValueError', 'Cannot decode json parameter dictionary') try: set_rse_limits(rse=rse, issuer=request.environ.get('issuer'), **parameter) except AccessDenied, error: return generate_http_error_flask(401, 'AccessDenied', error.args[0])
def put(self, rse): """ Update RSE limits. .. :quickref: Limits; Update RSE limits. :param rse: The RSE name. :status 200: OK. :status 400: Cannot decode json parameter dictionary. :status 401: Invalid Auth Token. :status 404: RSE Not Found. :status 500: Internal Error. """ json_data = request.data try: parameter = loads(json_data) except ValueError: return generate_http_error_flask(400, 'ValueError', 'Cannot decode json parameter dictionary') try: set_rse_limits(rse=rse, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'), **parameter) except AccessDenied as error: return generate_http_error_flask(401, 'AccessDenied', error.args[0]) except RSENotFound as error: return generate_http_error_flask(404, 'RSENotFound', error.args[0]) except RucioException as error: return generate_http_error_flask(500, error.__class__.__name__, error.args[0]) except Exception as error: logging.exception("Internal Error") return str(error), 500 return '', 200
def put(self, rse): """ Update RSE limits. .. :quickref: Limits; Update RSE limits. :param rse: The RSE name. :status 200: OK. :status 400: Cannot decode json parameter dictionary. :status 401: Invalid Auth Token. :status 404: RSE Not Found. """ parameters = json_parameters() kwargs = {'name': None, 'value': None} for keyword in kwargs.keys(): kwargs[keyword] = param_get(parameters, keyword, default=kwargs[keyword]) try: set_rse_limits(rse=rse, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'), **kwargs) except AccessDenied as error: return generate_http_error_flask(401, error) except RSENotFound as error: return generate_http_error_flask(404, error) return '', 200
def test_reaper_affect_other_vo_via_run(vo, second_vo, scope_factory, caches_mock, file_config_mock): """ MULTI VO (DAEMON): Test that reaper runs on the specified VO(s) and does not reap others""" [cache_region] = caches_mock new_vo = second_vo scope_name, [scope_tst, scope_new] = scope_factory(vos=[vo, new_vo]) rse_name = rse_name_generator() nb_files = 30 file_size = 200 # 2G names = ['lfn' + generate_uuid() for _ in range(nb_files)] _, rse_id_tst, _ = __add_test_rse_and_replicas(vo=vo, scope=scope_tst, rse_name=rse_name, names=names, file_size=file_size) _, rse_id_new, _ = __add_test_rse_and_replicas(vo=new_vo, scope=scope_new, rse_name=rse_name, names=names, file_size=file_size) rse_api.set_rse_usage(rse=rse_name, source='storage', used=nb_files * file_size, free=1, issuer='root', vo=vo) rse_api.set_rse_limits(rse=rse_name, name='MinFreeSpace', value=5 * 200, issuer='root', vo=vo) rse_api.set_rse_limits(rse=rse_name, name='MaxBeingDeletedFiles', value=10, issuer='root', vo=vo) rse_api.set_rse_usage(rse=rse_name, source='storage', used=nb_files * file_size, free=1, issuer='root', vo=new_vo) rse_api.set_rse_limits(rse=rse_name, name='MinFreeSpace', value=5 * 200, issuer='root', vo=new_vo) rse_api.set_rse_limits(rse=rse_name, name='MaxBeingDeletedFiles', value=10, issuer='root', vo=new_vo) # Check we start of with the expected number of replicas assert len(list(replica_api.list_replicas([{'scope': scope_name, 'name': n} for n in names], rse_expression=rse_name, vo=vo))) == nb_files assert len(list(replica_api.list_replicas([{'scope': scope_name, 'name': n} for n in names], rse_expression=rse_name, vo=new_vo))) == nb_files # Check we don't affect a second VO that isn't specified cache_region.invalidate() run_reaper(once=True, rses=[rse_name], vos=['new']) assert len(list(replica_api.list_replicas([{'scope': scope_name, 'name': n} for n in names], rse_expression=rse_name, vo=vo))) == nb_files assert len(list(replica_api.list_replicas([{'scope': scope_name, 'name': n} for n in names], rse_expression=rse_name, vo=new_vo))) == 25
def PUT(self, rse): """ Update RSE limits. HTTP Success: 200 Updated HTTP Error: 400 Bad Request 401 Unauthorized 409 Conflict 500 Internal Error :param rse: The RSE name. """ header('Content-Type', 'application/json') json_data = data() try: parameter = loads(json_data) except ValueError: raise generate_http_error(400, 'ValueError', 'Cannot decode json parameter dictionary') try: set_rse_limits(rse=rse, issuer=ctx.env.get('issuer'), **parameter) except AccessDenied, e: raise generate_http_error(401, 'AccessDenied', e.args[0][0])
def test_reaper_multi_vo_via_run(vo): """ MULTI VO (DAEMON): Test that reaper runs on the specified VO(s) """ new_vo = __setup_new_vo() scope_name, [scope_tst, scope_new] = __setup_scopes_for_vos(vo, new_vo) rse_name = rse_name_generator() nb_files = 30 file_size = 200 # 2G names = ['lfn' + generate_uuid() for _ in range(nb_files)] _, rse_id_tst, _ = __add_test_rse_and_replicas(vo=vo, scope=scope_tst, rse_name=rse_name, names=names, file_size=file_size) _, rse_id_new, _ = __add_test_rse_and_replicas(vo=new_vo, scope=scope_new, rse_name=rse_name, names=names, file_size=file_size) rse_api.set_rse_usage(rse=rse_name, source='storage', used=nb_files * file_size, free=1, issuer='root', vo=vo) rse_api.set_rse_limits(rse=rse_name, name='MinFreeSpace', value=5 * 200, issuer='root', vo=vo) rse_api.set_rse_limits(rse=rse_name, name='MaxBeingDeletedFiles', value=10, issuer='root', vo=vo) rse_api.set_rse_usage(rse=rse_name, source='storage', used=nb_files * file_size, free=1, issuer='root', vo=new_vo) rse_api.set_rse_limits(rse=rse_name, name='MinFreeSpace', value=5 * 200, issuer='root', vo=new_vo) rse_api.set_rse_limits(rse=rse_name, name='MaxBeingDeletedFiles', value=10, issuer='root', vo=new_vo) # Check we start of with the expected number of replicas assert len( list( replica_api.list_replicas([{ 'scope': scope_name, 'name': n } for n in names], rse_expression=rse_name, vo=vo))) == nb_files assert len( list( replica_api.list_replicas([{ 'scope': scope_name, 'name': n } for n in names], rse_expression=rse_name, vo=new_vo))) == nb_files # Check we reap all VOs by default REGION.invalidate() run_reaper(once=True, rses=[rse_name]) assert len( list( replica_api.list_replicas([{ 'scope': scope_name, 'name': n } for n in names], rse_expression=rse_name, vo=vo))) == 25 assert len( list( replica_api.list_replicas([{ 'scope': scope_name, 'name': n } for n in names], rse_expression=rse_name, vo=new_vo))) == 25