Source code for aiida_diff.helpers
""" Helper functions for automatically setting up computer & code.
Helper functions for setting up
1. An AiiDA localhost computer
2. A "diff" code on localhost
Note: Point 2 is made possible by the fact that the ``diff`` executable is
available in the PATH on almost any UNIX system.
"""
import shutil
import tempfile
from aiida.common.exceptions import NotExistent
from aiida.orm import Code, Computer
LOCALHOST_NAME = "localhost-test"
executables = {
"diff": "diff",
}
[docs]
def get_path_to_executable(executable):
"""Get path to local executable.
:param executable: Name of executable in the $PATH variable
:type executable: str
:return: path to executable
:rtype: str
"""
path = shutil.which(executable)
if path is None:
raise ValueError(f"'{executable}' executable not found in PATH.")
return path
[docs]
def get_computer(name=LOCALHOST_NAME, workdir=None):
"""Get AiiDA computer.
Loads computer 'name' from the database, if exists.
Sets up local computer 'name', if it isn't found in the DB.
:param name: Name of computer to load or set up.
:param workdir: path to work directory
Used only when creating a new computer.
:return: The computer node
:rtype: :py:class:`aiida.orm.computers.Computer`
"""
try:
computer = Computer.objects.get(label=name)
except NotExistent:
if workdir is None:
workdir = tempfile.mkdtemp()
computer = Computer(
label=name,
description="localhost computer set up by aiida_diff tests",
hostname=name,
workdir=workdir,
transport_type="core.local",
scheduler_type="core.direct",
)
computer.store()
computer.set_minimum_job_poll_interval(0.0)
computer.configure()
return computer
[docs]
def get_code(entry_point, computer):
"""Get local code.
Sets up code for given entry point on given computer.
:param entry_point: Entry point of calculation plugin
:param computer: (local) AiiDA computer
:return: The code node
:rtype: :py:class:`aiida.orm.nodes.data.code.installed.InstalledCode`
"""
try:
executable = executables[entry_point]
except KeyError as exc:
raise KeyError(
f"Entry point '{entry_point}' not recognized. Allowed values: {list(executables.keys())}"
) from exc
codes = Code.objects.find( # pylint: disable=no-member
filters={"label": executable}
)
if codes:
return codes[0]
path = get_path_to_executable(executable)
code = Code(
input_plugin_name=entry_point,
remote_computer_exec=[computer, path],
)
code.label = executable
return code.store()