From 475e6698ed5456b94927f59112c9c820ede239b2 Mon Sep 17 00:00:00 2001 From: Timur Alperovich Date: Tue, 22 Oct 2013 09:28:25 -0700 Subject: [PATCH] Add a reload() method to the vSphere service. Like other compute services, it would be useful if vSphere also supported reload(). The method should reestablish any session state required for Fog when network errors arise (EPIPE, etc). Fixes: #2307 --- lib/fog/vsphere/compute.rb | 42 +++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/lib/fog/vsphere/compute.rb b/lib/fog/vsphere/compute.rb index 07af37435..5004667da 100644 --- a/lib/fog/vsphere/compute.rb +++ b/lib/fog/vsphere/compute.rb @@ -343,8 +343,35 @@ module Fog @vsphere_ssl = options[:vsphere_ssl] || true @vsphere_expected_pubkey_hash = options[:vsphere_expected_pubkey_hash] @vsphere_must_reauthenticate = false - + @vsphere_is_vcenter = nil @connection = nil + connect + negotiate_revision(options[:vsphere_rev]) + authenticate + end + + def reload + connect + # Check if the negotiation was ever run + if @vsphere_is_vcenter.nil? + negotiate + end + authenticate + end + + private + def negotiate_revision(revision = nil) + # Negotiate the API revision + if not revision + rev = @connection.serviceContent.about.apiVersion + @connection.rev = [ rev, ENV['FOG_VSPHERE_REV'] || '4.1' ].min + end + + @vsphere_is_vcenter = @connection.serviceContent.about.apiType == "VirtualCenter" + @vsphere_rev = @connection.rev + end + + def connect # This is a state variable to allow digest validation of the SSL cert bad_cert = false loop do @@ -366,21 +393,8 @@ module Fog if bad_cert then validate_ssl_connection end - - # Negotiate the API revision - if not options[:vsphere_rev] - rev = @connection.serviceContent.about.apiVersion - @connection.rev = [ rev, ENV['FOG_VSPHERE_REV'] || '4.1' ].min - end - - @vsphere_is_vcenter = @connection.serviceContent.about.apiType == "VirtualCenter" - @vsphere_rev = @connection.rev - - authenticate end - private - def authenticate begin @connection.serviceContent.sessionManager.Login :userName => @vsphere_username,