Source code for spack.test.cmd.buildcache

# Copyright 2013-2022 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 errno
import os
import platform
import shutil
import sys

import pytest

import spack.binary_distribution
import spack.environment as ev
import spack.main
import spack.spec
from spack.spec import Spec

buildcache = spack.main.SpackCommand('buildcache')
install = spack.main.SpackCommand('install')
env = spack.main.SpackCommand('env')
add = spack.main.SpackCommand('add')
gpg = spack.main.SpackCommand('gpg')
mirror = spack.main.SpackCommand('mirror')
uninstall = spack.main.SpackCommand('uninstall')

pytestmark = pytest.mark.skipif(sys.platform == "win32",
                                reason="does not run on windows")


[docs]@pytest.fixture() def mock_get_specs(database, monkeypatch): specs = database.query_local() monkeypatch.setattr( spack.binary_distribution, 'update_cache_and_get_specs', lambda: specs )
[docs]@pytest.fixture() def mock_get_specs_multiarch(database, monkeypatch): specs = [spec.copy() for spec in database.query_local()] # make one spec that is NOT the test architecture for spec in specs: if spec.name == "mpileaks": spec.architecture = spack.spec.ArchSpec('linux-rhel7-x86_64') break monkeypatch.setattr( spack.binary_distribution, 'update_cache_and_get_specs', lambda: specs )
[docs]@pytest.mark.skipif( platform.system().lower() != 'linux', reason='implementation for MacOS still missing' ) @pytest.mark.db def test_buildcache_preview_just_runs(database): buildcache('preview', 'mpileaks')
[docs]@pytest.mark.db @pytest.mark.regression('13757') def test_buildcache_list_duplicates(mock_get_specs, capsys): with capsys.disabled(): output = buildcache('list', 'mpileaks', '@2.3') assert output.count('mpileaks') == 3
[docs]@pytest.mark.db @pytest.mark.regression('17827') def test_buildcache_list_allarch(database, mock_get_specs_multiarch, capsys): with capsys.disabled(): output = buildcache('list', '--allarch') assert output.count('mpileaks') == 3 with capsys.disabled(): output = buildcache('list') assert output.count('mpileaks') == 2
[docs]def tests_buildcache_create( install_mockery, mock_fetch, monkeypatch, tmpdir): """"Ensure that buildcache create creates output files""" pkg = 'trivial-install-test-package' install(pkg) buildcache('create', '-d', str(tmpdir), '--unsigned', pkg) spec = Spec(pkg).concretized() tarball_path = spack.binary_distribution.tarball_path_name(spec, '.spack') tarball = spack.binary_distribution.tarball_name(spec, '.spec.json') assert os.path.exists( os.path.join(str(tmpdir), 'build_cache', tarball_path)) assert os.path.exists( os.path.join(str(tmpdir), 'build_cache', tarball))
[docs]def tests_buildcache_create_env( install_mockery, mock_fetch, monkeypatch, tmpdir, mutable_mock_env_path): """"Ensure that buildcache create creates output files from env""" pkg = 'trivial-install-test-package' env('create', 'test') with ev.read('test'): add(pkg) install() buildcache('create', '-d', str(tmpdir), '--unsigned') spec = Spec(pkg).concretized() tarball_path = spack.binary_distribution.tarball_path_name(spec, '.spack') tarball = spack.binary_distribution.tarball_name(spec, '.spec.json') assert os.path.exists( os.path.join(str(tmpdir), 'build_cache', tarball_path)) assert os.path.exists( os.path.join(str(tmpdir), 'build_cache', tarball))
[docs]def test_buildcache_create_fails_on_noargs(tmpdir): """Ensure that buildcache create fails when given no args or environment.""" with pytest.raises(spack.main.SpackCommandError): buildcache('create', '-d', str(tmpdir), '--unsigned')
[docs]def test_buildcache_create_fail_on_perm_denied( install_mockery, mock_fetch, monkeypatch, tmpdir): """Ensure that buildcache create fails on permission denied error.""" install('trivial-install-test-package') tmpdir.chmod(0) with pytest.raises(OSError) as error: buildcache('create', '-d', str(tmpdir), '--unsigned', 'trivial-install-test-package') assert error.value.errno == errno.EACCES tmpdir.chmod(0o700)
[docs]def test_update_key_index(tmpdir, mutable_mock_env_path, install_mockery, mock_packages, mock_fetch, mock_stage, mock_gnupghome): """Test the update-index command with the --keys option""" working_dir = tmpdir.join('working_dir') mirror_dir = working_dir.join('mirror') mirror_url = 'file://{0}'.format(mirror_dir.strpath) mirror('add', 'test-mirror', mirror_url) gpg('create', 'Test Signing Key', 'nobody@nowhere.com') s = Spec('libdwarf').concretized() # Install a package install(s.name) # Put installed package in the buildcache, which, because we're signing # it, should result in the public key getting pushed to the buildcache # as well. buildcache('create', '-a', '-d', mirror_dir.strpath, s.name) # Now make sure that when we pass the "--keys" argument to update-index # it causes the index to get update. buildcache('update-index', '--keys', '-d', mirror_dir.strpath) key_dir_list = os.listdir(os.path.join( mirror_dir.strpath, 'build_cache', '_pgp')) uninstall('-y', s.name) mirror('rm', 'test-mirror') assert 'index.json' in key_dir_list
[docs]def test_buildcache_sync(mutable_mock_env_path, install_mockery_mutable_config, mock_packages, mock_fetch, mock_stage, tmpdir): """ Make sure buildcache sync works in an environment-aware manner, ignoring any specs that may be in the mirror but not in the environment. """ working_dir = tmpdir.join('working_dir') src_mirror_dir = working_dir.join('src_mirror').strpath src_mirror_url = 'file://{0}'.format(src_mirror_dir) dest_mirror_dir = working_dir.join('dest_mirror').strpath dest_mirror_url = 'file://{0}'.format(dest_mirror_dir) in_env_pkg = 'trivial-install-test-package' out_env_pkg = 'libdwarf' def verify_mirror_contents(): dest_list = os.listdir( os.path.join(dest_mirror_dir, 'build_cache')) found_pkg = False for p in dest_list: assert(out_env_pkg not in p) if in_env_pkg in p: found_pkg = True if not found_pkg: print('Expected to find {0} in {1}'.format( in_env_pkg, dest_mirror_dir)) assert(False) # Install a package and put it in the buildcache s = Spec(out_env_pkg).concretized() install(s.name) buildcache( 'create', '-u', '-f', '-a', '--mirror-url', src_mirror_url, s.name) env('create', 'test') with ev.read('test'): add(in_env_pkg) install() buildcache( 'create', '-u', '-f', '-a', '--mirror-url', src_mirror_url, in_env_pkg) # Now run the spack buildcache sync command with all the various options # for specifying mirrors # Use urls to specify mirrors buildcache('sync', '--src-mirror-url', src_mirror_url, '--dest-mirror-url', dest_mirror_url) verify_mirror_contents() shutil.rmtree(dest_mirror_dir) # Use local directory paths to specify fs locations buildcache('sync', '--src-directory', src_mirror_dir, '--dest-directory', dest_mirror_dir) verify_mirror_contents() shutil.rmtree(dest_mirror_dir) # Use mirror names to specify mirrors mirror('add', 'src', src_mirror_url) mirror('add', 'dest', dest_mirror_url) buildcache('sync', '--src-mirror-name', 'src', '--dest-mirror-name', 'dest') verify_mirror_contents()
[docs]def test_buildcache_create_install(mutable_mock_env_path, install_mockery_mutable_config, mock_packages, mock_fetch, mock_stage, monkeypatch, tmpdir): """"Ensure that buildcache create creates output files""" pkg = 'trivial-install-test-package' install(pkg) buildcache('create', '-d', str(tmpdir), '--unsigned', pkg) spec = Spec(pkg).concretized() tarball_path = spack.binary_distribution.tarball_path_name(spec, '.spack') tarball = spack.binary_distribution.tarball_name(spec, '.spec.json') assert os.path.exists( os.path.join(str(tmpdir), 'build_cache', tarball_path)) assert os.path.exists( os.path.join(str(tmpdir), 'build_cache', tarball))