From a02871bc7391a5c1067910b5e1014cd985f912ca Mon Sep 17 00:00:00 2001 From: Tomas Coufal Date: Tue, 7 Nov 2017 08:20:41 +0100 Subject: [PATCH] Fix exception handing for credential validation on raw_connect --- .../providers/microsoft/infra_manager.rb | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/app/models/manageiq/providers/microsoft/infra_manager.rb b/app/models/manageiq/providers/microsoft/infra_manager.rb index b683f5f..dc961a2 100644 --- a/app/models/manageiq/providers/microsoft/infra_manager.rb +++ b/app/models/manageiq/providers/microsoft/infra_manager.rb @@ -30,7 +30,9 @@ def self.raw_connect(connect_params, validate = false) connect = WinRM::Connection.new(connect_params) return connect unless validate - connect.shell(:powershell).run('hostname') + connection_rescue_block do + connect.shell(:powershell).run('hostname') + end end def self.auth_url(hostname, port = nil) @@ -56,8 +58,21 @@ def self.build_connect_params(options) connect_params end + def self.connection_rescue_block(realm = nil) + require 'winrm' + require 'gssapi' # A winrm dependency + yield + rescue WinRM::WinRMHTTPTransportError => e # Error 401 + raise MiqException::MiqHostError, "Check credentials and WinRM configuration settings. " \ + "Remote error message: #{e.message}" + rescue GSSAPI::GssApiError + raise MiqException::MiqHostError, "Unable to reach any KDC in realm #{realm}" + rescue => e + raise MiqException::MiqHostError, "Unable to connect: #{e.message}" + end + def connect(options = {}) - raise "no credentials defined" if self.missing_credentials?(options[:auth_type]) + raise "no credentials defined" if missing_credentials?(options[:auth_type]) hostname = options[:hostname] || self.hostname options[:endpoint] = self.class.auth_url(hostname, port) @@ -71,20 +86,10 @@ def connect(options = {}) end def verify_credentials(_auth_type = nil, options = {}) - require 'winrm' - require 'gssapi' # A winrm dependency - - raise MiqException::MiqHostError, "No credentials defined" if self.missing_credentials?(options[:auth_type]) + raise MiqException::MiqHostError, "No credentials defined" if missing_credentials?(options[:auth_type]) - begin + self.class.connection_rescue_block do run_dos_command("hostname") - rescue WinRM::WinRMHTTPTransportError => e # Error 401 - raise MiqException::MiqHostError, "Check credentials and WinRM configuration settings. " \ - "Remote error message: #{e.message}" - rescue GSSAPI::GssApiError - raise MiqException::MiqHostError, "Unable to reach any KDC in realm #{realm}" - rescue => e - raise MiqException::MiqHostError, "Unable to connect: #{e.message}" end true