def test_delete_recursive_wildcard(tmp_shared_volume_path): """Test recursive wildcard deletion of files.""" file_binary_content = b'1,2,3,4\n5,6,7,8' size = 0 directory_path = Path(tmp_shared_volume_path, 'rm_files_test') files_to_remove = ['file1.csv', 'subdir/file2.csv'] posix_path_to_deleted_files = [] for file_name in files_to_remove: posix_file_path = Path(directory_path, file_name) posix_file_path.parent.mkdir(parents=True) posix_file_path.touch() size = posix_file_path.write_bytes(file_binary_content) assert posix_file_path.exists() posix_path_to_deleted_files.append(posix_file_path) deleted_files = remove_files_recursive_wildcard(directory_path, '**/*') for posix_file_path in posix_path_to_deleted_files: assert not posix_file_path.exists() for key in files_to_remove: assert key in deleted_files['deleted'] assert deleted_files['deleted'][key]['size'] == size assert not len(deleted_files['failed'])
def delete_file(workflow_id_or_name, file_name): # noqa r"""Delete a file from the workspace. --- delete: summary: Delete the specified file. description: >- This resource is expecting a workflow UUID and a filename existing inside the workspace to be deleted. operationId: delete_file produces: - application/json parameters: - name: user in: query description: Required. UUID of workflow owner. required: true type: string - name: workflow_id_or_name in: path description: Required. Workflow UUID or name required: true type: string - name: file_name in: path description: Required. Name (or path) of the file to be deleted. required: true type: string responses: 200: description: >- Requests succeeded. The file has been downloaded. schema: type: file 404: description: >- Request failed. `file_name` does not exist. examples: application/json: { "message": "input.csv does not exist" } 500: description: >- Request failed. Internal controller error. examples: application/json: { "message": "Internal workflow controller error." } """ try: user_uuid = request.args["user"] user = User.query.filter(User.id_ == user_uuid).first() if not user: return jsonify({"message": "User {} does not exist".format(user)}), 404 workflow = _get_workflow_with_uuid_or_name(workflow_id_or_name, user_uuid) deleted = remove_files_recursive_wildcard(workflow.workspace_path, file_name) # update user and workflow resource disk quota freed_up_bytes = sum( size.get("size", 0) for size in deleted["deleted"].values() ) store_workflow_disk_quota(workflow, bytes_to_sum=-freed_up_bytes) update_users_disk_quota(user, bytes_to_sum=-freed_up_bytes) return jsonify(deleted), 200 except ValueError: return ( jsonify( { "message": "REANA_WORKON is set to {0}, but " "that workflow does not exist. " "Please set your REANA_WORKON environment " "variable appropriately.".format(workflow_id_or_name) } ), 404, ) except KeyError: return jsonify({"message": "Malformed request."}), 400 except NotFound: return jsonify({"message": "{0} does not exist.".format(file_name)}), 404 except OSError: return jsonify({"message": "Error while deleting {}.".format(file_name)}), 500 except Exception as e: return jsonify({"message": str(e)}), 500
def delete_file(workflow_id_or_name, file_name): # noqa r"""Delete a file from the workspace. --- delete: summary: Delete the specified file. description: >- This resource is expecting a workflow UUID and a filename existing inside the workspace to be deleted. operationId: delete_file produces: - application/json parameters: - name: user in: query description: Required. UUID of workflow owner. required: true type: string - name: workflow_id_or_name in: path description: Required. Workflow UUID or name required: true type: string - name: file_name in: path description: Required. Name (or path) of the file to be deleted. required: true type: string responses: 200: description: >- Requests succeeded. The file has been downloaded. schema: type: file 404: description: >- Request failed. `file_name` does not exist. examples: application/json: { "message": "input.csv does not exist" } 500: description: >- Request failed. Internal controller error. examples: application/json: { "message": "Internal workflow controller error." } """ try: user_uuid = request.args['user'] user = User.query.filter(User.id_ == user_uuid).first() if not user: return jsonify( {'message': 'User {} does not exist'.format(user)}), 404 workflow = _get_workflow_with_uuid_or_name(workflow_id_or_name, user_uuid) abs_path_to_workspace = os.path.join( current_app.config['SHARED_VOLUME_PATH'], workflow.workspace_path) deleted = remove_files_recursive_wildcard( abs_path_to_workspace, file_name) return jsonify(deleted), 200 except ValueError: return jsonify({'message': 'REANA_WORKON is set to {0}, but ' 'that workflow does not exist. ' 'Please set your REANA_WORKON environment ' 'variable appropriately.'. format(workflow_id_or_name)}), 404 except KeyError: return jsonify({"message": "Malformed request."}), 400 except NotFound as e: return jsonify( {"message": "{0} does not exist.".format(file_name)}), 404 except OSError as e: return jsonify( {"message": "Error while deleting {}.".format(file_name)}), 500 except Exception as e: return jsonify({"message": str(e)}), 500