class Bosh::Director::ProblemHandlers::MissingDisk

Public Class Methods

new(disk_id, data) click to toggle source
# File lib/bosh/director/problem_handlers/missing_disk.rb, line 8
def initialize(disk_id, data)
  super
  @disk_id = disk_id
  @data = data
  @disk = Models::PersistentDisk[@disk_id]

  if @disk.nil?
    handler_error("Disk '#{@disk_id}' is no longer in the database")
  end

  @instance = @disk.instance
  if @instance.nil?
    handler_error("Cannot find instance for disk '#{@disk.disk_cid}'")
  end
end

Public Instance Methods

delete_disk_reference() click to toggle source
# File lib/bosh/director/problem_handlers/missing_disk.rb, line 41
def delete_disk_reference
  @disk.update(active: false)

  # If VM is present we try to unmount and detach disk from VM
  if @instance.vm_cid && cloud.has_vm?(@instance.vm_cid)
    agent_client = agent_client(@instance.credentials, @instance.agent_id)
    disk_list = []

    begin
      disk_list = agent_client.list_disk
      if disk_list.include?(@disk.disk_cid)
        @logger.debug('Trying to unmount disk')
        agent_client.unmount_disk(@disk.disk_cid)
      end

    rescue Bosh::Director::RpcTimeout
      # When agent is not responding it probably is failing to
      # access missing disk. We continue with sending detach_disk
      # which should update agent settings.json and it should be
      # restarted successfully.
      @logger.debug('Agent is not responding, skipping unmount')
    rescue Bosh::Director::RpcRemoteException => e
      handler_error("Cannot unmount disk, #{e.message}")
    end

    begin
      @logger.debug('Sending cpi request: detach_disk')
      cloud.detach_disk(@instance.vm_cid, @disk.disk_cid) if @instance.vm_cid
    rescue Bosh::Clouds::DiskNotAttached, Bosh::Clouds::DiskNotFound
    end
  end

  DiskManager.new(cloud, @logger).orphan_disk(@disk)

end
description() click to toggle source
# File lib/bosh/director/problem_handlers/missing_disk.rb, line 24
def description
  job = @instance.job || "unknown job"
  uuid = @instance.uuid || "unknown id"
  disk_label = "'#{@disk.disk_cid}' (#{job}/#{uuid}, #{@disk.size.to_i}M)"
  "Disk #{disk_label} is missing"
end