vagrant-libvirt 0.0.14 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +10 -4
- data/lib/vagrant-libvirt/action.rb +23 -8
- data/lib/vagrant-libvirt/action/create_network_interfaces.rb +8 -18
- data/lib/vagrant-libvirt/action/create_networks.rb +4 -52
- data/lib/vagrant-libvirt/action/forward_ports.rb +164 -0
- data/lib/vagrant-libvirt/action/prepare_nfs_settings.rb +14 -10
- data/lib/vagrant-libvirt/action/prepare_nfs_valid_ids.rb +17 -0
- data/lib/vagrant-libvirt/action/share_folders.rb +1 -4
- data/lib/vagrant-libvirt/action/sync_folders.rb +1 -1
- data/lib/vagrant-libvirt/action/timed_provision.rb +4 -7
- data/lib/vagrant-libvirt/util.rb +1 -1
- data/lib/vagrant-libvirt/util/network_util.rb +117 -0
- data/lib/vagrant-libvirt/version.rb +1 -1
- data/vagrant-libvirt.gemspec +5 -5
- metadata +15 -11
- data/lib/vagrant-libvirt/util/libvirt_util.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 693a19302ccb1cda6b30a7be5b5d9b8c5e74b5e3
|
4
|
+
data.tar.gz: 951b697e48245021c9cec5d8e392a44d7d0881ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d82a8e8257f289130dfc2fc84388adbaff56803012d5a8fdfd6b12395bb100102aa452c75fb98ce1579af2ba0b961d794fe6149e02ed67e8870384ff8c5b402
|
7
|
+
data.tar.gz: 21f86a6f84414e3aeb92e801d5114bec30c5c0cac4a391c28142c73468c0825ae620ba527424a1fffac4970f8a75e7abe6119954c60180aef165dfc4baad8e89
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# Vagrant Libvirt Provider
|
2
2
|
|
3
|
-
This is a [Vagrant](http://www.vagrantup.com) 1.3+ plugin that adds an
|
3
|
+
This is a [Vagrant](http://www.vagrantup.com) 1.4.3+ plugin that adds an
|
4
4
|
[Libvirt](http://libvirt.org) provider to Vagrant, allowing Vagrant to
|
5
5
|
control and provision machines via Libvirt toolkit.
|
6
6
|
|
7
|
-
**Note:** Actual version (0.0.
|
7
|
+
**Note:** Actual version (0.0.15) is still a development one. Feedback is
|
8
8
|
welcome and can help a lot :-)
|
9
9
|
|
10
10
|
## Features (Version 0.0.13)
|
@@ -29,7 +29,7 @@ welcome and can help a lot :-)
|
|
29
29
|
|
30
30
|
## Installation
|
31
31
|
|
32
|
-
Install using standard [Vagrant 1.3+](http://downloads.vagrantup.com) plugin installation methods. After
|
32
|
+
Install using standard [Vagrant 1.4.3+](http://downloads.vagrantup.com) plugin installation methods. After
|
33
33
|
installing, `vagrant up` and specify the `libvirt` provider. An example is shown below.
|
34
34
|
|
35
35
|
```
|
@@ -162,7 +162,7 @@ Vagrant goes through steps below when creating new project:
|
|
162
162
|
## Networks
|
163
163
|
|
164
164
|
Networking features in the form of `config.vm.network` support private networks
|
165
|
-
concept.
|
165
|
+
concept.
|
166
166
|
|
167
167
|
Public Network interfaces are currently implemented using the macvtap driver. The macvtap
|
168
168
|
driver is only available with the Linux Kernel version >= 2.6.24. See the following libvirt
|
@@ -271,6 +271,12 @@ Configurable ssh parameters in Vagrantfile after provider version 0.0.5 are:
|
|
271
271
|
* `config.ssh.forward_agent` - Default is false.
|
272
272
|
* `config.ssh.forward_x11` - Default is false.
|
273
273
|
|
274
|
+
## Forwarded Ports
|
275
|
+
|
276
|
+
vagrant-libvirt supports Forwarded Ports via ssh port forwarding. For each
|
277
|
+
`forwarded_port` directive you specify in your Vagrantfile, vagrant-libvirt
|
278
|
+
will maintain an active ssh process for the lifetime of the VM.
|
279
|
+
|
274
280
|
## Synced Folders
|
275
281
|
|
276
282
|
There is minimal support for synced folders. Upon `vagrant up`, the Libvirt
|
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'vagrant/action/builder'
|
2
|
+
require 'log4r'
|
2
3
|
|
3
4
|
module VagrantPlugins
|
4
5
|
module ProviderLibvirt
|
5
6
|
module Action
|
6
7
|
# Include the built-in modules so we can use them as top-level things.
|
7
8
|
include Vagrant::Action::Builtin
|
9
|
+
@logger = Log4r::Logger.new('vagrant_libvirt::action')
|
8
10
|
|
9
11
|
# This action is called to bring the box up from nothing.
|
10
12
|
def self.action_up
|
@@ -25,18 +27,22 @@ module VagrantPlugins
|
|
25
27
|
b2.use CreateNetworks
|
26
28
|
b2.use CreateNetworkInterfaces
|
27
29
|
|
30
|
+
b2.use StartDomain
|
31
|
+
b2.use WaitTillUp
|
32
|
+
|
28
33
|
if Vagrant::VERSION < "1.4.0"
|
29
34
|
b2.use NFS
|
30
35
|
else
|
36
|
+
b2.use PrepareNFSValidIds
|
31
37
|
b2.use SyncedFolderCleanup
|
32
38
|
b2.use SyncedFolders
|
33
39
|
end
|
34
40
|
|
41
|
+
b2.use ForwardPorts
|
42
|
+
|
35
43
|
b2.use PrepareNFSSettings
|
36
44
|
b2.use ShareFolders
|
37
45
|
b2.use SetHostname
|
38
|
-
b2.use StartDomain
|
39
|
-
b2.use WaitTillUp
|
40
46
|
b2.use SyncFolders
|
41
47
|
else
|
42
48
|
b2.use action_start
|
@@ -68,22 +74,26 @@ module VagrantPlugins
|
|
68
74
|
# Ensure networks are created and active
|
69
75
|
b3.use CreateNetworks
|
70
76
|
|
77
|
+
# Start it..
|
78
|
+
b3.use StartDomain
|
79
|
+
|
80
|
+
# Machine should gain IP address when comming up,
|
81
|
+
# so wait for dhcp lease and store IP into machines data_dir.
|
82
|
+
b3.use WaitTillUp
|
83
|
+
|
71
84
|
# Handle shared folders
|
72
85
|
if Vagrant::VERSION < "1.4.0"
|
73
86
|
b3.use NFS
|
74
87
|
else
|
88
|
+
b3.use PrepareNFSValidIds
|
75
89
|
b3.use SyncedFolderCleanup
|
76
90
|
b3.use SyncedFolders
|
77
91
|
end
|
92
|
+
|
93
|
+
b3.use ForwardPorts
|
78
94
|
b3.use PrepareNFSSettings
|
79
95
|
b3.use ShareFolders
|
80
96
|
|
81
|
-
# Start it..
|
82
|
-
b3.use StartDomain
|
83
|
-
|
84
|
-
# Machine should gain IP address when comming up,
|
85
|
-
# so wait for dhcp lease and store IP into machines data_dir.
|
86
|
-
b3.use WaitTillUp
|
87
97
|
end
|
88
98
|
end
|
89
99
|
end
|
@@ -95,6 +105,7 @@ module VagrantPlugins
|
|
95
105
|
Vagrant::Action::Builder.new.tap do |b|
|
96
106
|
b.use ConfigValidate
|
97
107
|
b.use ConnectLibvirt
|
108
|
+
b.use ClearForwardedPorts
|
98
109
|
b.use Call, IsCreated do |env, b2|
|
99
110
|
if !env[:result]
|
100
111
|
b2.use MessageNotCreated
|
@@ -144,6 +155,7 @@ module VagrantPlugins
|
|
144
155
|
end
|
145
156
|
|
146
157
|
b2.use ConnectLibvirt
|
158
|
+
b2.use ClearForwardedPorts
|
147
159
|
b2.use PruneNFSExports
|
148
160
|
b2.use DestroyDomain
|
149
161
|
b2.use DestroyNetworks
|
@@ -297,6 +309,8 @@ module VagrantPlugins
|
|
297
309
|
autoload :CreateNetworks, action_root.join('create_networks')
|
298
310
|
autoload :DestroyDomain, action_root.join('destroy_domain')
|
299
311
|
autoload :DestroyNetworks, action_root.join('destroy_networks')
|
312
|
+
autoload :ForwardPorts, action_root.join('forward_ports')
|
313
|
+
autoload :ClearForwardedPorts, action_root.join('forward_ports')
|
300
314
|
autoload :HaltDomain, action_root.join('halt_domain')
|
301
315
|
autoload :HandleBoxImage, action_root.join('handle_box_image')
|
302
316
|
autoload :HandleStoragePool, action_root.join('handle_storage_pool')
|
@@ -308,6 +322,7 @@ module VagrantPlugins
|
|
308
322
|
autoload :MessageNotRunning, action_root.join('message_not_running')
|
309
323
|
autoload :MessageNotSuspended, action_root.join('message_not_suspended')
|
310
324
|
autoload :PrepareNFSSettings, action_root.join('prepare_nfs_settings')
|
325
|
+
autoload :PrepareNFSValidIds, action_root.join('prepare_nfs_valid_ids')
|
311
326
|
autoload :PruneNFSExports, action_root.join('prune_nfs_exports')
|
312
327
|
autoload :ReadSSHInfo, action_root.join('read_ssh_info')
|
313
328
|
autoload :ReadState, action_root.join('read_state')
|
@@ -10,7 +10,7 @@ module VagrantPlugins
|
|
10
10
|
# Networks for connecting those interfaces should be already prepared.
|
11
11
|
class CreateNetworkInterfaces
|
12
12
|
include VagrantPlugins::ProviderLibvirt::Util::ErbTemplate
|
13
|
-
include VagrantPlugins::ProviderLibvirt::Util::
|
13
|
+
include VagrantPlugins::ProviderLibvirt::Util::NetworkUtil
|
14
14
|
include Vagrant::Util::NetworkIP
|
15
15
|
include Vagrant::Util::ScopedHashOverride
|
16
16
|
|
@@ -36,14 +36,10 @@ module VagrantPlugins
|
|
36
36
|
# Vagrant gives you adapter 0 by default
|
37
37
|
|
38
38
|
# Assign interfaces to slots.
|
39
|
-
env
|
40
|
-
@logger.debug "In config found network type #{type} options #{options}"
|
39
|
+
configured_networks(env, @logger).each do |options|
|
41
40
|
|
42
|
-
#
|
43
|
-
|
44
|
-
# (:libvirt__network_name => ...).
|
45
|
-
options = scoped_hash_override(options, :libvirt)
|
46
|
-
options = { :netmask => '255.255.255.0', :iface_type => type }.merge(options)
|
41
|
+
# dont need to create interface for this type
|
42
|
+
next if options[:iface_type] == :forwarded_port
|
47
43
|
|
48
44
|
# TODO fill first ifaces with adapter option specified.
|
49
45
|
if options[:adapter]
|
@@ -103,9 +99,9 @@ module VagrantPlugins
|
|
103
99
|
networks_to_configure = []
|
104
100
|
|
105
101
|
adapters.each_with_index do |options, slot_number|
|
106
|
-
# Skip configuring
|
107
|
-
# it has to be available during provisioning
|
108
|
-
# not acceptable here.
|
102
|
+
# Skip configuring the management network, which is on the first interface.
|
103
|
+
# It's used for provisioning and it has to be available during provisioning,
|
104
|
+
# ifdown command is not acceptable here.
|
109
105
|
next if slot_number == 0
|
110
106
|
@logger.debug "Configuring interface slot_number #{slot_number} options #{options}"
|
111
107
|
|
@@ -161,13 +157,7 @@ module VagrantPlugins
|
|
161
157
|
end
|
162
158
|
end
|
163
159
|
|
164
|
-
|
165
|
-
# because the first network is of type forwarded_port.
|
166
|
-
# this is confusing.
|
167
|
-
# TODO only iterate over networks of type private_network
|
168
|
-
# and prepend the management network to that list
|
169
|
-
@logger.debug "Did not find network so using default of #{@management_network_name}"
|
170
|
-
@management_network_name
|
160
|
+
raise NetworkNotAvailableError, network_name: options[:ip]
|
171
161
|
end
|
172
162
|
end
|
173
163
|
end
|
@@ -12,7 +12,7 @@ module VagrantPlugins
|
|
12
12
|
include Vagrant::Util::NetworkIP
|
13
13
|
include Vagrant::Util::ScopedHashOverride
|
14
14
|
include VagrantPlugins::ProviderLibvirt::Util::ErbTemplate
|
15
|
-
include VagrantPlugins::ProviderLibvirt::Util::
|
15
|
+
include VagrantPlugins::ProviderLibvirt::Util::NetworkUtil
|
16
16
|
|
17
17
|
@@lock = Mutex.new
|
18
18
|
|
@@ -27,63 +27,15 @@ module VagrantPlugins
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def call(env)
|
30
|
-
|
31
|
-
management_network_name = env[:machine].provider_config.management_network_name
|
32
|
-
management_network_address = env[:machine].provider_config.management_network_address
|
33
|
-
@logger.info "Using #{management_network_name} at #{management_network_address} as the management network"
|
34
|
-
|
35
|
-
begin
|
36
|
-
management_network_ip = IPAddr.new(management_network_address)
|
37
|
-
rescue ArgumentError
|
38
|
-
raise Errors::ManagementNetworkError,
|
39
|
-
error_message: "#{management_network_address} is not a valid IP address"
|
40
|
-
end
|
41
|
-
|
42
|
-
# capture address into $1 and mask into $2
|
43
|
-
management_network_ip.inspect =~ /IPv4:(.*)\/(.*)>/
|
44
|
-
|
45
|
-
if $2 == '255.255.255.255'
|
46
|
-
raise Errors::ManagementNetworkError,
|
47
|
-
error_message: "#{management_network_address} does not include both an address and subnet mask"
|
48
|
-
end
|
49
|
-
|
50
|
-
management_network_options = {
|
51
|
-
network_name: management_network_name,
|
52
|
-
ip: $1,
|
53
|
-
netmask: $2,
|
54
|
-
dhcp_enabled: true,
|
55
|
-
forward_mode: 'nat',
|
56
|
-
}
|
57
|
-
|
58
|
-
# add management network to list of networks to check
|
59
|
-
networks = [ management_network_options ]
|
60
|
-
|
61
|
-
env[:machine].config.vm.networks.each do |type, original_options|
|
62
|
-
# There are two other types public network and port forwarding,
|
63
|
-
# but there are problems with creating them via libvirt API,
|
64
|
-
# so this provider doesn't implement them.
|
65
|
-
next if type != :private_network
|
66
|
-
# Options can be specified in Vagrantfile in short format (:ip => ...),
|
67
|
-
# or provider format # (:libvirt__network_name => ...).
|
68
|
-
# https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/util/scoped_hash_override.rb
|
69
|
-
options = scoped_hash_override(original_options, :libvirt)
|
70
|
-
# use default values if not already set
|
71
|
-
options = {
|
72
|
-
netmask: '255.255.255.0',
|
73
|
-
dhcp_enabled: true,
|
74
|
-
forward_mode: 'nat',
|
75
|
-
}.merge(options)
|
76
|
-
# add to list of networks to check
|
77
|
-
networks.push(options)
|
78
|
-
end
|
79
|
-
|
80
30
|
# only one vm at a time should try to set up networks
|
81
31
|
# otherwise they'll have inconsitent views of current state
|
82
32
|
# and conduct redundant operations that cause errors
|
83
33
|
@@lock.synchronize do
|
84
34
|
# Iterate over networks If some network is not
|
85
35
|
# available, create it if possible. Otherwise raise an error.
|
86
|
-
|
36
|
+
configured_networks(env, @logger).each do |options|
|
37
|
+
# Only need to create private networks
|
38
|
+
next if options[:iface_type] != :private_network
|
87
39
|
@logger.debug "Searching for network with options #{options}"
|
88
40
|
|
89
41
|
# should fix other methods so this doesn't have to be instance var
|
@@ -0,0 +1,164 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderLibvirt
|
3
|
+
module Action
|
4
|
+
# Adds support for vagrant's `forward_ports` configuration directive.
|
5
|
+
class ForwardPorts
|
6
|
+
def initialize(app, env)
|
7
|
+
@app = app
|
8
|
+
@logger = Log4r::Logger.new('vagrant_libvirt::action::forward_ports')
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
@env = env
|
13
|
+
|
14
|
+
# Get the ports we're forwarding
|
15
|
+
env[:forwarded_ports] = compile_forwarded_ports(env[:machine].config)
|
16
|
+
|
17
|
+
# Warn if we're port forwarding to any privileged ports
|
18
|
+
env[:forwarded_ports].each do |fp|
|
19
|
+
if fp[:host] <= 1024
|
20
|
+
env[:ui].warn I18n.t(
|
21
|
+
'vagrant.actions.vm.forward_ports.privileged_ports'
|
22
|
+
)
|
23
|
+
break
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Continue, we need the VM to be booted in order to grab its IP
|
28
|
+
@app.call env
|
29
|
+
|
30
|
+
if @env[:forwarded_ports].any?
|
31
|
+
env[:ui].info I18n.t('vagrant.actions.vm.forward_ports.forwarding')
|
32
|
+
forward_ports
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def forward_ports
|
37
|
+
@env[:forwarded_ports].each do |fp|
|
38
|
+
message_attributes = {
|
39
|
+
adapter: 'eth0',
|
40
|
+
guest_port: fp[:guest],
|
41
|
+
host_port: fp[:host]
|
42
|
+
}
|
43
|
+
|
44
|
+
@env[:ui].info(I18n.t(
|
45
|
+
'vagrant.actions.vm.forward_ports.forwarding_entry',
|
46
|
+
message_attributes
|
47
|
+
))
|
48
|
+
|
49
|
+
ssh_pid = redirect_port(
|
50
|
+
@env[:machine].name,
|
51
|
+
fp[:host_ip] || '0.0.0.0',
|
52
|
+
fp[:host],
|
53
|
+
fp[:guest_ip] || @env[:machine].provider.ssh_info[:host],
|
54
|
+
fp[:guest]
|
55
|
+
)
|
56
|
+
store_ssh_pid(fp[:host], ssh_pid)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def compile_forwarded_ports(config)
|
63
|
+
mappings = {}
|
64
|
+
|
65
|
+
config.vm.networks.each do |type, options|
|
66
|
+
next if options[:disabled]
|
67
|
+
|
68
|
+
if type == :forwarded_port && options[:id] != 'ssh'
|
69
|
+
if options.fetch(:host_ip, '').to_s.strip.empty?
|
70
|
+
options.delete(:host_ip)
|
71
|
+
end
|
72
|
+
mappings[options[:host]] = options
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
mappings.values
|
77
|
+
end
|
78
|
+
|
79
|
+
def redirect_port(machine, host_ip, host_port, guest_ip, guest_port)
|
80
|
+
params = %W(
|
81
|
+
#{machine}
|
82
|
+
-L #{host_ip}:#{host_port}:#{guest_ip}:#{guest_port}
|
83
|
+
-N
|
84
|
+
).join(' ')
|
85
|
+
# TODO get options without shelling out
|
86
|
+
options = `vagrant ssh-config #{machine} | awk '{printf " -o "$1"="$2}'`
|
87
|
+
ssh_cmd = "ssh #{options} #{params}"
|
88
|
+
|
89
|
+
@logger.debug "Forwarding port with `#{ssh_cmd}`"
|
90
|
+
spawn(ssh_cmd, [:out, :err] => '/dev/null')
|
91
|
+
end
|
92
|
+
|
93
|
+
def store_ssh_pid(host_port, ssh_pid)
|
94
|
+
data_dir = @env[:machine].data_dir.join('pids')
|
95
|
+
data_dir.mkdir unless data_dir.directory?
|
96
|
+
|
97
|
+
data_dir.join("ssh_#{host_port}.pid").open('w') do |pid_file|
|
98
|
+
pid_file.write(ssh_pid)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
module VagrantPlugins
|
107
|
+
module ProviderLibvirt
|
108
|
+
module Action
|
109
|
+
# Cleans up ssh-forwarded ports on VM halt/destroy.
|
110
|
+
class ClearForwardedPorts
|
111
|
+
def initialize(app, env)
|
112
|
+
@app = app
|
113
|
+
@logger = Log4r::Logger.new(
|
114
|
+
'vagrant_libvirt::action::clear_forward_ports'
|
115
|
+
)
|
116
|
+
end
|
117
|
+
|
118
|
+
def call(env)
|
119
|
+
@env = env
|
120
|
+
|
121
|
+
if ssh_pids.any?
|
122
|
+
env[:ui].info I18n.t(
|
123
|
+
'vagrant.actions.vm.clear_forward_ports.deleting'
|
124
|
+
)
|
125
|
+
ssh_pids.each do |pid|
|
126
|
+
next unless ssh_pid?(pid)
|
127
|
+
@logger.debug "Killing pid #{pid}"
|
128
|
+
system "kill #{pid}"
|
129
|
+
end
|
130
|
+
|
131
|
+
@logger.info 'Removing ssh pid files'
|
132
|
+
remove_ssh_pids
|
133
|
+
else
|
134
|
+
@logger.info 'No ssh pids found'
|
135
|
+
end
|
136
|
+
|
137
|
+
@app.call env
|
138
|
+
end
|
139
|
+
|
140
|
+
protected
|
141
|
+
|
142
|
+
def ssh_pids
|
143
|
+
glob = @env[:machine].data_dir.join('pids').to_s + '/ssh_*.pid'
|
144
|
+
@ssh_pids = Dir[glob].map do |file|
|
145
|
+
File.read(file).strip.chomp
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def ssh_pid?(pid)
|
150
|
+
@logger.debug 'Checking if #{pid} is an ssh process '\
|
151
|
+
'with `ps -o cmd= #{pid}`'
|
152
|
+
`ps -o cmd= #{pid}`.strip.chomp =~ /ssh/
|
153
|
+
end
|
154
|
+
|
155
|
+
def remove_ssh_pids
|
156
|
+
glob = @env[:machine].data_dir.join('pids').to_s + '/ssh_*.pid'
|
157
|
+
Dir[glob].each do |file|
|
158
|
+
File.delete file
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -3,31 +3,35 @@ module VagrantPlugins
|
|
3
3
|
module ProviderLibvirt
|
4
4
|
module Action
|
5
5
|
class PrepareNFSSettings
|
6
|
+
include Vagrant::Action::Builtin::MixinSyncedFolders
|
7
|
+
|
6
8
|
def initialize(app,env)
|
7
9
|
@app = app
|
8
10
|
@logger = Log4r::Logger.new("vagrant::action::vm::nfs")
|
9
11
|
end
|
10
12
|
|
11
13
|
def call(env)
|
14
|
+
@machine = env[:machine]
|
12
15
|
@app.call(env)
|
13
16
|
|
14
|
-
using_nfs
|
15
|
-
env[:machine].config.vm.synced_folders.each do |id, opts|
|
16
|
-
if opts[:nfs]
|
17
|
-
using_nfs = true
|
18
|
-
break
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
if using_nfs
|
17
|
+
if using_nfs?
|
23
18
|
@logger.info("Using NFS, preparing NFS settings by reading host IP and machine IP")
|
24
19
|
env[:nfs_host_ip] = read_host_ip(env[:machine],env)
|
25
20
|
env[:nfs_machine_ip] = env[:machine].ssh_info[:host]
|
26
21
|
|
27
|
-
|
22
|
+
@logger.info("host IP: #{env[:nfs_host_ip]} machine IP: #{env[:nfs_machine_ip]}")
|
23
|
+
|
24
|
+
raise Vagrant::Errors::NFSNoHostonlyNetwork if !env[:nfs_machine_ip] || !env[:nfs_host_ip]
|
28
25
|
end
|
29
26
|
end
|
30
27
|
|
28
|
+
# We're using NFS if we have any synced folder with NFS configured. If
|
29
|
+
# we are not using NFS we don't need to do the extra work to
|
30
|
+
# populate these fields in the environment.
|
31
|
+
def using_nfs?
|
32
|
+
!!synced_folders(@machine)[:nfs]
|
33
|
+
end
|
34
|
+
|
31
35
|
# Returns the IP address of the first host only network adapter
|
32
36
|
#
|
33
37
|
# @param [Machine] machine
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module ProviderLibvirt
|
3
|
+
module Action
|
4
|
+
class PrepareNFSValidIds
|
5
|
+
def initialize(app, env)
|
6
|
+
@app = app
|
7
|
+
@logger = Log4r::Logger.new("vagrant::action::vm::nfs")
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
env[:nfs_valid_ids] = env[:libvirt_compute].servers.all.map(&:id)
|
12
|
+
@app.call(env)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -26,10 +26,7 @@ module VagrantPlugins
|
|
26
26
|
{}.tap do |result|
|
27
27
|
@env[:machine].config.vm.synced_folders.each do |id, data|
|
28
28
|
# Ignore NFS shared folders
|
29
|
-
next if !data[:nfs
|
30
|
-
|
31
|
-
# convert to NFS share
|
32
|
-
#data[:nfs] = true
|
29
|
+
next if !data[:type] == :nfs
|
33
30
|
|
34
31
|
# This to prevent overwriting the actual shared folders data
|
35
32
|
result[id] = data.dup
|
@@ -18,7 +18,7 @@ module VagrantPlugins
|
|
18
18
|
ssh_info = env[:machine].ssh_info
|
19
19
|
|
20
20
|
env[:machine].config.vm.synced_folders.each do |id, data|
|
21
|
-
next if data[:nfs
|
21
|
+
next if data[:type] == :nfs
|
22
22
|
proxycommand = "-o ProxyCommand='#{ssh_info[:proxy_command]}'" if ssh_info[:proxy_command]
|
23
23
|
hostpath = File.expand_path(data[:hostpath], env[:root_path])
|
24
24
|
guestpath = data[:guestpath]
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'vagrant-libvirt/util/timer'
|
2
2
|
|
3
3
|
module VagrantPlugins
|
4
4
|
module ProviderLibvirt
|
@@ -6,17 +6,14 @@ module VagrantPlugins
|
|
6
6
|
# This is the same as the builtin provision except it times the
|
7
7
|
# provisioner runs.
|
8
8
|
class TimedProvision < Vagrant::Action::Builtin::Provision
|
9
|
-
def run_provisioner(env
|
10
|
-
env[:ui].info(I18n.t("vagrant.actions.vm.provision.beginning",
|
11
|
-
:provisioner => name))
|
12
|
-
|
9
|
+
def run_provisioner(env)
|
13
10
|
timer = Util::Timer.time do
|
14
11
|
super
|
15
12
|
end
|
16
13
|
|
17
14
|
env[:metrics] ||= {}
|
18
|
-
env[:metrics][
|
19
|
-
env[:metrics][
|
15
|
+
env[:metrics]['provisioner_times'] ||= []
|
16
|
+
env[:metrics]['provisioner_times'] << [env[:provisioner].class.to_s, timer]
|
20
17
|
end
|
21
18
|
end
|
22
19
|
end
|
data/lib/vagrant-libvirt/util.rb
CHANGED
@@ -4,7 +4,7 @@ module VagrantPlugins
|
|
4
4
|
autoload :ErbTemplate, 'vagrant-libvirt/util/erb_template'
|
5
5
|
autoload :Collection, 'vagrant-libvirt/util/collection'
|
6
6
|
autoload :Timer, 'vagrant-libvirt/util/timer'
|
7
|
-
autoload :
|
7
|
+
autoload :NetworkUtil, 'vagrant-libvirt/util/network_util'
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'nokogiri'
|
2
|
+
require 'vagrant/util/network_ip'
|
3
|
+
|
4
|
+
module VagrantPlugins
|
5
|
+
module ProviderLibvirt
|
6
|
+
module Util
|
7
|
+
module NetworkUtil
|
8
|
+
include Vagrant::Util::NetworkIP
|
9
|
+
|
10
|
+
def configured_networks(env, logger)
|
11
|
+
management_network_name = env[:machine].provider_config.management_network_name
|
12
|
+
management_network_address = env[:machine].provider_config.management_network_address
|
13
|
+
logger.info "Using #{management_network_name} at #{management_network_address} as the management network"
|
14
|
+
|
15
|
+
begin
|
16
|
+
management_network_ip = IPAddr.new(management_network_address)
|
17
|
+
rescue ArgumentError
|
18
|
+
raise Errors::ManagementNetworkError,
|
19
|
+
error_message: "#{management_network_address} is not a valid IP address"
|
20
|
+
end
|
21
|
+
|
22
|
+
# capture address into $1 and mask into $2
|
23
|
+
management_network_ip.inspect =~ /IPv4:(.*)\/(.*)>/
|
24
|
+
|
25
|
+
if $2 == '255.255.255.255'
|
26
|
+
raise Errors::ManagementNetworkError,
|
27
|
+
error_message: "#{management_network_address} does not include both an address and subnet mask"
|
28
|
+
end
|
29
|
+
|
30
|
+
management_network_options = {
|
31
|
+
iface_type: :private_network,
|
32
|
+
network_name: management_network_name,
|
33
|
+
ip: $1,
|
34
|
+
netmask: $2,
|
35
|
+
dhcp_enabled: true,
|
36
|
+
forward_mode: 'nat',
|
37
|
+
}
|
38
|
+
|
39
|
+
# add management network to list of networks to check
|
40
|
+
networks = [ management_network_options ]
|
41
|
+
|
42
|
+
env[:machine].config.vm.networks.each do |type, original_options|
|
43
|
+
logger.debug "In config found network type #{type} options #{original_options}"
|
44
|
+
# Options can be specified in Vagrantfile in short format (:ip => ...),
|
45
|
+
# or provider format # (:libvirt__network_name => ...).
|
46
|
+
# https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/util/scoped_hash_override.rb
|
47
|
+
options = scoped_hash_override(original_options, :libvirt)
|
48
|
+
# store type in options
|
49
|
+
# use default values if not already set
|
50
|
+
options = {
|
51
|
+
iface_type: type,
|
52
|
+
netmask: '255.255.255.0',
|
53
|
+
dhcp_enabled: true,
|
54
|
+
forward_mode: 'nat',
|
55
|
+
}.merge(options)
|
56
|
+
# add to list of networks to check
|
57
|
+
networks.push(options)
|
58
|
+
end
|
59
|
+
|
60
|
+
return networks
|
61
|
+
end
|
62
|
+
|
63
|
+
# Return a list of all (active and inactive) libvirt networks as a list
|
64
|
+
# of hashes with their name, network address and status (active or not)
|
65
|
+
def libvirt_networks(libvirt_client)
|
66
|
+
libvirt_networks = []
|
67
|
+
|
68
|
+
active = libvirt_client.list_networks
|
69
|
+
inactive = libvirt_client.list_defined_networks
|
70
|
+
|
71
|
+
# Iterate over all (active and inactive) networks.
|
72
|
+
active.concat(inactive).each do |network_name|
|
73
|
+
libvirt_network = libvirt_client.lookup_network_by_name(
|
74
|
+
network_name)
|
75
|
+
|
76
|
+
# Parse ip address and netmask from the network xml description.
|
77
|
+
xml = Nokogiri::XML(libvirt_network.xml_desc)
|
78
|
+
ip = xml.xpath('/network/ip/@address').first
|
79
|
+
ip = ip.value if ip
|
80
|
+
netmask = xml.xpath('/network/ip/@netmask').first
|
81
|
+
netmask = netmask.value if netmask
|
82
|
+
|
83
|
+
if xml.at_xpath('//network/ip/dhcp')
|
84
|
+
dhcp_enabled = true
|
85
|
+
else
|
86
|
+
dhcp_enabled = false
|
87
|
+
end
|
88
|
+
|
89
|
+
# Calculate network address of network from ip address and
|
90
|
+
# netmask.
|
91
|
+
if ip && netmask
|
92
|
+
network_address = network_address(ip, netmask)
|
93
|
+
else
|
94
|
+
network_address = nil
|
95
|
+
end
|
96
|
+
|
97
|
+
libvirt_networks << {
|
98
|
+
name: network_name,
|
99
|
+
ip_address: ip,
|
100
|
+
netmask: netmask,
|
101
|
+
network_address: network_address,
|
102
|
+
dhcp_enabled: dhcp_enabled,
|
103
|
+
bridge_name: libvirt_network.bridge_name,
|
104
|
+
created: true,
|
105
|
+
active: libvirt_network.active?,
|
106
|
+
autostart: libvirt_network.autostart?,
|
107
|
+
libvirt_network: libvirt_network
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
libvirt_networks
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/vagrant-libvirt.gemspec
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
require File.expand_path('../lib/vagrant-libvirt/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ['Lukas Stanek','Dima Vasilets']
|
6
|
-
gem.email = ['ls@elostech.cz','pronix.service@gmail.com']
|
5
|
+
gem.authors = ['Lukas Stanek','Dima Vasilets','Brian Pitts']
|
6
|
+
gem.email = ['ls@elostech.cz','pronix.service@gmail.com','brian@polibyte.com']
|
7
7
|
gem.license = 'MIT'
|
8
8
|
gem.description = %q{Vagrant provider for libvirt.}
|
9
9
|
gem.summary = %q{Vagrant provider for libvirt.}
|
10
|
-
gem.homepage =
|
10
|
+
gem.homepage = 'https://github.com/pradels/vagrant-libvirt'
|
11
11
|
|
12
12
|
gem.files = `git ls-files`.split($\)
|
13
13
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -16,9 +16,9 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.require_paths = ['lib']
|
17
17
|
gem.version = VagrantPlugins::ProviderLibvirt::VERSION
|
18
18
|
|
19
|
-
gem.add_runtime_dependency 'fog', '1.15
|
19
|
+
gem.add_runtime_dependency 'fog', '~> 1.15'
|
20
20
|
gem.add_runtime_dependency 'ruby-libvirt', '~> 0.4.0'
|
21
|
-
gem.add_runtime_dependency 'nokogiri', '1.5.
|
21
|
+
gem.add_runtime_dependency 'nokogiri', '~> 1.5.9'
|
22
22
|
|
23
23
|
gem.add_development_dependency 'rake'
|
24
24
|
end
|
metadata
CHANGED
@@ -1,30 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-libvirt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lukas Stanek
|
8
8
|
- Dima Vasilets
|
9
|
+
- Brian Pitts
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2014-01
|
13
|
+
date: 2014-02-01 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: fog
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
18
|
requirements:
|
18
|
-
- -
|
19
|
+
- - "~>"
|
19
20
|
- !ruby/object:Gem::Version
|
20
|
-
version: 1.15
|
21
|
+
version: '1.15'
|
21
22
|
type: :runtime
|
22
23
|
prerelease: false
|
23
24
|
version_requirements: !ruby/object:Gem::Requirement
|
24
25
|
requirements:
|
25
|
-
- -
|
26
|
+
- - "~>"
|
26
27
|
- !ruby/object:Gem::Version
|
27
|
-
version: 1.15
|
28
|
+
version: '1.15'
|
28
29
|
- !ruby/object:Gem::Dependency
|
29
30
|
name: ruby-libvirt
|
30
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -43,16 +44,16 @@ dependencies:
|
|
43
44
|
name: nokogiri
|
44
45
|
requirement: !ruby/object:Gem::Requirement
|
45
46
|
requirements:
|
46
|
-
- -
|
47
|
+
- - "~>"
|
47
48
|
- !ruby/object:Gem::Version
|
48
|
-
version: 1.5.
|
49
|
+
version: 1.5.9
|
49
50
|
type: :runtime
|
50
51
|
prerelease: false
|
51
52
|
version_requirements: !ruby/object:Gem::Requirement
|
52
53
|
requirements:
|
53
|
-
- -
|
54
|
+
- - "~>"
|
54
55
|
- !ruby/object:Gem::Version
|
55
|
-
version: 1.5.
|
56
|
+
version: 1.5.9
|
56
57
|
- !ruby/object:Gem::Dependency
|
57
58
|
name: rake
|
58
59
|
requirement: !ruby/object:Gem::Requirement
|
@@ -71,6 +72,7 @@ description: Vagrant provider for libvirt.
|
|
71
72
|
email:
|
72
73
|
- ls@elostech.cz
|
73
74
|
- pronix.service@gmail.com
|
75
|
+
- brian@polibyte.com
|
74
76
|
executables: []
|
75
77
|
extensions: []
|
76
78
|
extra_rdoc_files: []
|
@@ -93,6 +95,7 @@ files:
|
|
93
95
|
- lib/vagrant-libvirt/action/create_networks.rb
|
94
96
|
- lib/vagrant-libvirt/action/destroy_domain.rb
|
95
97
|
- lib/vagrant-libvirt/action/destroy_networks.rb
|
98
|
+
- lib/vagrant-libvirt/action/forward_ports.rb
|
96
99
|
- lib/vagrant-libvirt/action/halt_domain.rb
|
97
100
|
- lib/vagrant-libvirt/action/handle_box_image.rb
|
98
101
|
- lib/vagrant-libvirt/action/handle_storage_pool.rb
|
@@ -104,6 +107,7 @@ files:
|
|
104
107
|
- lib/vagrant-libvirt/action/message_not_running.rb
|
105
108
|
- lib/vagrant-libvirt/action/message_not_suspended.rb
|
106
109
|
- lib/vagrant-libvirt/action/prepare_nfs_settings.rb
|
110
|
+
- lib/vagrant-libvirt/action/prepare_nfs_valid_ids.rb
|
107
111
|
- lib/vagrant-libvirt/action/prune_nfs_exports.rb
|
108
112
|
- lib/vagrant-libvirt/action/read_ssh_info.rb
|
109
113
|
- lib/vagrant-libvirt/action/read_state.rb
|
@@ -128,7 +132,7 @@ files:
|
|
128
132
|
- lib/vagrant-libvirt/util.rb
|
129
133
|
- lib/vagrant-libvirt/util/collection.rb
|
130
134
|
- lib/vagrant-libvirt/util/erb_template.rb
|
131
|
-
- lib/vagrant-libvirt/util/
|
135
|
+
- lib/vagrant-libvirt/util/network_util.rb
|
132
136
|
- lib/vagrant-libvirt/util/timer.rb
|
133
137
|
- lib/vagrant-libvirt/version.rb
|
134
138
|
- locales/en.yml
|
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
require 'vagrant/util/network_ip'
|
3
|
-
|
4
|
-
module VagrantPlugins
|
5
|
-
module ProviderLibvirt
|
6
|
-
module Util
|
7
|
-
module LibvirtUtil
|
8
|
-
include Vagrant::Util::NetworkIP
|
9
|
-
|
10
|
-
# Return a list of all (active and inactive) libvirt networks as a list
|
11
|
-
# of hashes with their name, network address and status (active or not)
|
12
|
-
def libvirt_networks(libvirt_client)
|
13
|
-
libvirt_networks = []
|
14
|
-
|
15
|
-
active = libvirt_client.list_networks
|
16
|
-
inactive = libvirt_client.list_defined_networks
|
17
|
-
|
18
|
-
# Iterate over all (active and inactive) networks.
|
19
|
-
active.concat(inactive).each do |network_name|
|
20
|
-
libvirt_network = libvirt_client.lookup_network_by_name(
|
21
|
-
network_name)
|
22
|
-
|
23
|
-
# Parse ip address and netmask from the network xml description.
|
24
|
-
xml = Nokogiri::XML(libvirt_network.xml_desc)
|
25
|
-
ip = xml.xpath('/network/ip/@address').first
|
26
|
-
ip = ip.value if ip
|
27
|
-
netmask = xml.xpath('/network/ip/@netmask').first
|
28
|
-
netmask = netmask.value if netmask
|
29
|
-
|
30
|
-
if xml.at_xpath('//network/ip/dhcp')
|
31
|
-
dhcp_enabled = true
|
32
|
-
else
|
33
|
-
dhcp_enabled = false
|
34
|
-
end
|
35
|
-
|
36
|
-
# Calculate network address of network from ip address and
|
37
|
-
# netmask.
|
38
|
-
if ip && netmask
|
39
|
-
network_address = network_address(ip, netmask)
|
40
|
-
else
|
41
|
-
network_address = nil
|
42
|
-
end
|
43
|
-
|
44
|
-
libvirt_networks << {
|
45
|
-
name: network_name,
|
46
|
-
ip_address: ip,
|
47
|
-
netmask: netmask,
|
48
|
-
network_address: network_address,
|
49
|
-
dhcp_enabled: dhcp_enabled,
|
50
|
-
bridge_name: libvirt_network.bridge_name,
|
51
|
-
created: true,
|
52
|
-
active: libvirt_network.active?,
|
53
|
-
autostart: libvirt_network.autostart?,
|
54
|
-
libvirt_network: libvirt_network
|
55
|
-
}
|
56
|
-
end
|
57
|
-
|
58
|
-
libvirt_networks
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|