spack/lib/spack/spack/test/container/docker.py
2024-05-06 15:51:45 +02:00

148 lines
4.9 KiB
Python

# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import re
import pytest
import spack.container.writers as writers
def test_manifest(minimal_configuration):
writer = writers.create(minimal_configuration)
manifest_str = writer.manifest
for line in manifest_str.split("\n"):
assert "echo" in line
def test_build_and_run_images(minimal_configuration):
writer = writers.create(minimal_configuration)
# Test the output of run property
run = writer.run
assert run.image == "ubuntu:22.04"
# Test the output of the build property
build = writer.build
assert build.image == "spack/ubuntu-jammy:develop"
def test_packages(minimal_configuration):
# In this minimal configuration we don't have packages
writer = writers.create(minimal_configuration)
assert writer.os_packages_build is None
assert writer.os_packages_final is None
# If we add them a list should be returned
pkgs = ["libgomp1"]
minimal_configuration["spack"]["container"]["os_packages"] = {"final": pkgs}
writer = writers.create(minimal_configuration)
p = writer.os_packages_final
assert p.update
assert p.install
assert p.clean
assert p.list == pkgs
def test_container_os_packages_command(minimal_configuration):
# In this minimal configuration we don't have packages
writer = writers.create(minimal_configuration)
assert writer.os_packages_build is None
assert writer.os_packages_final is None
# If we add them a list should be returned
minimal_configuration["spack"]["container"]["images"] = {
"build": "custom-build:latest",
"final": "custom-final:latest",
}
minimal_configuration["spack"]["container"]["os_packages"] = {
"command": "zypper",
"final": ["libgomp1"],
}
writer = writers.create(minimal_configuration)
p = writer.os_packages_final
assert "zypper update -y" in p.update
assert "zypper install -y" in p.install
assert "zypper clean -a" in p.clean
def test_ensure_render_works(minimal_configuration, default_config):
# Here we just want to ensure that nothing is raised
writer = writers.create(minimal_configuration)
writer()
def test_strip_is_set_from_config(minimal_configuration):
writer = writers.create(minimal_configuration)
assert writer.strip is True
minimal_configuration["spack"]["container"]["strip"] = False
writer = writers.create(minimal_configuration)
assert writer.strip is False
def test_custom_base_images(minimal_configuration):
"""Test setting custom base images from configuration file"""
minimal_configuration["spack"]["container"]["images"] = {
"build": "custom-build:latest",
"final": "custom-final:latest",
}
writer = writers.create(minimal_configuration)
assert writer.bootstrap.image is None
assert writer.build.image == "custom-build:latest"
assert writer.run.image == "custom-final:latest"
@pytest.mark.parametrize(
"images_cfg,expected",
[
(
{"os": "amazonlinux:2", "spack": "develop"},
{
"bootstrap_image": "amazonlinux:2",
"build_image": "bootstrap",
"final_image": "amazonlinux:2",
},
)
],
)
def test_base_images_with_bootstrap(minimal_configuration, images_cfg, expected):
"""Check that base images are computed correctly when a
bootstrap phase is present
"""
minimal_configuration["spack"]["container"]["images"] = images_cfg
writer = writers.create(minimal_configuration)
for property_name, value in expected.items():
assert getattr(writer, property_name) == value
def test_error_message_invalid_os(minimal_configuration):
minimal_configuration["spack"]["container"]["images"]["os"] = "invalid:1"
with pytest.raises(ValueError, match="invalid operating system"):
writers.create(minimal_configuration)
@pytest.mark.regression("34629,18030")
def test_not_stripping_all_symbols(minimal_configuration):
"""Tests that we are not stripping all symbols, so that libraries can still be
used for linking.
"""
minimal_configuration["spack"]["container"]["strip"] = True
content = writers.create(minimal_configuration)()
assert "xargs strip" in content
assert "xargs strip -s" not in content
@pytest.mark.regression("22341")
def test_using_single_quotes_in_dockerfiles(minimal_configuration):
"""Tests that Dockerfiles written by Spack use single quotes in manifest, to avoid issues
with shell substitution. This may happen e.g. when users have "definitions:" they want to
expand in dockerfiles.
"""
manifest_in_docker = writers.create(minimal_configuration).manifest
assert not re.search(r"echo\s*\"", manifest_in_docker, flags=re.MULTILINE)
assert re.search(r"echo\s*'", manifest_in_docker)