Source code for law.contrib.wlcg.target

# coding: utf-8

"""
WLCG remote file system and targets.
"""

from __future__ import annotations

__all__ = ["WLCGFileSystem", "WLCGTarget", "WLCGFileTarget", "WLCGDirectoryTarget"]

import pathlib

import law
from law.target.remote import (
    RemoteFileSystem, RemoteTarget, RemoteFileTarget, RemoteDirectoryTarget,
)
from law.logger import get_logger


logger = get_logger(__name__)


[docs] class WLCGFileSystem(RemoteFileSystem): file_interface_cls = law.gfal.GFALFileInterface # type: ignore[attr-defined] def __init__(self, section: str | None = None, **kwargs) -> None: # read configs from section and combine them with kwargs to get the file system and # file interface configs section, fs_config, fi_config = self._init_configs( section, "default_wlcg_fs", "_wlcg_fs_defaults", kwargs, ) # store the config section self.config_section = section fs_config.setdefault("name", self.config_section) # base path is mandatory if not fi_config.get("base"): raise Exception( "attribute 'base' must not be empty, set it either directly in the " f"{self.__class__.__name__} constructor, or add the option 'base' to your config " f"section '{self.config_section}'", ) # enforce some configs fs_config["has_permissions"] = False # create the file interface file_interface = self.file_interface_cls(**fi_config) # initialize the file system itself super().__init__(file_interface, **fs_config)
# try to set the default fs instance try: WLCGFileSystem.default_instance = WLCGFileSystem() logger.debug(f"created default WLCGFileSystem instance '{WLCGFileSystem.default_instance}'") except Exception as e: logger.debug(f"could not create default WLCGFileSystem instance: {e}")
[docs] class WLCGTarget(RemoteTarget): def __init__( self, path: str | pathlib.Path, fs: str | pathlib.Path | WLCGFileSystem | None = WLCGFileSystem.default_instance, # type: ignore[assignment] # noqa **kwargs, ) -> None: if fs is None: fs = WLCGFileSystem.default_instance # type: ignore[assignment] elif not isinstance(fs, WLCGFileSystem): fs = WLCGFileSystem(str(fs)) super().__init__(path, fs, **kwargs) # type: ignore[arg-type]
[docs] class WLCGFileTarget(WLCGTarget, RemoteFileTarget): pass
[docs] class WLCGDirectoryTarget(WLCGTarget, RemoteDirectoryTarget): pass
WLCGTarget.file_class = WLCGFileTarget # type: ignore[type-abstract] WLCGTarget.directory_class = WLCGDirectoryTarget # type: ignore[type-abstract]