code: def save_files(bucket_name, source_path, destination_path):
      """given a directory path, save all files recursively to storage"""
      storage_client = storage.Client()
      bucket = storage_client.get_bucket(bucket_name)
  
      # destination path should be stripped of path indicators too
      bucket_name = bucket_name.strip("/")
      destination_path = destination_path.strip("/")
  
      # These are fullpaths
      filenames = get_source_files(source_path)
      print(
          "\nThe following files will be uploaded: %s"
          % "\n".join(filenames)
      )
  
      if not filenames:
          print("Did not find any filenames under %s" % source_path)
  
      # Do the upload!
      for filename in filenames:
          # The relative path of the filename from the source path
          relative_path = filename.replace(source_path, "", 1).strip(
              "/"
          )
          # The path in storage includes relative path from destination_path
          storage_path = os.path.join(destination_path, relative_path)
          full_path = os.path.join(bucket_name, storage_path)
          print(f"{filename} -> {full_path}")
          blob = bucket.blob(storage_path)
          print(f"Uploading {filename} to {full_path}")
          blob.upload_from_filename(filename, content_type=".txt")
  
file_path: snakemake/snakemake/executors/google_lifesciences_helper.py
imports: import argparse
  from google.cloud import storage
  from glob import glob
  import sys
  import os
label_desc: Use image node_id 2 for calling a global function with example usage: save_files(bucket_name, source_path, destination_path) without return types