Source code for deploy_tools.layout
from pathlib import Path
[docs]
class ModuleAreaLayout:
"""Represents the layout of Modules with the given root path.
This is generic to both built and deployed modules.
"""
ENTRYPOINTS_FOLDER = "entrypoints"
MODULE_SNAPSHOT_FILENAME = "module.yaml"
MODULEFILE_FILENAME = "modulefile"
def __init__(self, root: Path) -> None:
self._root = root
[docs]
def get_module_folder(self, name: str, version: str) -> Path:
"""Return the folder holding the given module's files."""
return self._root / name / version
[docs]
def get_entrypoints_folder(self, name: str, version: str) -> Path:
"""Return the folder holding the given module's entrypoint scripts."""
return self.get_module_folder(name, version) / self.ENTRYPOINTS_FOLDER
[docs]
def get_modulefile(self, name: str, version: str) -> Path:
"""Return the path to the given module's modulefile."""
return self.get_module_folder(name, version) / self.MODULEFILE_FILENAME
[docs]
def get_module_snapshot_path(self, name: str, version: str) -> Path:
"""Return the path to the given module's configuration snapshot."""
return self.get_module_folder(name, version) / self.MODULE_SNAPSHOT_FILENAME
[docs]
class ModuleBuildLayout(ModuleAreaLayout):
"""Represents the layout used for Modules during the build process.
When intended to be used before the Deploy step, this should be done on the same
filesystem as the Deployment Area, in order to ensure that all filesystem moves are
atomic.
"""
SIF_FILES_FOLDER = "sif_files"
[docs]
def get_sif_files_folder(self, name: str, version: str) -> Path:
"""Return the folder holding the given module's Apptainer ``.sif`` images."""
return self.get_module_folder(name, version) / self.SIF_FILES_FOLDER
@property
def build_root(self) -> Path:
"""Root path of the build area."""
return self._root
[docs]
class Layout:
"""Represents the layout of the deployment area."""
MODULES_ROOT_NAME = "modules"
MODULEFILES_ROOT_NAME = "modulefiles"
DEPRECATED_ROOT_NAME = "deprecated"
DEFAULT_BUILD_ROOT_NAME = "build"
DEFAULT_VERSION_FILENAME = ".version"
DEPLOYMENT_SNAPSHOT_FILENAME = "deployment.yaml"
def __init__(self, deployment_root: Path, build_root: Path | None = None) -> None:
self._root = deployment_root
self._modules_layout = ModuleAreaLayout(self.modules_root)
if build_root is not None:
self._build_root = build_root
else:
self._build_root = self._root / self.DEFAULT_BUILD_ROOT_NAME
[docs]
def get_module_folder(self, name: str, version: str) -> Path:
"""Return the folder holding the given deployed module's files."""
return self._modules_layout.get_module_folder(name, version)
[docs]
def get_entrypoints_folder(self, name: str, version: str) -> Path:
"""Return the folder holding the given deployed module's entrypoint scripts."""
return self._modules_layout.get_entrypoints_folder(name, version)
[docs]
def get_modulefiles_root(self, from_deprecated: bool = False) -> Path:
"""Return the modulefiles root, or the deprecated one if requested."""
return (
self.deprecated_modulefiles_root
if from_deprecated
else self.modulefiles_root
)
[docs]
def get_modulefile_link(
self, name: str, version: str, from_deprecated: bool = False
) -> Path:
"""Return the path to the modulefile link for the given module."""
return self.get_modulefiles_root(from_deprecated) / name / version
[docs]
def get_modulefile(self, name: str, version: str) -> Path:
"""Return the path to the given deployed module's modulefile."""
return self._modules_layout.get_modulefile(name, version)
[docs]
def get_module_snapshot_path(self, name: str, version: str) -> Path:
"""Return the path to the given deployed module's configuration snapshot."""
return self._modules_layout.get_module_snapshot_path(name, version)
[docs]
def get_default_version_file(self, name: str) -> Path:
"""Return the path to the file recording a module's default version."""
return self.modulefiles_root / name / self.DEFAULT_VERSION_FILENAME
@property
def deployment_root(self) -> Path:
"""Root path of the deployment area."""
return self._root
@property
def deprecated_root(self) -> Path:
"""Root path for deprecated files."""
return self._root / self.DEPRECATED_ROOT_NAME
@property
def modules_root(self) -> Path:
"""Root path holding deployed modules."""
return self._root / self.MODULES_ROOT_NAME
@property
def modulefiles_root(self) -> Path:
"""Root path holding modulefile links for deployed modules."""
return self._root / self.MODULEFILES_ROOT_NAME
@property
def deprecated_modulefiles_root(self) -> Path:
"""Root path holding modulefile links for deprecated modules."""
return self.deprecated_root / self.MODULEFILES_ROOT_NAME
@property
def deployment_snapshot_path(self) -> Path:
"""Path to the deployment area's configuration snapshot."""
return self._root / self.DEPLOYMENT_SNAPSHOT_FILENAME
@property
def build_layout(self) -> ModuleBuildLayout:
"""Return the `ModuleBuildLayout` for the associated build area."""
return ModuleBuildLayout(self._build_root)