Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/simdb/remote/core/alias.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import os
from pathlib import Path

from simdb.remote.core.typing import current_app
Expand All @@ -15,4 +16,7 @@ def create_alias_dir(simulation):
if len(alias_subpath.parts) > 1:
alias_path.parent.mkdir(parents=True, exist_ok=True)

alias_path.symlink_to(base_dir / simulation.uuid.hex)
relative_target = os.path.relpath(
base_dir / simulation.uuid.hex, start=alias_path.parent
)
alias_path.symlink_to(relative_target, target_is_directory=True)
34 changes: 34 additions & 0 deletions tests/remote/test_alias.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from pathlib import Path
from types import SimpleNamespace
from uuid import uuid4

from simdb.remote.core import alias


def test_nested_alias_uses_relative_symlink_that_survives_move(tmp_path, monkeypatch):
base_dir = tmp_path / "storage"
base_dir.mkdir()

simulation = SimpleNamespace(alias="user/project/case", uuid=uuid4())
simulation_dir = base_dir / simulation.uuid.hex
simulation_dir.mkdir()
config = SimpleNamespace(
get_string_option=lambda option: str(base_dir),
)
monkeypatch.setattr(
alias,
"current_app",
SimpleNamespace(simdb_config=config),
)

alias.create_alias_dir(simulation)

alias_path = base_dir / "aliases" / simulation.alias
assert alias_path.readlink() == Path("../../..") / simulation.uuid.hex
assert alias_path.resolve() == simulation_dir

moved_base_dir = tmp_path / "moved-storage"
base_dir.rename(moved_base_dir)

moved_alias_path = moved_base_dir / "aliases" / simulation.alias
assert moved_alias_path.resolve() == moved_base_dir / simulation.uuid.hex