class VagrantPlugins::ProviderLibvirt::Action::DestroyDomain

Public Class Methods

new(app, _env) click to toggle source
# File lib/vagrant-libvirt/action/destroy_domain.rb, line 7
def initialize(app, _env)
  @logger = Log4r::Logger.new('vagrant_libvirt::action::destroy_domain')
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/vagrant-libvirt/action/destroy_domain.rb, line 12
def call(env)
  # Destroy the server, remove the tracking ID
  env[:ui].info(I18n.t('vagrant_libvirt.destroy_domain'))

  # Must delete any snapshots before domain can be destroyed
  # Fog libvirt currently doesn't support snapshots. Use
  # ruby-libvirt client directly. Note this is racy, see
  # http://www.libvirt.org/html/libvirt-libvirt.html#virDomainSnapshotListNames
  libvirt_domain =  env[:libvirt_compute].client.lookup_domain_by_uuid(
                      env[:machine].id)
  libvirt_domain.list_snapshots.each do |name|
    @logger.info("Deleting snapshot '#{name}'")
    begin
      libvirt_domain.lookup_snapshot_by_name(name).delete
    rescue => e
      raise Errors::DeleteSnapshotError, error_message: e.message
    end
  end

  domain = env[:libvirt_compute].servers.get(env[:machine].id.to_s)

  if env[:machine].provider_config.disks.empty?
    # if using default configuration of disks
    domain.destroy(destroy_volumes: true)
  else
    domain.destroy(destroy_volumes: false)

    env[:machine].provider_config.disks.each do |disk|
      # shared disks remove only manualy or ???
      next if disk[:allow_existing]
      diskname = libvirt_domain.name + '-' + disk[:device] + '.' + disk[:type].to_s
      # diskname is uniq
      libvirt_disk = domain.volumes.select do |x|
        x.name == diskname
      end.first
      if libvirt_disk
        libvirt_disk.destroy
      elsif disk[:path]
        poolname = env[:machine].provider_config.storage_pool_name
        libvirt_disk = domain.volumes.select do |x|
          # FIXME can remove pool/target.img and pool/123/target.img
          x.path =~ /\/#{disk[:path]}$/ && x.pool_name == poolname
        end.first
        libvirt_disk.destroy if libvirt_disk
      end
    end

    # remove root storage
    root_disk = domain.volumes.select do |x|
      x.name == libvirt_domain.name + '.img'
    end.first
    root_disk.destroy if root_disk
  end

  @app.call(env)
end