Class: Bosh::Director::DiskManager
- Defined in:
- lib/bosh/director/disk_manager.rb
Instance Method Summary collapse
- #attach_disks_if_needed(instance_plan) ⇒ Object
- #delete_orphan_disk(orphan_disk) ⇒ Object
- #delete_orphan_disk_by_disk_cid(disk_cid) ⇒ Object
- #delete_persistent_disks(instance_model) ⇒ Object
-
#initialize(cloud, logger) ⇒ DiskManager
constructor
A new instance of DiskManager.
- #list_orphan_disks ⇒ Object
- #orphan_disk(disk) ⇒ Object
- #unmount_disk_for(instance_plan) ⇒ Object
- #update_persistent_disk(instance_plan, vm_recreator) ⇒ Object
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_disks ⇒ Object
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 |