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)