def call(env)
config = env[:machine].provider_config
domain_name = env[:domain_name]
disk_bus = config.disk_bus
disk_device = config.disk_device
disk_address_type = config.disk_address_type
domain_volume_cache = config.volume_cache || 'default'
storage_pool_name = config.storage_pool_name
snapshot_pool_name = config.snapshot_pool_name
domain_volumes = []
disks = config.disks.dup
resolver = ::VagrantPlugins::ProviderLibvirt::Util::DiskDeviceResolver.new(disk_device[0..1])
if env[:machine].config.vm.box
pool_name = if snapshot_pool_name == storage_pool_name
storage_pool_name
else
snapshot_pool_name
end
if env[:box_volumes].nil?
libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(
env[:machine].id
)
domain_xml = libvirt_domain.xml_desc(1)
xml_descr = REXML::Document.new(domain_xml)
domain_name = xml_descr.elements['domain'].elements['name'].text
disks_xml = REXML::XPath.match(xml_descr, '/domain/devices/disk[@device="disk"]')
have_aliases = !REXML::XPath.match(disks_xml, './alias[@name="ua-box-volume-0"]').first.nil?
env[:ui].warn(I18n.t('vagrant_libvirt.domain_xml.obsolete_method')) unless have_aliases
if have_aliases
REXML::XPath.match(disks_xml,
'./alias[contains(@name, "ua-box-volume-")]').each_with_index do |alias_xml, idx|
domain_volumes.push(volume_from_xml(alias_xml.parent, domain_name, idx))
end
else
disks_xml.each_with_index do |box_disk_xml, idx|
diskname = box_disk_xml.elements['source'].attributes['file'].rpartition('/').last
break if volume_name(domain_name, idx) != diskname
domain_volumes.push(volume_from_xml(box_disk_xml, domain_name, idx))
end
end
else
@logger.debug "Search for volumes in pool: #{pool_name}"
env[:box_volumes].each_index do |index|
domain_volume = env[:machine].provider.driver.connection.volumes.all(
name: volume_name(domain_name, index)
).find { |x| x.pool_name == pool_name }
raise Errors::NoDomainVolume if domain_volume.nil?
domain_volumes.push(
{
name: volume_name(domain_name, index),
device: env[:box_volumes][index][:device],
cache: domain_volume_cache,
bus: disk_bus,
address_type: disk_address_type,
absolute_path: domain_volume.path,
virtual_size: env[:box_volumes][index][:virtual_size],
pool: pool_name,
}
)
end
end
resolver.resolve!(domain_volumes)
storage_prefix = "#{File.dirname(domain_volumes[0][:absolute_path])}/"
else
if domain_name.nil?
libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(
env[:machine].id
)
domain_xml = libvirt_domain.xml_desc(1)
xml_descr = REXML::Document.new(domain_xml)
domain_name = xml_descr.elements['domain'].elements['name'].text
end
storage_prefix = get_disk_storage_prefix(env[:machine], storage_pool_name)
end
resolver.resolve!(disks)
disks.each do |disk|
disk[:path] ||= disk_name(domain_name, disk)
disk[:name] = disk[:path]
disk[:absolute_path] = storage_prefix + disk[:path]
if disk[:pool].nil?
disk[:pool] = storage_pool_name
else
@logger.debug "Overriding pool name with: #{disk[:pool]}"
disk_storage_prefix = get_disk_storage_prefix(env[:machine], disk[:pool])
disk[:absolute_path] = disk_storage_prefix + disk[:path]
@logger.debug "Overriding disk path with: #{disk[:absolute_path]}"
end
end
env[:domain_volumes] = domain_volumes
env[:disks] = disks
@app.call(env)
end