class Kontena::Machine::Upcloud::NodeDestroyer

Attributes

api_client[R]
uc_client[R]

Public Class Methods

new(api_client, upcloud_username, upcloud_password) click to toggle source

@param [Kontena::Client] api_client Kontena api client @param [String] token Upcloud token

# File lib/kontena/machine/upcloud/node_destroyer.rb, line 12
def initialize(api_client, upcloud_username, upcloud_password)
  @api_client = api_client
  @uc_client = Kontena::Machine::Upcloud::Client.new(upcloud_username, upcloud_password)
end

Public Instance Methods

run!(grid, name) click to toggle source
# File lib/kontena/machine/upcloud/node_destroyer.rb, line 17
def run!(grid, name)

  servers = uc_client.get('server')
  unless servers && servers.has_key?(:servers)
    abort('Upcloud API error')
  end

  server = servers[:servers][:server].find{|s| s[:hostname] == name}

  abort "Cannot find node #{name.colorize(:cyan)} in UpCloud" unless server

  server_data = uc_client.get("server/#{server[:uuid]}")

  storage_devices = server_data.fetch(:server, {}).fetch(:storage_devices, {}).fetch(:storage_device, [])
  storage_uuids = storage_devices.map{|s| s[:storage]}

  abort('No storage devices found for UpCloud node') if storage_uuids.empty?

  if server
    unless server[:state].eql?('stopped')
      spinner "Shutting down UpCloud node #{name.colorize(:cyan)} " do
        device_data = uc_client.post(
          "server/#{server[:uuid]}/stop", {
            stop_server: {
              stop_type: 'soft',
              timeout: 120
            }
          }.to_json
        )

        until device_data && device_data.fetch(:state, nil).to_s.eql?('stopped')
          device_data = uc_client.get("server/#{server[:uuid]}").fetch(:server, {}) rescue nil
          sleep 5
        end
      end
    end

    spinner "Terminating UpCloud node #{name.colorize(:cyan)} " do
      response = uc_client.delete("server/#{server[:uuid]}")
      abort "Cannot delete node #{name.colorize(:cyan)} in Upcloud" unless response[:success]
    end

    storage_uuids.each do |uuid|
      spinner "Deleting UpCloud storage device '#{uuid.colorize(:cyan)}' " do
        response = uc_client.delete("storage/#{uuid}")
        unless response[:success]
          puts "#{"WARNING".colorize(:red)}: Couldn't delete UpCloud storage '#{uuid.colorize(:cyan)}', check manually."
        end
      end
    end
  else
    abort "Cannot find node #{name.colorize(:cyan)} in UpCloud"
  end
  node = api_client.get("grids/#{grid['id']}/nodes")['nodes'].find{|n| n['name'] == name}
  if node
    spinner "Removing node #{name.colorize(:cyan)} from grid #{grid['name'].colorize(:cyan)} " do
      api_client.delete("nodes/#{grid['id']}/#{node['id']}")
    end
  end
end