diff --git a/lib/vagrant-libvirt/action.rb b/lib/vagrant-libvirt/action.rb index 1618641..48f1605 100644 --- a/lib/vagrant-libvirt/action.rb +++ b/lib/vagrant-libvirt/action.rb @@ -156,7 +156,14 @@ module VagrantPlugins b.use ConfigValidate b.use Call, IsCreated do |env, b2| if !env[:result] - b2.use MessageNotCreated + # Try to remove stale volumes anyway + b2.use ConnectLibvirt + b2.use SetNameOfDomain + b2.use RemoveStaleVolume + if !env[:result] + b2.use MessageNotCreated + end + next end @@ -338,6 +345,8 @@ module VagrantPlugins autoload :MessageNotRunning, action_root.join('message_not_running') autoload :MessageNotSuspended, action_root.join('message_not_suspended') + autoload :RemoveStaleVolume, action_root.join('remove_stale_volume') + autoload :PrepareNFSSettings, action_root.join('prepare_nfs_settings') autoload :PrepareNFSValidIds, action_root.join('prepare_nfs_valid_ids') autoload :PruneNFSExports, action_root.join('prune_nfs_exports') diff --git a/lib/vagrant-libvirt/action/remove_stale_volume.rb b/lib/vagrant-libvirt/action/remove_stale_volume.rb new file mode 100644 index 0000000..5b3c876 --- /dev/null +++ b/lib/vagrant-libvirt/action/remove_stale_volume.rb @@ -0,0 +1,49 @@ +require 'log4r' +#require 'log4r/yamlconfigurator' + +module VagrantPlugins + module ProviderLibvirt + module Action + class RemoveStaleVolume + def initialize(app, _env) + +# log4r_config= YAML.load_file(File.join(File.dirname(__FILE__),"log4r.yaml")) +# log_cfg = Log4r::YamlConfigurator +# log_cfg.decode_yaml( log4r_config['log4r_config'] ) + + @logger = Log4r::Logger.new('vagrant_libvirt::action::remove_stale_volume') + @app = app + end + + def call(env) + # Remove stale server volume + env[:ui].info(I18n.t('vagrant_libvirt.remove_stale_volume')) + + config = env[:machine].provider_config + # Check for storage pool, where box image should be created + fog_pool = ProviderLibvirt::Util::Collection.find_matching( + env[:libvirt_compute].pools.all, config.storage_pool_name) + @logger.debug("**** Pool #{fog_pool.name}") + + # This is name of newly created image for vm. + name = "#{env[:domain_name]}.img" + @logger.debug("**** Volume name #{name}") + + # remove root storage + box_volume = ProviderLibvirt::Util::Collection.find_matching( + env[:libvirt_compute].volumes.all, name) + if box_volume && box_volume.pool_name == fog_pool.name + @logger.info("Deleting volume #{box_volume.key}") + box_volume.destroy + env[:result] = box_volume + else + env[:result] = nil + end + + # Continue the middleware chain. + @app.call(env) + end + end + end + end +end diff --git a/locales/en.yml b/locales/en.yml index 38da9bf..7118fd9 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -44,6 +44,8 @@ en: Rsyncing folder: %{hostpath} => %{guestpath} ready: |- Machine is booted and ready for use! + remove_stale_volume: |- + Remove stale volume... errors: package_not_supported: Not support package for libvirt. Create box manualy.