def delete(self): """ Delete file replicas at a given RSE. .. :quickref: Replicas; Delete replica at RSE. :<json string rse: The RSE name. :<json list files: list of dicts with 'scope', 'name'. :<json bool ignore_availability: Flag to ignore the RSE blacklisting. :status 200: Replica successfully deleted. :status 400: Cannot decode json parameter list. :status 401: Invalid auth token. :status 404: RSE not found. :status 404: Replica not found. """ parameters = json_parameters(parse_response) rse = param_get(parameters, 'rse') files = param_get(parameters, 'files') try: delete_replicas( rse=rse, files=files, issuer=request.environ.get('issuer'), vo=request.environ.get('vo'), ignore_availability=param_get(parameters, 'ignore_availability', default=False), ) except AccessDenied as error: return generate_http_error_flask(401, error) except (RSENotFound, ReplicaNotFound) as error: return generate_http_error_flask(404, error) except ResourceTemporaryUnavailable as error: return generate_http_error_flask(503, error) return '', 200
def DELETE(self): """ Delete file replicas at a given RSE. HTTP Success: 200 Ok HTTP Error: 401 Unauthorized 409 Conflict 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: delete_replicas(rse=parameters['rse'], files=parameters['files'], issuer=ctx.env.get( 'issuer'), ignore_availability=parameters.get('ignore_availability', False)) 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 ResourceTemporaryUnavailable as error: raise generate_http_error(503, 'ResourceTemporaryUnavailable', error.args[0]) except ReplicaNotFound as error: raise generate_http_error(404, 'ReplicaNotFound', 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 delete(self): """ Delete file replicas at a given RSE. .. :quickref: Replicas; Delete replica at RSE. :<json string rse: The RSE name. :<json list files: list of dicts with 'scope', 'name'. :<json bool ignore_availability: Flag to ignore the RSE blacklisting. :status 200: Replica successfully deleted. :status 400: Cannot decode json parameter list. :status 401: Invalid auth token. :status 404: RSE not found. :status 404: Replica not found. :status 500: Internal Error. """ json_data = request.data try: parameters = parse_response(json_data) except ValueError: return generate_http_error_flask( 400, 'ValueError', 'Cannot decode json parameter list') try: delete_replicas(rse=parameters['rse'], files=parameters['files'], issuer=request.environ.get('issuer'), ignore_availability=parameters.get( 'ignore_availability', False)) except AccessDenied, e: return generate_http_error_flask(401, 'AccessDenied', e.args[0][0])
def DELETE(self): """ Delete file replicas at a given RSE. HTTP Success: 200 Ok HTTP Error: 401 Unauthorized 409 Conflict 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: delete_replicas(rse=parameters['rse'], files=parameters['files'], issuer=ctx.env.get('issuer'), ignore_availability=parameters.get( 'ignore_availability', False)) except AccessDenied, e: raise generate_http_error(401, 'AccessDenied', e.args[0][0])
def cache_delete_replicas(rse, files, account): """ Rucio Cache delete replicas """ return_code = 0 for file in files: # delete replica try: delete_replicas(rse, [file], issuer=account) except exception.ReplicaNotFound: logging.warn("%s:%s doesn't exists in %s, cannot delete, with error details: %s" % (file["scope"], file["name"], rse, str(format_exc()))) return_code = DEL_REPLICA_ERROR return return_code
def delete(self): """ Delete file replicas at a given RSE. .. :quickref: Replicas; Delete replica at RSE. :<json string rse: The RSE name. :<json list files: list of dicts with 'scope', 'name'. :<json bool ignore_availability: Flag to ignore the RSE blacklisting. :status 200: Replica successfully deleted. :status 400: Cannot decode json parameter list. :status 401: Invalid auth token. :status 404: RSE not found. :status 404: Replica not found. :status 500: Internal Error. """ json_data = request.data try: parameters = parse_response(json_data) except ValueError: return generate_http_error_flask( 400, 'ValueError', 'Cannot decode json parameter list') try: delete_replicas(rse=parameters['rse'], files=parameters['files'], issuer=request.environ.get('issuer'), vo=request.environ.get('vo'), ignore_availability=parameters.get( 'ignore_availability', False)) 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 ResourceTemporaryUnavailable as error: return generate_http_error_flask(503, 'ResourceTemporaryUnavailable', error.args[0]) except ReplicaNotFound as error: return generate_http_error_flask(404, 'ReplicaNotFound', error.args[0]) except RucioException as error: return generate_http_error_flask(500, error.__class__.__name__, error.args[0]) except Exception as error: print(format_exc()) return error, 500 return 'OK', 200
def DELETE(self): """ Delete file replicas at a given RSE. HTTP Success: 200 Ok HTTP Error: 401 Unauthorized 409 Conflict 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: delete_replicas(rse=parameters['rse'], files=parameters['files'], issuer=ctx.env.get('issuer'), ignore_availability=parameters.get('ignore_availability', False)) except AccessDenied, e: raise generate_http_error(401, 'AccessDenied', e.args[0][0])
def remove_extra_replicas(self, to_remove): """ :param to_remove: replicas to remove from Rucio :return: """ with monitor.record_timer_block('cms_sync.time_remove_replica'): if to_remove and self.dry_run: logging.info('Dry run: Removing replicas %s from rse %s.', str(to_remove), self.rse) elif to_remove: logging.debug('Removing %s replicas from rse %s.', len(to_remove), self.rse) for to_remove_chunk in chunks(to_remove, REMOVE_CHUNK_SIZE): delete_replicas(rse=self.rse, issuer=self.account, files=[{ 'scope': self.scope, 'name': lfn } for lfn in to_remove_chunk]) # FIXME: Do we need a retry here on DatabaseException? If so, use the retry module return len(to_remove)