def upload_working_dir_if_needed( runtime_env: Dict[str, Any], scratch_dir: str, logger: Optional[logging.Logger] = default_logger, ) -> Dict[str, Any]: """Uploads the working_dir and replaces it with a URI. If the working_dir is already a URI, this is a no-op. """ working_dir = runtime_env.get("working_dir") if working_dir is None: return runtime_env if not isinstance(working_dir, str) and not isinstance(working_dir, Path): raise TypeError( "working_dir must be a string or Path (either a local path " f"or remote URI), got {type(working_dir)}.") if isinstance(working_dir, Path): working_dir = str(working_dir) # working_dir is already a URI -- just pass it through. try: protocol, path = parse_uri(working_dir) except ValueError: protocol, path = None, None if protocol is not None: if protocol in Protocol.remote_protocols( ) and not path.endswith(".zip"): raise ValueError("Only .zip files supported for remote URIs.") return runtime_env excludes = runtime_env.get("excludes", None) try: working_dir_uri = get_uri_for_directory(working_dir, excludes=excludes) except ValueError: # working_dir is not a directory package_path = Path(working_dir) if not package_path.exists() or package_path.suffix != ".zip": raise ValueError(f"directory {package_path} must be an existing " "directory or a zip package") pkg_uri = get_uri_for_package(package_path) upload_package_to_gcs(pkg_uri, package_path.read_bytes()) runtime_env["working_dir"] = pkg_uri return runtime_env upload_package_if_needed( working_dir_uri, scratch_dir, working_dir, include_parent_dir=False, excludes=excludes, logger=logger, ) runtime_env["working_dir"] = working_dir_uri return runtime_env
def _check_is_uri(s: str) -> bool: try: protocol, path = parse_uri(s) except ValueError: protocol, path = None, None if protocol in Protocol.remote_protocols() and not path.endswith(".zip"): raise ValueError("Only .zip files supported for remote URIs.") return protocol is not None
def validate_uri(uri: str): if not isinstance(uri, str): raise TypeError("URIs for working_dir and py_modules must be " f"strings, got {type(uri)}.") try: from ray._private.runtime_env.packaging import parse_uri, Protocol protocol, path = parse_uri(uri) except ValueError: raise ValueError( f"{uri} is not a valid URI. Passing directories or modules to " "be dynamically uploaded is only supported at the job level " "(i.e., passed to `ray.init`).") if protocol in Protocol.remote_protocols() and not path.endswith(".zip"): raise ValueError("Only .zip files supported for remote URIs.")
def upload_working_dir_if_needed( runtime_env: Dict[str, Any], scratch_dir: str, logger: Optional[logging.Logger] = default_logger) -> Dict[str, Any]: """Uploads the working_dir and replaces it with a URI. If the working_dir is already a URI, this is a no-op. """ working_dir = runtime_env.get("working_dir") if working_dir is None: return runtime_env if not isinstance(working_dir, str): raise TypeError( "working_dir must be a string (either a local path or remote " f"URI), got {type(working_dir)}.") # working_dir is already a URI -- just pass it through. try: protocol, path = parse_uri(working_dir) except ValueError: protocol, path = None, None if protocol is not None: if protocol in Protocol.remote_protocols( ) and not path.endswith(".zip"): raise ValueError("Only .zip files supported for remote URIs.") return runtime_env excludes = runtime_env.get("excludes", None) working_dir_uri = get_uri_for_directory(working_dir, excludes=excludes) upload_package_if_needed(working_dir_uri, scratch_dir, working_dir, include_parent_dir=False, excludes=excludes, logger=logger) runtime_env["working_dir"] = working_dir_uri return runtime_env