cookbooks/aws-parallelcluster-environment/resources/spack/partial/_spack_common.rb (113 lines of code) (raw):
# frozen_string_literal: true
# Copyright:: 2013-2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with the
# License. A copy of the License is located at
#
# http://aws.amazon.com/apache2.0/
#
# or in the "LICENSE.txt" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
# OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions and
# limitations under the License.
unified_mode true
default_action :setup
property :spack_root, String, required: false,
default: node['cluster']['spack_shared_dir']
action :install_spack do
return if on_docker?
package_repos 'update package repos'
install_packages 'install spack dependencies' do
packages dependencies
action :install
end
# Get Spack tarball
spack_version = node['cluster']['spack']['version']
spack_tar_name = "spack-#{spack_version}"
spack_tarball = "#{node['cluster']['sources_dir']}/#{spack_tar_name}.tar.gz"
spack_url = "https://github.com/spack/spack/archive/refs/tags/v#{spack_version}.tar.gz"
spack_sha256 = node['cluster']['spack']['sha256']
remote_file spack_tarball do
source spack_url
user 'root'
group 'root'
mode '0644'
retries 3
retry_delay 5
checksum spack_sha256
action :create_if_missing
end
directory new_resource.spack_root do
user 'root'
group 'root'
mode '0755'
recursive true
end
bash 'Extract spack' do
user 'root'
group 'root'
code <<-SCRIPT
set -e
tar -xf #{spack_tarball} --directory #{new_resource.spack_root} --strip-components 1
SCRIPT
end
template '/etc/profile.d/spack.sh' do
cookbook 'aws-parallelcluster-environment'
source 'spack/spack.sh.erb'
owner 'root'
group 'root'
mode '0755'
variables(spack_root: new_resource.spack_root)
end
spack = "#{new_resource.spack_root}/bin/spack"
spack_configs_dir = "#{new_resource.spack_root}/etc/spack"
cookbook_file "#{spack_configs_dir}/modules.yaml" do
cookbook 'aws-parallelcluster-environment'
source 'spack/modules.yaml'
owner 'root'
group 'root'
mode '0755'
end
bash 'setup Spack' do
user 'root'
group 'root'
code <<-SPACK
source #{new_resource.spack_root}/share/spack/setup-env.sh
# Generate Spack user's compilers.yaml config with preinstalled compilers
#{spack} compiler add --scope site
# Add external packages to Spack user's packages.yaml config
#{spack} external find --scope site
# Remove all autotools/buildtools packages. These versions need to be managed by spack or it will
# eventually end up in a version mismatch (e.g. when compiling gmp).
#{spack} tags build-tools | xargs -I {} #{spack} config --scope site rm packages:{}
SPACK
end
node.default['cluster']['spack']['root'] = new_resource.spack_root
node_attributes 'dump node attributes'
end
# Binaries are currently only available for alinux. However, there is an issue verifying binaries with alinux due to gpg2.
# This action should be included under OS specific setup actions when binaries are supported.
action :add_binaries do
unless spack_installed?
Chef::Log.warn 'Spack root directory not found, ensure that Spack is installed before adding binaries'
return
end
spack = "#{new_resource.spack_root}/bin/spack"
bash 'add binaries' do
user 'root'
group 'root'
code <<-SPACK
[ -z "${CI_PROJECT_DIR}" ] && #{spack} mirror add --scope site "aws-pcluster" "https://binaries.spack.io/develop/aws-pcluster-$(spack arch -t | sed -e 's?_avx512??1')" || true
#{spack} buildcache keys --install --trust
SPACK
end
end
action :configure do
return if on_docker?
case node['cluster']['node_type']
when 'HeadNode'
# Find libfabric version to be used in package configs
libfabric_version = nil
::File.open(libfabric_path).each do |line|
if line.include?('Version:')
libfabric_version = line.split[1].strip
break
end
end
spack = "#{new_resource.spack_root}/bin/spack"
spack_configs_dir = "#{new_resource.spack_root}/etc/spack"
arch_target = `#{spack} arch -t`.strip
Chef::Log.info "The processor family is #{arch_target}"
# Pull architecture dependent package config
template "#{spack_configs_dir}/packages.yaml" do
cookbook 'aws-parallelcluster-environment'
source "spack/packages-#{arch_target}.yaml.erb"
owner 'root'
group 'root'
variables(libfabric_version: libfabric_version)
only_if { run_context.has_template_in_cookbook?('aws-parallelcluster-environment', "spack/packages-#{arch_target}.yaml.erb") && spack_installed? }
end
node.default['cluster']['libfabric_version'] = libfabric_version
node_attributes 'dump node attributes'
end
end
action_class do
def spack_installed?
::Dir.exist?(new_resource.spack_root)
end
end