cookbooks/aws-parallelcluster-environment/spec/unit/recipes/cfn_bootstrap_spec.rb (100 lines of code) (raw):

require 'spec_helper' describe 'aws-parallelcluster-environment::cfn_bootstrap' do for_all_oses do |platform, version| context "on #{platform}#{version}" do cached(:cfnbootstrap_version) { '2.0-33' } cached(:cfnbootstrap_package) { "aws-cfn-bootstrap-py3-#{cfnbootstrap_version}.tar.gz" } cached(:python_version) { "#{node['cluster']['python-version']}" } cached(:system_pyenv_root) { 'system_pyenv_root' } cached(:virtualenv_path) { "system_pyenv_root/versions/#{python_version}/envs/cfn_bootstrap_virtualenv" } cached(:timeout) { 1800 } context "when cfn_bootstrap virtualenv not installed yet" do cached(:chef_run) do runner = runner(platform: platform, version: version) do |node| node.override['cluster']['system_pyenv_root'] = system_pyenv_root node.override['cluster']['region'] = 'non_china' node.override['cluster']['compute_node_bootstrap_timeout'] = timeout end runner.converge(described_recipe) end cached(:node) { chef_run.node } it 'installs pyenv for specific python version' do is_expected.to run_install_pyenv('pyenv for cfn_bootstrap').with_python_version(python_version) end it 'activates cookbook vistualenv' do is_expected.to run_activate_virtual_env('cfn_bootstrap_virtualenv').with( pyenv_path: virtualenv_path, python_version: python_version ) end it 'sets virtualenv path' do expect(node.default['cluster']['cfn_bootstrap_virtualenv_path']).to eq(virtualenv_path) is_expected.to write_node_attributes('dump node attributes') end it 'downloads cfn_bootstrap package from s3' do is_expected.to create_remote_file("/tmp/#{cfnbootstrap_package}").with( source: "https://s3.amazonaws.com/cloudformation-examples/#{cfnbootstrap_package}" ) end it 'installs package in cfn_bootstrap virtualenv' do is_expected.to run_bash("Install CloudFormation helpers from #{cfnbootstrap_package}").with( user: 'root', group: 'root', cwd: '/tmp', code: "#{virtualenv_path}/bin/pip install #{cfnbootstrap_package}", creates: "#{virtualenv_path}/bin/cfn-hup" ) end it 'adds cfn_bootstrap virtualenv to a cookbook profile' do is_expected.to create_template("#{node['cluster']['etc_dir']}/pcluster_cookbook_environment.sh").with( source: "cfn_bootstrap/pcluster_cookbook_environment.sh.erb", owner: 'root', group: 'root', mode: '0644', variables: { cfn_bootstrap_virtualenv_path: virtualenv_path } ) end it 'creates scripts_dir if not yet existing' do is_expected.to create_directory(node['cluster']['scripts_dir']).with_recursive(true) end it 'adds cfn-hup runner' do is_expected.to create_template("#{node['cluster']['scripts_dir']}/cfn-hup-runner.sh").with( source: "cfn_hup_configuration/cfn-hup-runner.sh.erb", owner: 'root', group: 'root', mode: '0744', variables: { cfn_bootstrap_virtualenv_path: virtualenv_path, node_bootstrap_timeout: timeout } ) end end context "when cfn_bootstrap virtualenv already installed" do cached(:chef_run) do runner = runner(platform: platform, version: version) do |node| node.override['cluster']['system_pyenv_root'] = system_pyenv_root node.override['cluster']['python-version'] = python_version end allow(File).to receive(:exist?).with("#{virtualenv_path}/bin/activate").and_return(true) runner.converge(described_recipe) end it 'does not activate cfn_bootstrap virtualenv' do is_expected.not_to run_activate_virtual_env('cfn_bootstrap_virtualenv') end end context "when run in China" do cached(:chef_run) do runner = runner(platform: platform, version: version) do |node| node.override['cluster']['system_pyenv_root'] = system_pyenv_root node.override['cluster']['python-version'] = python_version node.override['cluster']['region'] = 'cn-something' end runner.converge(described_recipe) end it 'downloads cfn_bootstrap package from a different s3 bucket' do is_expected.to create_remote_file("/tmp/#{cfnbootstrap_package}").with( source: "https://s3.cn-north-1.amazonaws.com.cn/cn-north-1-aws-parallelcluster/cloudformation-examples/#{cfnbootstrap_package}" ) end end end end end