From 456c96d3727ceb1acf28e2c3cb66fdca19c477a5 Mon Sep 17 00:00:00 2001 From: Dakota Schneider Date: Thu, 21 Jun 2018 13:11:45 -0700 Subject: [PATCH] (BKR-1481) Rewrite beaker-vmpooler to use shared .fog parsing --- lib/beaker/hypervisor/vmpooler.rb | 26 ++++-------- spec/beaker/hypervisor/vmpooler_spec.rb | 55 +++++++++---------------- 2 files changed, 27 insertions(+), 54 deletions(-) diff --git a/lib/beaker/hypervisor/vmpooler.rb b/lib/beaker/hypervisor/vmpooler.rb index db63f7f..7b5c025 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 = parse_fog_file(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..0ed0b2e 100644 --- a/spec/beaker/hypervisor/vmpooler_spec.rb +++ b/spec/beaker/hypervisor/vmpooler_spec.rb @@ -169,16 +169,15 @@ 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) + expect( File ).to receive( :exist? ) { false } 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) + expect( File ).to receive( :exist? ) { true } + expect( File ).to receive( :open ) { "" } vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) expect( vmpooler.credentials ).to be == {} @@ -187,8 +186,8 @@ module Beaker 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) + expect( File ).to receive( :exist? ) { true } + expect( YAML ).to receive( :load_file ) { data } vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) expect( vmpooler.credentials ).to be == { } @@ -197,8 +196,8 @@ module Beaker 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) + expect( File ).to receive( :exist? ) { true } + expect( YAML ).to receive( :load_file ) { data } vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) expect( vmpooler.credentials ).to be == { } @@ -207,42 +206,28 @@ module Beaker 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) + expect( File ).to receive( :exist? ) { true } + expect( YAML ).to receive( :load_file ) { data } - logger = double('logger') + logger = double( 'logger' ) - expect(logger).to receive(:warn).with(/is missing a :default section with a :vmpooler_token value/) - make_opts = {:logger => logger} + expect( logger ).to receive( :warn ).with( /is missing the required section: `default`/ ) + 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 - + it '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) ) + expect( File ).to receive( :exist? ) { true } + allow( File ).to receive( :open ).and_yield( StringIO.new( data ) ) - logger = double('logger') + logger = double( 'logger' ) - expect(logger).to receive(:warn).with(/Psych::SyntaxError: .* invalid syntax/) - make_opts = {:logger => logger} + expect( logger ).to receive( :warn ).with( /Psych::SyntaxError/ ) + make_opts = { :logger => logger } vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) @@ -252,8 +237,8 @@ module Beaker 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) + expect( File ).to receive( :exist? ) { true } + expect( YAML ).to receive( :load_file ) { data } vmpooler = Beaker::Vmpooler.new( make_hosts, make_opts ) expect( vmpooler.credentials ).to be == { :vmpooler_token => "TOKEN" }