Class: Bosh::Director::DiskManager

Inherits:
Object
  • Object
show all
Defined in:
lib/bosh/director/disk_manager.rb

Instance Method Summary collapse

Constructor Details

#initialize(cloud, logger) ⇒ DiskManager

Returns a new instance of DiskManager.



4
5
6
7
8
# File 'lib/bosh/director/disk_manager.rb', line 4

def initialize(cloud, logger)
  @cloud = cloud
  @logger = logger
  @transactor = Transactor.new
end

Instance Method Details

#attach_disks_if_needed(instance_plan) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/bosh/director/disk_manager.rb', line 33

def attach_disks_if_needed(instance_plan)
  unless instance_plan.needs_disk?
    @logger.warn('Skipping disk attachment, instance no longer needs disk')
    return
  end

  instance = instance_plan.instance
  disk_cid = instance.model.persistent_disk_cid
  return @logger.info('Skipping disk attaching') if disk_cid.nil?
  instance_model = instance.model
  begin
    @cloud.attach_disk(instance_model.vm_cid, disk_cid)
    AgentClient.with_vm_credentials_and_agent_id(instance_model.credentials, instance_model.agent_id).mount_disk(disk_cid)
  rescue => e
    @logger.warn("Failed to attach disk to new VM: #{e.inspect}")
    raise e
  end
end

#delete_orphan_disk(orphan_disk) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/bosh/director/disk_manager.rb', line 107

def delete_orphan_disk(orphan_disk)
  begin
    orphan_disk.orphan_snapshots.each do |orphan_snapshot|
      delete_orphan_snapshot(orphan_snapshot)
    end
    @logger.info("Deleting orphan orphan disk: #{orphan_disk.disk_cid}")
    @cloud.delete_disk(orphan_disk.disk_cid)
    orphan_disk.destroy
  rescue Bosh::Clouds::DiskNotFound
    @logger.debug("Disk not found in IaaS: #{orphan_disk.disk_cid}")
    orphan_disk.destroy
  end
end

#delete_orphan_disk_by_disk_cid(disk_cid) ⇒ Object



91
92
93
94
95
96
97
98
99
# File 'lib/bosh/director/disk_manager.rb', line 91

def delete_orphan_disk_by_disk_cid(disk_cid)
  @logger.info("Deleting orphan disk: #{disk_cid}")
  orphan_disk = Bosh::Director::Models::OrphanDisk.where(disk_cid: disk_cid).first
  if orphan_disk
    delete_orphan_disk(orphan_disk)
  else
    @logger.debug("Disk not found: #{disk_cid}")
  end
end

#delete_persistent_disks(instance_model) ⇒ Object



52
53
54
55
56
# File 'lib/bosh/director/disk_manager.rb', line 52

def delete_persistent_disks(instance_model)
  instance_model.persistent_disks.each do |disk|
    orphan_disk(disk)
  end
end

#list_orphan_disksObject



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/bosh/director/disk_manager.rb', line 77

def list_orphan_disks
  Models::OrphanDisk.all.map do |disk|
    {
      'disk_cid' => disk.disk_cid,
      'size' => disk.size,
      'az' => disk.availability_zone,
      'deployment_name' => disk.deployment_name,
      'instance_name' => disk.instance_name,
      'cloud_properties' => disk.cloud_properties,
      'orphaned_at' => disk.created_at.to_s
    }
  end
end

#orphan_disk(disk) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/bosh/director/disk_manager.rb', line 58

def orphan_disk(disk)
  @transactor.retryable_transaction(Bosh::Director::Config.db) do
    orphan_disk = Models::OrphanDisk.create(
      disk_cid: disk.disk_cid,
      size: disk.size,
      availability_zone: disk.instance.availability_zone,
      deployment_name: disk.instance.deployment.name,
      instance_name: "#{disk.instance.job}/#{disk.instance.uuid}",
      cloud_properties: disk.cloud_properties
    )

    orphan_snapshots(disk.snapshots, orphan_disk)
    @logger.info("Orphaning disk: '#{disk.disk_cid}', " +
        "#{disk.active ? "active" : "inactive"}")

    disk.destroy
  end
end

#unmount_disk_for(instance_plan) ⇒ Object



101
102
103
104
105
# File 'lib/bosh/director/disk_manager.rb', line 101

def unmount_disk_for(instance_plan)
  disk = instance_plan.instance.model.persistent_disk
  return if disk.nil?
  unmount(instance_plan.instance, disk)
end

#update_persistent_disk(instance_plan, vm_recreator) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/bosh/director/disk_manager.rb', line 10

def update_persistent_disk(instance_plan, vm_recreator)
  @logger.info('Updating persistent disk')
  check_persistent_disk(instance_plan)

  return unless instance_plan.persistent_disk_changed?

  instance = instance_plan.instance
  old_disk = instance.model.persistent_disk

  disk = nil
  if instance_plan.needs_disk?
    disk = create_and_attach_disk(instance_plan, vm_recreator)
    mount_and_migrate_disk(instance, disk, old_disk)
  end

  @transactor.retryable_transaction(Bosh::Director::Config.db) do
    old_disk.update(:active => false) if old_disk
    disk.update(:active => true) if disk
  end

  delete_mounted_persistent_disk(instance, old_disk) if old_disk
end