From c0938fe1c83c62cafe8ff3782b5e328c2aecb103 Mon Sep 17 00:00:00 2001 From: Dakota Schneider Date: Mon, 16 Jul 2018 13:09:51 -0700 Subject: [PATCH] (BKR-1481) Rewrite beaker-vmpooler to use shared .fog parsing (#11) * (BKR-1481) Rewrite beaker-vmpooler to use shared .fog parsing * (BKR-1481) Rename Fog Credential Method * (BKR-1481) Cleanup spec tests Spec tests don't need to replicate spec tests of core functionality. --- lib/beaker/hypervisor/vmpooler.rb | 26 ++---- spec/beaker/hypervisor/vmpooler_spec.rb | 105 ++++++------------------ 2 files changed, 31 insertions(+), 100 deletions(-) diff --git a/lib/beaker/hypervisor/vmpooler.rb b/lib/beaker/hypervisor/vmpooler.rb index db63f7f..d5857f6 100644 --- a/lib/beaker/hypervisor/vmpooler.rb +++ b/lib/beaker/hypervisor/vmpooler.rb @@ -27,29 +27,17 @@ module Beaker def load_credentials(dot_fog = '.fog') creds = {} - - if fog = read_fog_file(dot_fog) - if fog[:default] && fog[:default][:vmpooler_token] - creds[:vmpooler_token] = fog[:default][:vmpooler_token] + begin + fog = get_fog_credentials(dot_fog) + if fog[:vmpooler_token] + creds[:vmpooler_token] = fog[:vmpooler_token] else - @logger.warn "Credentials file (#{dot_fog}) is missing a :default section with a :vmpooler_token value; proceeding without authentication" + @logger.warn "vmpooler_token not found in credentials file (#{dot_fog})\nProceeding without authentication" end - else - @logger.warn "Credentials file (#{dot_fog}) is empty; proceeding without authentication" + rescue ArgumentError => e + @logger.warn "Invalid credentials file:\n(#{e.class}) #{e.message}\nProceeding without authentication" end - creds - - rescue TypeError, Psych::SyntaxError => e - @logger.warn "#{e.class}: Credentials file (#{dot_fog}) has invalid syntax; proceeding without authentication" - creds - rescue Errno::ENOENT - @logger.warn "Credentials file (#{dot_fog}) not found; proceeding without authentication" - creds - end - - def read_fog_file(dot_fog = '.fog') - YAML.load_file(dot_fog) end def connection_preference(host) diff --git a/spec/beaker/hypervisor/vmpooler_spec.rb b/spec/beaker/hypervisor/vmpooler_spec.rb index 6e15662..a0495eb 100644 --- a/spec/beaker/hypervisor/vmpooler_spec.rb +++ b/spec/beaker/hypervisor/vmpooler_spec.rb @@ -168,96 +168,39 @@ module Beaker describe "#load_credentials" do - it 'continues without credentials when fog file is missing' do - allow_any_instance_of( Beaker::Vmpooler ).to \ - receive(:read_fog_file).and_raise(Errno::ENOENT.new) + it 'loads credentials from a fog file' do + credentials = { :vmpooler_token => "example_token" } + make_opts = { :dot_fog => '.fog' } + + expect_any_instance_of( Beaker::Vmpooler ).to receive( :get_fog_credentials ).and_return(credentials) vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) + expect( vmpooler.credentials ).to be == credentials + end + + it 'continues without credentials when there are problems loading the fog file' do + logger = double( 'logger' ) + make_opts = { :logger => logger, :dot_fog => '.fog' } + + expect_any_instance_of( Beaker::Vmpooler ).to receive( :get_fog_credentials ).and_raise( ArgumentError, 'something went wrong' ) + expect( logger ).to receive( :warn ).with( /Invalid credentials file.*something went wrong.*Proceeding without authentication/m ) + + vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) + expect( vmpooler.credentials ).to be == {} end - it 'continues without credentials when fog file is empty' do - allow_any_instance_of( Beaker::Vmpooler ).to \ - receive(:read_fog_file).and_return(false) + it 'continues without credentials when fog file has no vmpooler_token' do + logger = double( 'logger' ) + make_opts = { :logger => logger, :dot_fog => '.fog' } + + expect_any_instance_of( Beaker::Vmpooler ).to receive( :get_fog_credentials ).and_return( {} ) + expect( logger ).to receive( :warn ).with( /vmpooler_token not found in credentials file.*Proceeding without authentication/m ) vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) + expect( vmpooler.credentials ).to be == {} end - - it 'continues without credentials when fog file contains no :default section' do - data = { :some => { :other => :data } } - - allow_any_instance_of( Beaker::Vmpooler ).to \ - receive(:read_fog_file).and_return(data) - - vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) - expect( vmpooler.credentials ).to be == { } - end - - it 'continues without credentials when fog file :default section has no :vmpooler_token' do - data = { :default => { :something_else => "TOKEN" } } - - allow_any_instance_of( Beaker::Vmpooler ).to \ - receive(:read_fog_file).and_return(data) - - vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) - expect( vmpooler.credentials ).to be == { } - end - - it 'continues without credentials when there are formatting errors in the fog file' do - data = { "'default'" => { :vmpooler_token => "b2wl8prqe6ddoii70md" } } - - allow_any_instance_of( Beaker::Vmpooler ).to \ - receive(:read_fog_file).and_return(data) - - logger = double('logger') - - expect(logger).to receive(:warn).with(/is missing a :default section with a :vmpooler_token value/) - make_opts = {:logger => logger} - - vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) - expect( vmpooler.credentials ).to be == { } - end - - it 'throws a TypeError and continues without credentials when there are syntax errors in the fog file' do - data = "'default'\n :vmpooler_token: z2wl8prqe0ddoii70ad" - - allow( File ).to receive( :open ).and_yield( StringIO.new(data) ) - logger = double('logger') - - expect(logger).to receive(:warn).with(/TypeError: .* has invalid syntax/) - make_opts = {:logger => logger} - - vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) - - expect( vmpooler.credentials ).to be == { } - end - - it 'throws a Psych::SyntaxError and continues without credentials when there are syntax errors in the fog file' do - - data = ";default;\n :vmpooler_token: z2wl8prqe0ddoii707d" - - allow( File ).to receive( :open ).and_yield( StringIO.new(data) ) - - logger = double('logger') - - expect(logger).to receive(:warn).with(/Psych::SyntaxError: .* invalid syntax/) - make_opts = {:logger => logger} - - vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) - - expect( vmpooler.credentials ).to be == { } - end - - it 'stores vmpooler token when found in fog file' do - data = { :default => { :vmpooler_token => "TOKEN" } } - - allow_any_instance_of( Beaker::Vmpooler ).to \ - receive(:read_fog_file).and_return(data) - - vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) - expect( vmpooler.credentials ).to be == { :vmpooler_token => "TOKEN" } - end end end end