modules/mu/groomers/chef.rb in cloud-mu-3.1.5 vs modules/mu/groomers/chef.rb in cloud-mu-3.1.6
- old
+ new
@@ -33,10 +33,16 @@
return Object.const_get(symbol)
end
end
}
+ # Are the Chef libraries present and accounted for?
+ def self.available?(windows = false)
+ loadChefLib
+ @chefloaded
+ end
+
@chefloaded = false
@chefload_semaphore = Mutex.new
# Autoload is too brain-damaged to get Chef's subclasses/submodules, so
# implement our own lazy loading.
def self.loadChefLib(user = MU.chef_user, env = "dev", mu_user = MU.mu_user)
@@ -360,11 +366,11 @@
end
end
}
if resp.exitcode == 1 and output_lines.join("\n").match(/Chef Client finished/)
- MU.log "resp.exit code 1"
+ MU.log output_lines.last
elsif resp.exitcode != 0
raise MU::Cloud::BootstrapTempFail if resp.exitcode == 35 or output_lines.join("\n").match(/REBOOT_SCHEDULED| WARN: Reboot requested:|Rebooting server at a recipe's request|Chef::Exceptions::Reboot/)
raise MU::Groomer::RunError, output_lines.slice(output_lines.length-50, output_lines.length).join("")
end
end
@@ -617,19 +623,20 @@
else
kb = ::Chef::Knife::BootstrapWindowsWinrm.new([@server.mu_name])
kb.name_args = [@server.mu_name]
kb.config[:manual] = true
kb.config[:winrm_transport] = :ssl
- kb.config[:host] = @server.mu_name
kb.config[:winrm_port] = 5986
kb.config[:session_timeout] = timeout
kb.config[:operation_timeout] = timeout
if retries % 2 == 0
+ kb.config[:host] = canonical_addr
kb.config[:winrm_authentication_protocol] = :basic
kb.config[:winrm_user] = @server.config['windows_admin_username']
kb.config[:winrm_password] = @server.getWindowsAdminPassword
else
+ kb.config[:host] = @server.mu_name
kb.config[:winrm_authentication_protocol] = :cert
kb.config[:winrm_client_cert] = "#{MU.mySSLDir}/#{@server.mu_name}-winrm.crt"
kb.config[:winrm_client_key] = "#{MU.mySSLDir}/#{@server.mu_name}-winrm.key"
end
# kb.config[:ca_trust_file] = "#{MU.mySSLDir}/Mu_CA.pem"
@@ -679,11 +686,11 @@
!@config['forced_preclean']
begin
preClean(false) # it's ok for this to fail
rescue StandardError => e
end
- MU::Groomer::Chef.cleanup(@server.mu_name, nodeonly: true)
+ MU::Groomer::Chef.purge(@server.mu_name, nodeonly: true)
@config['forced_preclean'] = true
@server.reboot if @server.windows? # *sigh*
end
MU.log "#{@server.mu_name}: Knife Bootstrap failed #{e.inspect}, retrying in #{(10*retries).to_s}s (#{retries} of #{max_retries})", MU::WARN, details: e.backtrace
sleep 10*retries
@@ -796,15 +803,52 @@
rescue Net::HTTPServerException
MU.log "Attempted to save deployment to Chef node #{@server.mu_name} before it was bootstrapped.", MU::DEBUG
end
end
+ def self.cleanup(deploy_id, noop = false)
+ return nil if deploy_id.nil? or deploy_id.empty?
+ begin
+ if File.exist?(Etc.getpwuid(Process.uid).dir+"/.chef/knife.rb")
+ ::Chef::Config.from_file(Etc.getpwuid(Process.uid).dir+"/.chef/knife.rb")
+ end
+ deadnodes = []
+ ::Chef::Config[:environment] ||= MU.environment
+ q = ::Chef::Search::Query.new
+ begin
+ q.search("node", "tags_MU-ID:#{deploy_id}").each { |item|
+ next if item.is_a?(Integer)
+ item.each { |node|
+ deadnodes << node.name
+ }
+ }
+ rescue Net::HTTPServerException
+ end
+
+ begin
+ q.search("node", "name:#{deploy_id}-*").each { |item|
+ next if item.is_a?(Integer)
+ item.each { |node|
+ deadnodes << node.name
+ }
+ }
+ rescue Net::HTTPServerException
+ end
+ MU.log "Missed some Chef resources in node cleanup, purging now", MU::NOTICE if deadnodes.size > 0
+ deadnodes.uniq.each { |node|
+ MU::Groomer::Chef.purge(node, [], noop)
+ }
+ rescue LoadError
+ end
+
+ end
+
# Expunge Chef resources associated with a node.
# @param node [String]: The Mu name of the node in question.
# @param vaults_to_clean [Array<Hash>]: Some vaults to expunge
# @param noop [Boolean]: Skip actual deletion, just state what we'd do
# @param nodeonly [Boolean]: Just delete the node and its keys, but leave other artifacts
- def self.cleanup(node, vaults_to_clean = [], noop = false, nodeonly: false)
+ def self.purge(node, vaults_to_clean = [], noop = false, nodeonly: false)
loadChefLib
MU.log "Deleting Chef resources associated with #{node}"
if !nodeonly
vaults_to_clean.each { |vault|
MU::MommaCat.lock("vault-#{vault['vault']}", false, true)