From 36b71b78a714a09f766eb1c9e4a8f5c817bf0788 Mon Sep 17 00:00:00 2001 From: dima Date: Tue, 14 May 2013 01:16:28 +0200 Subject: [PATCH] improve nfs --- README.md | 2 ++ lib/vagrant-libvirt/action.rb | 3 +-- .../action/prepare_nfs_settings.rb | 18 +++++++++++++++--- .../action/prune_nfs_exports.rb | 7 ++++++- lib/vagrant-libvirt/action/share_folders.rb | 4 ++-- lib/vagrant-libvirt/action/sync_folders.rb | 1 + lib/vagrant-libvirt/config.rb | 16 ---------------- 7 files changed, 27 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 35dca08..63f1eaa 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,8 @@ to the remote machine over SSH. This is good enough for all built-in Vagrant provisioners (shell, chef, and puppet) to work! +if used options :nfs => true, folder will exported by nfs. + ## Box Format You can view an example box in the [example_box/directory](https://github.com/pradels/vagrant-libvirt/tree/master/example_box). That directory also contains instructions on how to build a box. diff --git a/lib/vagrant-libvirt/action.rb b/lib/vagrant-libvirt/action.rb index 6bd7327..7c7647b 100644 --- a/lib/vagrant-libvirt/action.rb +++ b/lib/vagrant-libvirt/action.rb @@ -25,7 +25,6 @@ module VagrantPlugins b2.use CreateNetworks b2.use CreateNetworkInterfaces - b2.use PruneNFSExports b2.use NFS b2.use PrepareNFSSettings b2.use ShareFolders @@ -105,8 +104,8 @@ module VagrantPlugins next end - b2.use PruneNFSExports b2.use ConnectLibvirt + b2.use PruneNFSExports b2.use DestroyDomain b2.use DestroyNetworks diff --git a/lib/vagrant-libvirt/action/prepare_nfs_settings.rb b/lib/vagrant-libvirt/action/prepare_nfs_settings.rb index b00d790..bc0ffb7 100644 --- a/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +++ b/lib/vagrant-libvirt/action/prepare_nfs_settings.rb @@ -1,3 +1,4 @@ +require 'nokogiri' module VagrantPlugins module Libvirt module Action @@ -20,7 +21,7 @@ module VagrantPlugins if using_nfs @logger.info("Using NFS, preparing NFS settings by reading host IP and machine IP") - env[:nfs_host_ip] = read_host_ip(env[:machine]) + env[:nfs_host_ip] = read_host_ip(env[:machine],env) env[:nfs_machine_ip] = env[:machine].ssh_info[:host] raise Vagrant::Errors::NFSNoHostonlyNetwork if !env[:nfs_machine_ip] @@ -31,8 +32,19 @@ module VagrantPlugins # # @param [Machine] machine # @return [String] - def read_host_ip(machine) - `ip addr show | grep -A 2 virbr0 | grep -i 'inet ' | tr -s ' ' | cut -d' ' -f3 | cut -d'/' -f 1`.chomp + def read_host_ip(machine,env) + nets = env[:libvirt_compute].list_networks + if nets.size == 1 + net = nets.first + else + domain = env[:libvirt_compute].servers.get(machine.id.to_s) + xml=Nokogiri::XML(domain.to_xml) + networkname = xml.xpath('/domain/devices/interface/source').first.attributes['network'].value.to_s + puts "network name = #{networkname}" + net = env[:libvirt_compute].list_networks.map {|netw| netw if netw[:name] == networkname}.first + end + # FIXME better implement by libvirt xml parsing + `ip addr show | grep -A 2 #{net[:bridge_name]} | grep -i 'inet ' | tr -s ' ' | cut -d' ' -f3 | cut -d'/' -f 1`.chomp end # Returns the IP address of the guest by looking at the first diff --git a/lib/vagrant-libvirt/action/prune_nfs_exports.rb b/lib/vagrant-libvirt/action/prune_nfs_exports.rb index dcc2d49..435a80e 100644 --- a/lib/vagrant-libvirt/action/prune_nfs_exports.rb +++ b/lib/vagrant-libvirt/action/prune_nfs_exports.rb @@ -3,6 +3,7 @@ module VagrantPlugins module Libvirt module Action class PruneNFSExports + def initialize(app, env) @app = app end @@ -10,7 +11,11 @@ module VagrantPlugins def call(env) if env[:host] uuid = env[:machine].id - env[:host].nfs_prune(uuid) + # get all uuids + uuids = env[:libvirt_compute].servers.all.map(&:id) + # not exiisted in array will removed from nfs + uuids.delete(uuid) + env[:host].nfs_prune(uuids) end @app.call(env) diff --git a/lib/vagrant-libvirt/action/share_folders.rb b/lib/vagrant-libvirt/action/share_folders.rb index c6b496d..285b4e7 100644 --- a/lib/vagrant-libvirt/action/share_folders.rb +++ b/lib/vagrant-libvirt/action/share_folders.rb @@ -26,10 +26,10 @@ module VagrantPlugins {}.tap do |result| @env[:machine].config.vm.synced_folders.each do |id, data| # Ignore NFS shared folders - #next if data[:nfs] + next if !data[:nfs] # convert to NFS share - data[:nfs] = true + #data[:nfs] = true # This to prevent overwriting the actual shared folders data result[id] = data.dup diff --git a/lib/vagrant-libvirt/action/sync_folders.rb b/lib/vagrant-libvirt/action/sync_folders.rb index f16fa02..af5af7d 100644 --- a/lib/vagrant-libvirt/action/sync_folders.rb +++ b/lib/vagrant-libvirt/action/sync_folders.rb @@ -18,6 +18,7 @@ module VagrantPlugins ssh_info = env[:machine].ssh_info env[:machine].config.vm.synced_folders.each do |id, data| + next if data[:nfs] hostpath = File.expand_path(data[:hostpath], env[:root_path]) guestpath = data[:guestpath] diff --git a/lib/vagrant-libvirt/config.rb b/lib/vagrant-libvirt/config.rb index 7422459..a8a151f 100644 --- a/lib/vagrant-libvirt/config.rb +++ b/lib/vagrant-libvirt/config.rb @@ -27,10 +27,7 @@ module VagrantPlugins attr_accessor :cpus attr_accessor :nested - attr_reader :shared_folders - def initialize - @shared_folders = {} @driver = UNSET_VALUE @host = UNSET_VALUE @connect_via_ssh = UNSET_VALUE @@ -58,19 +55,6 @@ module VagrantPlugins @nested = false if @nested == UNSET_VALUE end - def share_folder(name, guestpath, hostpath, opts=nil) - @shared_folders[name] = { - :guestpath => guestpath.to_s, - :hostpath => hostpath.to_s, - :create => false, - :owner => nil, - :group => nil, - :nfs => false, - :transient => false, - :extra => nil - }.merge(opts || {}) - end - def validate(machine) end end