From 8da1deaf6be12fac061f883cc1c5dc488a227946 Mon Sep 17 00:00:00 2001 From: Brian Cain Date: Sat, 24 Sep 2016 11:11:14 -0700 Subject: [PATCH] (#33) Handle Auth class errors This commit updates the Auth class to properly raise an error when something goes wrong. It also updates the vmpooler command class to handle when those errors get raised. --- lib/vmfloaty.rb | 88 ++++++++++++++++++++++---------------- lib/vmfloaty/auth.rb | 12 ++---- lib/vmfloaty/errors.rb | 6 +++ spec/vmfloaty/auth_spec.rb | 24 +++++++++++ 4 files changed, 85 insertions(+), 45 deletions(-) diff --git a/lib/vmfloaty.rb b/lib/vmfloaty.rb index 41e5d37..b5ef327 100644 --- a/lib/vmfloaty.rb +++ b/lib/vmfloaty.rb @@ -55,11 +55,15 @@ class Vmfloaty raise "You did not provide a user to authenticate to vmpooler with" end pass = password "Enter your password please:", '*' - token = Auth.get_token(verbose, url, user, pass) - unless token.nil? - puts "\nToken retrieved!" - puts token + begin + token = Auth.get_token(verbose, url, user, pass) + rescue => e + STDERR.puts e + exit 1 end + + puts "\nToken retrieved!" + puts token end response = Pooler.retrieve(verbose, os_types, token, url) @@ -91,16 +95,18 @@ class Vmfloaty if active # list active vms - status = Auth.token_status(verbose, url, token) - unless status.nil? - # print vms - vms = status[token]['vms'] - if vms.nil? - STDERR.puts "You have no running vms" - exit 0 - end - else - STDERR.puts "Could not retrieve active vms" + begin + status = Auth.token_status(verbose, url, token) + rescue => e + STDERR.puts e + exit 1 + end + + # print vms + vms = status[token]['vms'] + if vms.nil? + STDERR.puts "You have no running vms" + exit 0 end running_vms = vms['running'] @@ -199,10 +205,10 @@ class Vmfloaty if delete_all # get vms with token - status = Auth.token_status(verbose, url, token) - - if status.nil? - STDERR.puts "Could not retrieve status with token" + begin + status = Auth.token_status(verbose, url, token) + rescue => e + STDERR.puts e exit 1 end @@ -348,27 +354,33 @@ class Vmfloaty case action when "get" pass = password "Enter your password please:", '*' - token = Auth.get_token(verbose, url, user, pass) - unless token.nil? - puts token - else - STDERR.puts 'Could not make a request for a token' + begin + token = Auth.get_token(verbose, url, user, pass) + rescue => e + STDERR.puts e + exit 1 end + puts token + exit 0 when "delete" pass = password "Enter your password please:", '*' - result = Auth.delete_token(verbose, url, user, pass, token) - unless result.nil? - puts result - else - STDERR.puts 'Could not make a request to delete a token' + begin + result = Auth.delete_token(verbose, url, user, pass, token) + rescue => e + STDERR.puts e + exit 1 end + puts result + exit 1 when "status" - status = Auth.token_status(verbose, url, token) - unless status.nil? - puts status - else - STDERR.puts 'Could not make a request to get token status' + begin + status = Auth.token_status(verbose, url, token) + rescue => e + STDERR.puts e + exit 1 end + puts status + exit 0 when nil STDERR.puts "No action provided" else @@ -407,12 +419,14 @@ class Vmfloaty raise "You did not provide a user to authenticate to vmpooler with" end pass = password "Enter your password please:", '*' - token = Auth.get_token(verbose, url, user, pass) - unless token.nil? + begin + token = Auth.get_token(verbose, url, user, pass) + rescue => e + STDERR.puts e + STDERR.puts 'Could not get token...requesting vm without a token anyway...' + else puts "\nToken retrieved!" puts token - else - STDERR.puts 'Could not get token...requesting vm without a token anyway...' end end diff --git a/lib/vmfloaty/auth.rb b/lib/vmfloaty/auth.rb index 9ca9d4e..2afc170 100644 --- a/lib/vmfloaty/auth.rb +++ b/lib/vmfloaty/auth.rb @@ -1,6 +1,7 @@ require 'faraday' require 'json' require 'vmfloaty/http' +require 'vmfloaty/errors' class Auth def self.get_token(verbose, url, user, password) @@ -12,15 +13,13 @@ class Auth if res_body["ok"] return res_body["token"] else - STDERR.puts "There was a problem with your request:\n#{res_body}" - return nil + raise TokenError, "HTTP #{resp.status}: There was a problem requesting a token:\n#{res_body}" end end def self.delete_token(verbose, url, user, password, token) if token.nil? STDERR.puts 'You did not provide a token' - return nil end conn = Http.get_conn_with_auth(verbose, url, user, password) @@ -30,15 +29,13 @@ class Auth if res_body["ok"] return res_body else - STDERR.puts "There was a problem with your request:\n#{res_body}" - return nil + raise TokenError, "HTTP #{response.status}: There was a problem deleting a token:\n#{res_body}" end end def self.token_status(verbose, url, token) if token.nil? STDERR.puts 'You did not provide a token' - return nil end conn = Http.get_conn(verbose, url) @@ -49,8 +46,7 @@ class Auth if res_body["ok"] return res_body else - STDERR.puts "There was a problem with your request:\n#{res_body}" - return nil + raise TokenError, "HTTP #{response.status}: There was a problem getting the status of a token:\n#{res_body}" end end end diff --git a/lib/vmfloaty/errors.rb b/lib/vmfloaty/errors.rb index b92211d..03e7861 100644 --- a/lib/vmfloaty/errors.rb +++ b/lib/vmfloaty/errors.rb @@ -3,3 +3,9 @@ class AuthError < StandardError super end end + +class TokenError < StandardError + def initialize(msg="Could not do operation with token provided") + super + end +end diff --git a/spec/vmfloaty/auth_spec.rb b/spec/vmfloaty/auth_spec.rb index 7cef87a..c6e1d98 100644 --- a/spec/vmfloaty/auth_spec.rb +++ b/spec/vmfloaty/auth_spec.rb @@ -20,6 +20,14 @@ describe Pooler do token = Auth.get_token(false, @vmpooler_url, "first.last", "password") expect(token).to eq @token end + + it "raises a token error if something goes wrong" do + stub_request(:post, "https://first.last:password@vmpooler.example.com/token"). + with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'Content-Length'=>'0', 'User-Agent'=>'Faraday v0.9.2'}). + to_return(:status => 500, :body => "{\"ok\":false}", :headers => {}) + + expect{ Auth.get_token(false, @vmpooler_url, "first.last", "password") }.to raise_error(TokenError) + end end describe "#delete_token" do @@ -35,6 +43,14 @@ describe Pooler do expect(Auth.delete_token(false, @vmpooler_url, "first.last", "password", @token)).to eq JSON.parse(@delete_token_response) end + + it "raises a token error if something goes wrong" do + stub_request(:delete, "https://first.last:password@vmpooler.example.com/token/utpg2i2xswor6h8ttjhu3d47z53yy47y"). + with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Faraday v0.9.2'}). + to_return(:status => 500, :body => "{\"ok\":false}", :headers => {}) + + expect{ Auth.delete_token(false, @vmpooler_url, "first.last", "password", @token) }.to raise_error(TokenError) + end end describe "#token_status" do @@ -50,5 +66,13 @@ describe Pooler do expect(Auth.token_status(false, @vmpooler_url, @token)).to eq JSON.parse(@token_status_response) end + + it "raises a token error if something goes wrong" do + stub_request(:get, "#{@vmpooler_url}/token/utpg2i2xswor6h8ttjhu3d47z53yy47y"). + with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3', 'User-Agent'=>'Faraday v0.9.2'}). + to_return(:status => 500, :body => "{\"ok\":false}", :headers => {}) + + expect{ Auth.token_status(false, @vmpooler_url, @token) }.to raise_error(TokenError) + end end end