Skip to content

Commit

Permalink
switch to run_shell_cmd in easybuild/tools/container
Browse files Browse the repository at this point in the history
  • Loading branch information
boegel committed Jan 3, 2024
1 parent c98825d commit c292756
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 31 deletions.
18 changes: 9 additions & 9 deletions easybuild/tools/containers/apptainer.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
from easybuild.tools.config import CONT_IMAGE_FORMAT_SIF, CONT_IMAGE_FORMAT_SQUASHFS
from easybuild.tools.config import build_option, container_path
from easybuild.tools.filetools import remove_file, which
from easybuild.tools.run import run_cmd
from easybuild.tools.run import run_shell_cmd


class ApptainerContainer(SingularityContainer):
Expand All @@ -48,15 +48,15 @@ class ApptainerContainer(SingularityContainer):
def apptainer_version():
"""Get Apptainer version."""
version_cmd = "apptainer --version"
out, ec = run_cmd(version_cmd, simple=False, trace=False, force_in_dry_run=True)
if ec:
raise EasyBuildError("Error running '%s': %s for tool {1} with output: {2}" % (version_cmd, out))
res = run_shell_cmd(version_cmd, simple=False, trace=False, force_in_dry_run=True)
if res.exit_code:
raise EasyBuildError(f"Error running '{version_cmd}': {res.output}")

res = re.search(r"\d+\.\d+(\.\d+)?", out.strip())
if not res:
raise EasyBuildError("Error parsing Apptainer version: %s" % out)
regex_res = re.search(r"\d+\.\d+(\.\d+)?", res.output.strip())
if not regex_res:
raise EasyBuildError(f"Error parsing Apptainer version: {res.output}")

return res.group(0)
return regex_res.group(0)

def build_image(self, recipe_path):
"""Build container image by calling out to 'sudo apptainer build'."""
Expand Down Expand Up @@ -108,5 +108,5 @@ def build_image(self, recipe_path):

cmd = ' '.join(['sudo', cmd_env, apptainer, 'build', cmd_opts, img_path, recipe_path])
print_msg("Running '%s', you may need to enter your 'sudo' password..." % cmd)
run_cmd(cmd, stream_output=True)
run_shell_cmd(cmd, stream_output=True)
print_msg("Apptainer image created at %s" % img_path, log=self.log)
4 changes: 2 additions & 2 deletions easybuild/tools/containers/docker.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
from easybuild.tools.containers.utils import det_os_deps
from easybuild.tools.filetools import remove_dir
from easybuild.tools.module_naming_scheme.easybuild_mns import EasyBuildMNS
from easybuild.tools.run import run_cmd
from easybuild.tools.run import run_shell_cmd


DOCKER_TMPL_HEADER = """\
Expand Down Expand Up @@ -164,7 +164,7 @@ def build_image(self, dockerfile):
docker_cmd = ' '.join(['sudo', 'docker', 'build', '-f', dockerfile, '-t', container_name, '.'])

print_msg("Running '%s', you may need to enter your 'sudo' password..." % docker_cmd)
run_cmd(docker_cmd, path=tempdir, stream_output=True)
run_shell_cmd(docker_cmd, work_dir=tempdir, stream_output=True)
print_msg("Docker image created at %s" % container_name, log=self.log)

remove_dir(tempdir)
18 changes: 9 additions & 9 deletions easybuild/tools/containers/singularity.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
from easybuild.tools.config import build_option, container_path
from easybuild.tools.containers.base import ContainerGenerator
from easybuild.tools.filetools import read_file, remove_file, which
from easybuild.tools.run import run_cmd
from easybuild.tools.run import run_shell_cmd


ARCH = 'arch' # Arch Linux
Expand Down Expand Up @@ -162,15 +162,15 @@ class SingularityContainer(ContainerGenerator):
def singularity_version():
"""Get Singularity version."""
version_cmd = "singularity --version"
out, ec = run_cmd(version_cmd, simple=False, trace=False, force_in_dry_run=True)
if ec:
raise EasyBuildError("Error running '%s': %s for tool {1} with output: {2}" % (version_cmd, out))
res = run_shell_cmd(version_cmd, simple=False, trace=False, force_in_dry_run=True)
if res.exit_code:
raise EasyBuildError(f"Error running '{version_cmd}': {res.output}")

res = re.search(r"\d+\.\d+(\.\d+)?", out.strip())
if not res:
raise EasyBuildError("Error parsing Singularity version: %s" % out)
regex_res = re.search(r"\d+\.\d+(\.\d+)?", res.output.strip())
if not regex_res:
raise EasyBuildError(f"Error parsing Singularity version: {res.output}")

return res.group(0)
return regex_res.group(0)

def resolve_template(self):
"""Return template container recipe."""
Expand Down Expand Up @@ -403,5 +403,5 @@ def build_image(self, recipe_path):

cmd = ' '.join(['sudo', cmd_env, singularity, 'build', cmd_opts, img_path, recipe_path])
print_msg("Running '%s', you may need to enter your 'sudo' password..." % cmd)
run_cmd(cmd, stream_output=True)
run_shell_cmd(cmd, stream_output=True)
print_msg("Singularity image created at %s" % img_path, log=self.log)
25 changes: 14 additions & 11 deletions easybuild/tools/containers/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
from easybuild.tools import LooseVersion
from easybuild.tools.build_log import EasyBuildError, print_msg
from easybuild.tools.filetools import which
from easybuild.tools.run import run_cmd
from easybuild.tools.run import run_shell_cmd


def det_os_deps(easyconfigs):
Expand Down Expand Up @@ -70,20 +70,23 @@ def check_tool(tool_name, min_tool_version=None):
if not tool_path:
return False

print_msg("{0} tool found at {1}".format(tool_name, tool_path))
print_msg(f"{tool_name} tool found at {tool_path}")

if not min_tool_version:
return True

version_cmd = "{0} --version".format(tool_name)
out, ec = run_cmd(version_cmd, simple=False, trace=False, force_in_dry_run=True)
if ec:
raise EasyBuildError("Error running '{0}' for tool {1} with output: {2}".format(version_cmd, tool_name, out))
res = re.search(r"\d+\.\d+(\.\d+)?", out.strip())
if not res:
raise EasyBuildError("Error parsing version for tool {0}".format(tool_name))
tool_version = res.group(0)
version_cmd = f"{tool_name} --version")
res = run_shell_cmd(version_cmd, hidden=True, in_dry_run=True)
if res.exit_code:
raise EasyBuildError(f"Error running '{version_cmd}' for tool {tool_name} with output: {res.output}")

regex_res = re.search(r"\d+\.\d+(\.\d+)?", res.output.strip())
if not regex_res:
raise EasyBuildError(f"Error parsing version for tool {tool_name}")

tool_version = regex_res.group(0)
version_ok = LooseVersion(str(min_tool_version)) <= LooseVersion(tool_version)
if version_ok:
print_msg("{0} version '{1}' is {2} or higher ... OK".format(tool_name, tool_version, min_tool_version))
print_msg(f"{tool_name} version '{tool_version}' is {min_tool_version} or higher ... OK")

return version_ok

0 comments on commit c292756

Please sign in to comment.