class Bosh::Director::Jobs::AttachDisk

Public Class Methods

enqueue(username, deployment, job_name, instance_id, disk_cid, job_queue) click to toggle source
# File lib/bosh/director/jobs/attach_disk.rb, line 11
def self.enqueue(username, deployment, job_name, instance_id, disk_cid, job_queue)
  job_queue.enqueue(username, Jobs::AttachDisk, "attach disk '#{disk_cid}' to '#{job_name}/#{instance_id}'", [deployment.name, job_name, instance_id, disk_cid], deployment)
end
job_type() click to toggle source
# File lib/bosh/director/jobs/attach_disk.rb, line 7
def self.job_type
  :attach_disk
end
new(deployment_name, job_name, instance_id, disk_cid) click to toggle source
# File lib/bosh/director/jobs/attach_disk.rb, line 15
def initialize(deployment_name, job_name, instance_id, disk_cid)
  @deployment_name = deployment_name
  @job_name = job_name
  @instance_id = instance_id
  @disk_cid = disk_cid
  @transactor = Transactor.new
  @disk_manager = DiskManager.new(Config.cloud, logger)
end

Public Instance Methods

perform() click to toggle source
# File lib/bosh/director/jobs/attach_disk.rb, line 24
def perform
  instance = query_instance_model
  validate_instance(instance)

  @transactor.retryable_transaction(instance.db) do
    handle_previous_disk(instance) if instance.persistent_disk
    handle_new_disk(instance)
  end

  "attached disk '#{@disk_cid}' to '#{@job_name}/#{@instance_id}' in deployment '#{@deployment_name}'"
end

Private Instance Methods

handle_new_disk(instance) click to toggle source
# File lib/bosh/director/jobs/attach_disk.rb, line 69
def handle_new_disk(instance)
  orphan_disk = Models::OrphanDisk[:disk_cid => @disk_cid]
  if orphan_disk
    @disk_manager.unorphan_disk(orphan_disk, instance.id)
  else
    Models::PersistentDisk.create(disk_cid: @disk_cid, instance_id: instance.id, active: true, size: 1, cloud_properties: {})
  end

  if instance.state == 'stopped'
    instance = query_instance_model
    @disk_manager.attach_disk(instance)
  end
end
handle_previous_disk(instance) click to toggle source
# File lib/bosh/director/jobs/attach_disk.rb, line 57
def handle_previous_disk(instance)
  previous_persistent_disk = instance.persistent_disk
  previous_persistent_disk.update(active: false)

  if instance.state == 'stopped'
    @disk_manager.unmount_disk(instance, previous_persistent_disk)
    @disk_manager.detach_disk(instance, previous_persistent_disk)
  end

  @disk_manager.orphan_disk(previous_persistent_disk)
end
query_instance_model() click to toggle source
# File lib/bosh/director/jobs/attach_disk.rb, line 38
def query_instance_model
  Models::Instance.filter(job: @job_name, uuid: @instance_id).first
end
validate_instance(instance) click to toggle source
# File lib/bosh/director/jobs/attach_disk.rb, line 42
def validate_instance(instance)
  if instance.nil? || instance.deployment.name != @deployment_name
    raise AttachDiskErrorUnknownInstance, "Instance '#{@job_name}/#{@instance_id}' in deployment '#{@deployment_name}' was not found"
  end

  if instance.ignore
    raise AttachDiskInvalidInstanceState, "Instance '#{@job_name}/#{@instance_id}' in deployment '#{@deployment_name}' is in 'ignore' state. " +
        'Attaching disks to ignored instances is not allowed.'
  end

  if instance.state != 'detached' && instance.state != 'stopped'
    raise AttachDiskInvalidInstanceState, "Instance '#{@job_name}/#{@instance_id}' in deployment '#{@deployment_name}' must be in 'bosh stopped' state"
  end
end