cookbooks/aws-parallelcluster-shared/spec/unit/resources/install_pyenv_spec.rb (122 lines of code) (raw):
require 'spec_helper'
class ConvergeInstallPyenv
def self.run(chef_run, python_version: nil, pyenv_root: nil, user_only: nil, user: nil)
chef_run.converge_dsl('aws-parallelcluster-shared') do
install_pyenv 'run' do
action :run
python_version python_version if python_version
prefix pyenv_root if pyenv_root
user_only true if user_only
user user if user
end
end
end
end
describe 'install_pyenv:run' do
for_all_oses do |platform, version|
context "on #{platform}#{version}" do
context "when python version and pyenv root are not set but are overridden through node attributes" do
cached(:python_version) { 'overridden_python_version' }
cached(:system_pyenv_root) { 'overridden_pyenv_root' }
cached(:chef_run) do
runner = runner(platform: platform, version: version, step_into: ['install_pyenv']) do |node|
node.override['cluster']['system_pyenv_root'] = system_pyenv_root
node.override['cluster']['python-version'] = python_version
node.override['cluster']['artifacts_s3_url'] = "https://bucket.s3.#{aws_domain}/archives"
end
ConvergeInstallPyenv.run(runner)
end
cached(:node) { chef_run.node }
it 'runs install_pyenv' do
is_expected.to run_install_pyenv('run')
end
it 'creates pyenv root dir' do
is_expected.to create_directory(system_pyenv_root).with_recursive(true)
end
it 'downloads python tarball' do
is_expected.to create_if_missing_remote_file("#{node['cluster']['system_pyenv_root']}/Python-#{python_version}.tgz").with(
source: "#{node['cluster']['artifacts_s3_url']}/dependencies/python/Python-#{python_version}.tgz",
mode: '0644',
retries: 3,
retry_delay: 5
)
end
it 'installs python' do
is_expected.to run_bash("install python #{python_version}").with(
user: 'root',
group: 'root',
cwd: "#{node['cluster']['system_pyenv_root']}"
).with_code(/tar -xzf Python-#{python_version}.tgz/)
.with_code(%r{./configure --prefix=#{node['cluster']['system_pyenv_root']}/versions/#{python_version}})
end
end
context "when python version and pyenv root are set" do
cached(:python_version) { 'python_version_parameter' }
cached(:system_pyenv_root) { 'pyenv_root_parameter' }
cached(:chef_run) do
runner = runner(platform: platform, version: version, step_into: 'install_pyenv') do |node|
node.override['cluster']['system_pyenv_root'] = 'default_system_pyenv_root'
node.override['cluster']['python-version'] = 'default_python_version'
end
ConvergeInstallPyenv.run(runner, python_version: python_version, pyenv_root: system_pyenv_root)
end
cached(:node) { chef_run.node }
it 'creates pyenv root dir' do
is_expected.to create_directory(system_pyenv_root).with_recursive(true)
end
it 'downloads python tarball' do
is_expected.to create_if_missing_remote_file("#{system_pyenv_root}/Python-#{python_version}.tgz").with(
source: "https://www.python.org/ftp/python/#{python_version}/Python-#{python_version}.tgz",
mode: '0644',
retries: 3,
retry_delay: 5
)
end
it 'installs python' do
is_expected.to run_bash("install python #{python_version}").with(
user: 'root',
group: 'root',
cwd: "#{system_pyenv_root}"
)
end
end
context "when it is a user only installation" do
context "and user is not set" do
cached(:chef_run) do
runner(platform: platform, version: version, step_into: ['install_pyenv'])
end
it 'raises exception' do
expect { ConvergeInstallPyenv.run(chef_run, user_only: true) }.to raise_error(RuntimeError, /user property is required for resource install_pyenv when user_only is set to true/)
end
end
context "and user is set" do
cached(:user) { "the_user" }
cached(:pyenv_root) { "pyenv_root" }
cached(:python_version) { 'python_version' }
cached(:chef_run) do
runner = runner(platform: platform, version: version, step_into: ['install_pyenv']) do |node|
node.override['cluster']['python-version'] = python_version
node.override['cluster']['artifacts_s3_url'] = "https://bucket.s3.#{aws_domain}/archives"
end
# ConvergeInstallPyenv.run(runner)
# runner = runner(platform: platform, version: version, step_into: ['install_pyenv'])
ConvergeInstallPyenv.run(runner, user_only: true, user: user, python_version: python_version, pyenv_root: pyenv_root)
end
it 'downloads python tarball' do
is_expected.to create_if_missing_remote_file("#{pyenv_root}/Python-#{python_version}.tgz").with(
source: "https://www.python.org/ftp/python/#{python_version}/Python-#{python_version}.tgz",
mode: '0644',
retries: 3,
retry_delay: 5
)
end
it 'installs python' do
is_expected.to run_bash("install python #{python_version}").with(
user: user,
group: 'root',
cwd: "#{pyenv_root}"
)
end
end
end
end
end
end