cookbooks/aws-parallelcluster-platform/spec/unit/resources/fetch_config_spec.rb (150 lines of code) (raw):
require 'spec_helper'
describe 'fetch_config:run' do
context "when running a HeadNode from kitchen" do
cached(:cluster_shared_dir) { '/cluster_shared_dir' }
cached(:cluster_shared_dir_login_nodes) { '/shared_dir_login_nodes' }
cached(:cluster_config_path) { 'cluster_config_path' }
cached(:previous_cluster_config_path) { 'previous_cluster_config_path' }
cached(:cluster_config_version) { 'cluster_config_version' }
cached(:instance_types_data_path) { 'instance_types_data_path' }
cached(:previous_instance_types_data_path) { 'previous_instance_types_data_path' }
cached(:chef_run) do
runner = ChefSpec::Runner.new(
platform: 'ubuntu', step_into: %w(fetch_config)
) do |node|
node.override['kitchen'] = true
node.override['cluster']['shared_dir'] = cluster_shared_dir
node.override['cluster']['shared_dir_login_nodes'] = cluster_shared_dir_login_nodes
node.override['cluster']['cluster_config_path'] = cluster_config_path
node.override['cluster']['previous_cluster_config_path'] = previous_cluster_config_path
node.override['cluster']['cluster_config_version'] = cluster_config_version
node.override['cluster']['instance_types_data_path'] = instance_types_data_path
node.override['cluster']['previous_instance_types_data_path'] = previous_instance_types_data_path
node.override['cluster']['node_type'] = 'HeadNode'
end
runner.converge_dsl do
fetch_config 'run' do
action :run
end
end
end
it "copies data from kitchen data dir" do
is_expected.to create_remote_file("copy fake cluster config")
.with(path: cluster_config_path)
.with(source: "file://#{kitchen_cluster_config_path}")
is_expected.to create_remote_file("copy fake instance type data")
.with(path: instance_types_data_path)
.with(source: "file://#{kitchen_instance_types_data_path}")
end
it "writes the cluster config version file for compute nodes" do
is_expected.to create_file("/cluster_shared_dir/cluster-config-version").with(
content: cluster_config_version,
mode: '0644',
owner: 'root',
group: 'root'
)
end
it "writes the cluster config version file for login nodes" do
is_expected.to create_file("/shared_dir_login_nodes/cluster-config-version").with(
content: cluster_config_version,
mode: '0644',
owner: 'root',
group: 'root'
)
end
it "does not wait for cluster config version file" do
is_expected.not_to run_execute("Wait cluster config files to be updated by the head node")
end
end
%w(ComputeFleet LoginNode).each do |node_type|
context "when running a #{node_type} from kitchen on create" do
cached(:cluster_config_path) { 'cluster_config_path' }
cached(:login_cluster_config_path) { 'login_cluster_config_path' }
cached(:previous_cluster_config_path) { 'previous_cluster_config_path' }
cached(:instance_types_data_path) { 'instance_types_data_path' }
cached(:previous_instance_types_data_path) { 'previous_instance_types_data_path' }
cached(:chef_run) do
runner = ChefSpec::Runner.new(
platform: 'ubuntu', step_into: %w(fetch_config)
) do |node|
node.override['kitchen'] = true
node.override['cluster']['cluster_config_path'] = cluster_config_path
node.override['cluster']['login_cluster_config_path'] = login_cluster_config_path
node.override['cluster']['node_type'] = node_type
end
allow(File).to receive(:exist?).with(cluster_config_path).and_return(true)
allow(File).to receive(:exist?).with(login_cluster_config_path).and_return(true)
runner.converge_dsl do
fetch_config 'run' do
action :run
update false
end
end
end
it "does not wait for cluster config version file" do
is_expected.not_to run_execute("Wait cluster config files to be updated by the head node")
end
it "reads config from shared folder" do
is_expected.to run_ruby_block("load cluster configuration")
end
end
end
%w(ComputeFleet LoginNode).each do |node_type|
context "when running a #{node_type} from kitchen on update" do
cached(:cluster_shared_dir) { '/cluster_shared_dir' }
cached(:cluster_shared_dir_login_nodes) { '/shared_dir_login_nodes' }
cached(:cluster_config_path) { 'cluster_config_path' }
cached(:login_cluster_config_path) { 'login_cluster_config_path' }
cached(:previous_cluster_config_path) { 'previous_cluster_config_path' }
cached(:cluster_config_version) { 'cluster_config_version' }
cached(:cluster_shared_storages_mapping_path) { '/cluster_shared_storages_mapping_path' }
cached(:cluster_previous_shared_storages_mapping_path) { '/cluster_previous_shared_storages_mapping_path' }
cached(:instance_types_data_path) { 'instance_types_data_path' }
cached(:previous_instance_types_data_path) { 'previous_instance_types_data_path' }
cached(:chef_run) do
runner = ChefSpec::Runner.new(
platform: 'ubuntu', step_into: %w(fetch_config)
) do |node|
node.override['kitchen'] = true
node.override['cluster']['shared_dir'] = cluster_shared_dir
node.override['cluster']['cluster_config_path'] = cluster_config_path
node.override['cluster']['cluster_config_version'] = cluster_config_version
node.override['cluster']['shared_storages_mapping_path'] = cluster_shared_storages_mapping_path
node.override['cluster']['previous_shared_storages_mapping_path'] = cluster_previous_shared_storages_mapping_path
node.override['cluster']['login_cluster_config_path'] = login_cluster_config_path
node.override['cluster']['shared_dir_login_nodes'] = cluster_shared_dir_login_nodes
node.override['cluster']['node_type'] = node_type
end
allow(File).to receive(:exist?).with(cluster_config_path).and_return(true)
allow(FileUtils).to receive(:cp_r).with(
cluster_shared_storages_mapping_path, cluster_previous_shared_storages_mapping_path, remove_destination: true
).and_return(true)
runner.converge_dsl do
fetch_config 'run' do
action :run
update true
end
end
end
it "waits for cluster config version file" do
config_version_file = case node_type
when "ComputeFleet"
"/cluster_shared_dir/cluster-config-version"
when "LoginNode"
"/shared_dir_login_nodes/cluster-config-version"
else
raise "Unsupported node_type #{node_type}"
end
is_expected.to run_bash("Wait cluster config files to be updated by the head node").with(
code: "[[ \"$(cat #{config_version_file})\" == \"cluster_config_version\" ]] || exit 1",
retries: 30,
retry_delay: 15,
timeout: 5
)
end
it "reads config from shared folder" do
is_expected.to run_ruby_block("load cluster configuration")
end
end
end
end