cookbooks/aws-parallelcluster-environment/spec/unit/resources/manage_ebs_spec.rb (251 lines of code) (raw):
require 'spec_helper'
class ConvergeManageEbs
def self.mount(chef_run, shared_dirs:, volumes:)
chef_run.converge_dsl do
manage_ebs 'mount' do
shared_dir_array shared_dirs
vol_array volumes
action :mount
end
end
end
def self.unmount(chef_run, shared_dirs:, volumes:)
chef_run.converge_dsl do
manage_ebs 'unmount' do
shared_dir_array shared_dirs
vol_array volumes
action :unmount
end
end
end
def self.export(chef_run, shared_dirs:)
chef_run.converge_dsl do
manage_ebs 'export' do
shared_dir_array shared_dirs
action :export
end
end
end
def self.unexport(chef_run, shared_dirs:)
chef_run.converge_dsl do
manage_ebs 'unexport' do
shared_dir_array shared_dirs
action :unexport
end
end
end
def self.nothing(chef_run)
chef_run.converge_dsl do
manage_ebs 'nothing' do
action :nothing
end
end
end
end
describe 'manage_ebs:get_uuid' do
cached(:chef_run) do
ChefSpec::SoloRunner.new.converge_dsl do
manage_ebs 'nothing' do
action :nothing
end
end
end
cached(:resource) { chef_run.find_resource('manage_ebs', 'nothing') }
let(:shellout) { double(run_command: nil, error!: nil, stdout: '', stderr: '', exitstatus: 0, live_stream: '') }
cached(:device) { 'test_device' }
cached(:expected_uuid) { 'test_uuid' }
before do
allow(resource).to receive_shell_out("blkid -c /dev/null #{device}").and_return(shellout)
end
it 'parses output and returns UUID' do
allow(shellout).to receive(:stdout).and_return(" UUID=\"#{expected_uuid}\" ")
expect(resource.get_uuid(device)).to eq(expected_uuid)
end
it 'returns nil if no match is found' do
allow(shellout).to receive(:stdout).and_return(" unexpected result ")
expect(resource.get_uuid(device)).to be(nil)
end
end
describe 'manage_ebs:get_pt_type' do
cached(:chef_run) do
ChefSpec::SoloRunner.new.converge_dsl do
manage_ebs 'nothing' do
action :nothing
end
end
end
cached(:resource) { chef_run.find_resource('manage_ebs', 'nothing') }
let(:shellout) { double(run_command: nil, error!: nil, stdout: '', stderr: '', exitstatus: 0, live_stream: '') }
cached(:device) { 'test_device' }
cached(:expected_pt_type) { 'test_pt_type' }
before do
allow(resource).to receive_shell_out("blkid -c /dev/null #{device}").and_return(shellout)
end
it 'parses output and returns pt type' do
allow(shellout).to receive(:stdout).and_return(" PTTYPE=\"#{expected_pt_type}\" ")
expect(resource.get_pt_type(device)).to eq(expected_pt_type)
end
it 'returns nil if no match is found' do
allow(shellout).to receive(:stdout).and_return(" unexpected result ")
expect(resource.get_pt_type(device)).to be(nil)
end
end
describe 'manage_ebs:get_fs_type' do
cached(:chef_run) do
ChefSpec::SoloRunner.new.converge_dsl do
manage_ebs 'nothing' do
action :nothing
end
end
end
cached(:resource) { chef_run.find_resource('manage_ebs', 'nothing') }
let(:shellout) { double(run_command: nil, error!: nil, stdout: '', stderr: '', exitstatus: 0, live_stream: '') }
cached(:device) { 'test_device' }
cached(:expected_fs_type) { 'test_fs_type' }
before do
allow(resource).to receive_shell_out("blkid -c /dev/null #{device}").and_return(shellout)
end
it 'parses output and returns fs type' do
allow(shellout).to receive(:stdout).and_return(" TYPE=\"#{expected_fs_type}\" ")
expect(resource.get_fs_type(device)).to eq(expected_fs_type)
end
#
# it 'returns nil if no match is found' do
# allow(shellout).to receive(:stdout).and_return(" unexpected result ")
# expect(resource.get_fs_type(device)).to be(nil)
# end
end
describe 'manage_ebs:get_1st_partition' do
cached(:chef_run) do
ChefSpec::SoloRunner.new.converge_dsl do
manage_ebs 'nothing' do
action :nothing
end
end
end
cached(:resource) { chef_run.find_resource('manage_ebs', 'nothing') }
let(:shellout) { double(run_command: nil, error!: nil, stdout: 'aaa', stderr: '', exitstatus: 0, live_stream: '') }
cached(:device) { 'test_device' }
cached(:result) { 'test_result' }
before do
allow(resource).to receive_shell_out("lsblk -ln -o Name #{device}|awk 'NR==2'").and_return(shellout)
end
it 'returns first partition' do
allow(shellout).to receive(:stdout).and_return(result)
expect(resource.get_1st_partition(device)).to eq("/dev/#{result}")
end
end
describe 'manage_ebs:mount' do
for_all_oses do |platform, version|
context "on #{platform}#{version}" do
cached(:venv_path) { 'venv_path' }
cached(:volume_fs_type) { 'test_volume_fs_type' }
cached(:chef_run) do
runner = runner(platform: platform, version: version, step_into: %w(manage_ebs volume)) do |node|
node.override['cluster']['volume_fs_type'] = volume_fs_type
end
ConvergeManageEbs.mount(runner, shared_dirs: %w(ebs_shared_dir_0 ebs_shared_dir_1), volumes: %w(vol-0 vol-1))
end
before do
stub_command("mount | grep ' /ebs_shared_dir_0 '").and_return(true)
stub_command("mount | grep ' /ebs_shared_dir_1 '").and_return(false)
allow_any_instance_of(Object).to receive(:cookbook_virtualenv_path).and_return(venv_path)
stubs_for_resource('manage_ebs') do |res|
allow(res).to receive(:lazy_uuid).with('/dev/disk/by-ebs-volumeid/vol-0').and_return('uuid-0')
allow(res).to receive(:lazy_uuid).with('/dev/disk/by-ebs-volumeid/vol-1').and_return('uuid-1')
end
end
it 'mounts manage_ebs' do
is_expected.to mount_manage_ebs('mount')
end
it "attaches volumes" do
is_expected.to attach_volume('attach volume 0').with_volume_id('vol-0')
is_expected.to attach_volume('attach volume 1').with_volume_id('vol-1')
end
it "mounts volumes" do
is_expected.to mount_volume('mount volume 0').with(
shared_dir: 'ebs_shared_dir_0',
device: 'uuid-0',
fstype: volume_fs_type,
device_type: :uuid,
options: "_netdev",
retries: 10,
retry_delay: 6
)
is_expected.to mount_volume('mount volume 1').with(
shared_dir: 'ebs_shared_dir_1',
device: 'uuid-1',
fstype: volume_fs_type,
device_type: :uuid,
options: "_netdev",
retries: 10,
retry_delay: 6
)
end
end
end
end
describe 'manage_ebs:unmount' do
for_all_oses do |platform, version|
context "on #{platform}#{version}" do
cached(:venv_path) { 'venv' }
cached(:chef_run) do
runner = runner(platform: platform, version: version, step_into: ['manage_ebs'])
allow_any_instance_of(Object).to receive(:cookbook_virtualenv_path).and_return(venv_path)
ConvergeManageEbs.unmount(runner, shared_dirs: %w(ebs_shared_dir_0 ebs_shared_dir_1), volumes: %w(vol-0 vol-1))
end
before do
stub_command("mount | grep ' /ebs_shared_dir_0 '").and_return(true)
stub_command("mount | grep ' /ebs_shared_dir_1 '").and_return(false)
allow_any_instance_of(Object).to receive(:cookbook_virtualenv_path).and_return(venv_path)
stubs_for_resource('manage_ebs') do |res|
allow(res).to receive(:lazy_uuid).with('/dev/disk/by-ebs-volumeid/vol-0').and_return('uuid-0')
allow(res).to receive(:lazy_uuid).with('/dev/disk/by-ebs-volumeid/vol-1').and_return('uuid-1')
end
end
it "unmounts volumes" do
is_expected.to unmount_volume('unmount volume 0').with_shared_dir('ebs_shared_dir_0')
is_expected.to unmount_volume('unmount volume 1').with_shared_dir('ebs_shared_dir_1')
end
it "detached volumes" do
is_expected.to detach_volume('detach volume 0').with_volume_id('vol-0')
is_expected.to detach_volume('detach volume 1').with_volume_id('vol-1')
end
end
end
end
describe 'manage_ebs:export' do
for_all_oses do |platform, version|
context "on #{platform}#{version}" do
cached(:cidr_list) { 'cidr_list' }
cached(:chef_run) do
runner = runner(platform: platform, version: version, step_into: ['manage_ebs'])
ConvergeManageEbs.export(runner, shared_dirs: %w(ebs_shared_dir_0 ebs_shared_dir_1))
end
before do
allow_any_instance_of(Object).to receive(:get_vpc_cidr_list).and_return(cidr_list)
end
it "exports volumes" do
is_expected.to export_volume('export volume ebs_shared_dir_0').with(
shared_dir: 'ebs_shared_dir_0'
)
is_expected.to export_volume('export volume ebs_shared_dir_1').with(
shared_dir: 'ebs_shared_dir_1'
)
end
end
end
end
describe 'manage_ebs:unexport' do
for_all_oses do |platform, version|
context "on #{platform}#{version}" do
cached(:chef_run) do
runner = runner(platform: platform, version: version, step_into: %w(manage_ebs volume))
ConvergeManageEbs.unexport(runner, shared_dirs: %w(ebs_shared_dir_0 ebs_shared_dir_1))
end
it "unexports volumes" do
is_expected.to unexport_volume('unexport volume ebs_shared_dir_0').with(
shared_dir: 'ebs_shared_dir_0'
)
is_expected.to unexport_volume('unexport volume ebs_shared_dir_1').with(
shared_dir: 'ebs_shared_dir_1'
)
end
end
end
end