mirror of
https://github.com/vagrant-libvirt/vagrant-libvirt.git
synced 2025-02-25 18:55:27 -06:00
95 lines
3.5 KiB
Ruby
95 lines
3.5 KiB
Ruby
require 'log4r'
|
|
|
|
module VagrantPlugins
|
|
module ProviderLibvirt
|
|
module Action
|
|
# Create a snapshot of base box image. This new snapshot is just new
|
|
# cow image with backing storage pointing to base box image. Use this
|
|
# image as new domain volume.
|
|
class CreateDomainVolume
|
|
include VagrantPlugins::ProviderLibvirt::Util::ErbTemplate
|
|
include VagrantPlugins::ProviderLibvirt::Util::StorageUtil
|
|
|
|
def initialize(app, _env)
|
|
@logger = Log4r::Logger.new('vagrant_libvirt::action::create_domain_volume')
|
|
@app = app
|
|
end
|
|
|
|
def call(env)
|
|
env[:ui].info(I18n.t('vagrant_libvirt.creating_domain_volume'))
|
|
|
|
env[:box_volumes].each_index do |index|
|
|
suffix_index = index > 0 ? "_#{index}" : ''
|
|
# Get config options.
|
|
config = env[:machine].provider_config
|
|
|
|
# This is name of newly created image for vm.
|
|
@name = "#{env[:domain_name]}#{suffix_index}.img"
|
|
|
|
# Verify the volume doesn't exist already.
|
|
domain_volume = env[:machine].provider.driver.connection.volumes.all(
|
|
name: @name
|
|
).first
|
|
raise Errors::DomainVolumeExists if domain_volume && domain_volume.id
|
|
|
|
# Get path to backing image - box volume.
|
|
box_volume = env[:machine].provider.driver.connection.volumes.all(
|
|
name: env[:box_volumes][index][:name]
|
|
).first
|
|
@backing_file = box_volume.path
|
|
|
|
# Virtual size of image. Take value worked out by HandleBoxImage
|
|
@capacity = env[:box_volumes][index][:virtual_size].to_B # Byte
|
|
|
|
# Create new volume from xml template. Fog currently doesn't support
|
|
# volume snapshots directly.
|
|
begin
|
|
xml = Nokogiri::XML::Builder.new do |xml|
|
|
xml.volume do
|
|
xml.name(@name)
|
|
xml.capacity(@capacity, unit: 'B')
|
|
xml.target do
|
|
xml.format(type: 'qcow2')
|
|
xml.permissions do
|
|
xml.owner storage_uid(env)
|
|
xml.group storage_gid(env)
|
|
xml.label 'virt_image_t'
|
|
end
|
|
end
|
|
xml.backingStore do
|
|
xml.path(@backing_file)
|
|
xml.format(type: 'qcow2')
|
|
xml.permissions do
|
|
xml.owner storage_uid(env)
|
|
xml.group storage_gid(env)
|
|
xml.label 'virt_image_t'
|
|
end
|
|
end
|
|
end
|
|
end.to_xml(
|
|
save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION |
|
|
Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
|
|
Nokogiri::XML::Node::SaveOptions::FORMAT
|
|
)
|
|
if config.snapshot_pool_name != config.storage_pool_name
|
|
pool_name = config.snapshot_pool_name
|
|
else
|
|
pool_name = config.storage_pool_name
|
|
end
|
|
@logger.debug "Using pool #{pool_name} for base box snapshot"
|
|
domain_volume = env[:machine].provider.driver.connection.volumes.create(
|
|
xml: xml,
|
|
pool_name: pool_name
|
|
)
|
|
rescue Fog::Errors::Error => e
|
|
raise Errors::FogDomainVolumeCreateError,
|
|
error_message: e.message
|
|
end
|
|
end
|
|
@app.call(env)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|