vagrant-hosts 2.6.2 → 2.7.0
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/CHANGELOG +19 -0
- data/Gemfile +2 -2
- data/README.markdown +72 -0
- data/lib/vagrant-hosts/addresses.rb +187 -2
- data/lib/vagrant-hosts/cap/sync_hosts/base.rb +0 -16
- data/lib/vagrant-hosts/cap/sync_hosts/posix.rb +11 -0
- data/lib/vagrant-hosts/config.rb +19 -1
- data/lib/vagrant-hosts/config_builder.rb +5 -35
- data/lib/vagrant-hosts/config_builder/0_x.rb +40 -0
- data/lib/vagrant-hosts/config_builder/1_x.rb +33 -0
- data/lib/vagrant-hosts/provisioner/hosts.rb +6 -2
- data/lib/vagrant-hosts/version.rb +1 -1
- data/spec/integration/addresses_spec.rb +115 -0
- data/spec/spec_helper.rb +2 -0
- data/vagrant-hosts.gemspec +2 -2
- metadata +18 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfff7593a5865f5cabdc74e7270a64c3e1f5de15
|
4
|
+
data.tar.gz: e4f29ffa5b3a999603dbe792a9ed75da87b9222b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 564de5beef4fc73fe719ffeaf728cf07f2e945e1acecb2bef30b53c8ac0deddaa7d187bfa722965747f1f31ab9120ebf83ef58fb6951f34980a32b9189a1cb05
|
7
|
+
data.tar.gz: 08b964be8d8ee3d53dfce11efb0b505078f92ea54ecbd8f29c2cbcb90b88e6ceb312bf1c217c1ebe4bfc427d0c1d66bf803db80681e85ef60d41045e280e0849
|
data/CHANGELOG
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
=========
|
3
3
|
|
4
|
+
2.7.0
|
5
|
+
-----
|
6
|
+
|
7
|
+
2016-03-28
|
8
|
+
|
9
|
+
This is a backwards compatible feature release.
|
10
|
+
|
11
|
+
* (GH-58) Added a flexible import/export system for sharing host entries among
|
12
|
+
groups of VMs.
|
13
|
+
|
14
|
+
* (GH-56) Added a special value, `@vagrant_ssh`, for host entries that will
|
15
|
+
be replaced with the address Vagrant uses to SSH into the VM.
|
16
|
+
|
17
|
+
* (GH-59) Made sync_hosts more friendly to VMs that have requiretty turned on.
|
18
|
+
|
19
|
+
* (GH-61) Fixed a bug where config_builder 0.x couldn't set the hosts array
|
20
|
+
on the hosts provisioner.
|
21
|
+
|
22
|
+
|
4
23
|
2.6.2
|
5
24
|
-----
|
6
25
|
|
data/Gemfile
CHANGED
@@ -20,8 +20,8 @@ group :test do
|
|
20
20
|
gem 'vagrant', :github => 'mitchellh/vagrant', :tag => ENV['TEST_VAGRANT_VERSION']
|
21
21
|
end
|
22
22
|
|
23
|
-
# Pinned on
|
24
|
-
gem 'vagrant-spec', :github => 'mitchellh/vagrant-spec', :ref => '
|
23
|
+
# Pinned on 2/21/2016. Compatible with Vagrant 1.6.x, 1.7.x and 1.8.x.
|
24
|
+
gem 'vagrant-spec', :github => 'mitchellh/vagrant-spec', :ref => '9bba7e1'
|
25
25
|
end
|
26
26
|
|
27
27
|
eval_gemfile "#{__FILE__}.local" if File.exists? "#{__FILE__}.local"
|
data/README.markdown
CHANGED
@@ -21,6 +21,16 @@ behaviors of each provisioner instance.
|
|
21
21
|
* Description: An array of tuples containing:
|
22
22
|
- An IP address
|
23
23
|
- A list of hostnames match with that address.
|
24
|
+
These entries may use special eys as described in the next section.
|
25
|
+
* Default: `[]`
|
26
|
+
* `exports`
|
27
|
+
* Description: A hash containing named lists of `[address, [aliases]]`
|
28
|
+
entries that are exported by this VM. These exports can be collected
|
29
|
+
by other VMs using the imports setting. These entries may use special
|
30
|
+
keys as described in the next section.
|
31
|
+
* Default: `{}`
|
32
|
+
* `imports`
|
33
|
+
* Description: A list of named exports to collect from other VMs.
|
24
34
|
* Default: `[]`
|
25
35
|
* `autoconfigure`
|
26
36
|
* Description: A boolean which controls whether hosts are pulled in from other machines.
|
@@ -32,6 +42,34 @@ behaviors of each provisioner instance.
|
|
32
42
|
* Description: A boolean which controls whether running the hosts provisioner causes an update on all other running machines.
|
33
43
|
This also happens during machine destruction.
|
34
44
|
* Default: `false`
|
45
|
+
* `sync_hosts`
|
46
|
+
* Description: A boolean which controls whether running the hosts provisioner causes an update on all other running machines.
|
47
|
+
This also happens during machine destruction.
|
48
|
+
* Default: `false`
|
49
|
+
|
50
|
+
### Special Keys
|
51
|
+
|
52
|
+
The tuples used by the `hosts` and `exports` settings are of the form:
|
53
|
+
|
54
|
+
[address, [aliases]]
|
55
|
+
|
56
|
+
For each component, there are some special keys defined that will be replaced by
|
57
|
+
data determined from the VM.
|
58
|
+
|
59
|
+
For `address`, the following special keys may be used:
|
60
|
+
|
61
|
+
- `@vagrant_private_networks`: Expands to create one host entry with the given
|
62
|
+
`aliases` for each private network attached to a VM that has an explicitly
|
63
|
+
configured `ip` address. This is similar to the `autoconfigure` setting, but
|
64
|
+
gives control over which aliases are used.
|
65
|
+
|
66
|
+
- `@vagrant_ssh`: Expands to the IP address that `vagrant ssh` uses to connect
|
67
|
+
with the VM.
|
68
|
+
|
69
|
+
For `aliases`, the following special keys may be used:
|
70
|
+
|
71
|
+
- `@vagrant_hostnames`: Expands to an array of aliases containing:
|
72
|
+
<vm hostname> <first component of vm hostname> <vm name>
|
35
73
|
|
36
74
|
|
37
75
|
Example Usage
|
@@ -115,6 +153,40 @@ Vagrant.configure('2') do |config|
|
|
115
153
|
end
|
116
154
|
```
|
117
155
|
|
156
|
+
- - -
|
157
|
+
|
158
|
+
Use exports and special keys to share names among VMs:
|
159
|
+
|
160
|
+
```ruby
|
161
|
+
Vagrant.configure('2') do |config|
|
162
|
+
|
163
|
+
# A node running in a remote compute environment, such as AWS or OpenStack.
|
164
|
+
config.vm.define :cloud do |node|
|
165
|
+
node.vm.provision :hosts do |provisioner|
|
166
|
+
provisioner.sync_hosts = true
|
167
|
+
provisioner.exports = {
|
168
|
+
'global' => [
|
169
|
+
['@vagrant_ssh', ['@vagrant_hostnames']],
|
170
|
+
],
|
171
|
+
}
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
# A node running locally under Virtualbox
|
176
|
+
config.vm.define :local do |node|
|
177
|
+
node.vm.provision :hosts do |provisioner|
|
178
|
+
provisioner.sync_hosts = true
|
179
|
+
provisioner.imports = ['global', 'virtualbox']
|
180
|
+
provisioner.exports = {
|
181
|
+
'virtualbox' => [
|
182
|
+
['@vagrant_private_networks', ['@vagrant_hostnames']],
|
183
|
+
],
|
184
|
+
}
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
```
|
189
|
+
|
118
190
|
Vagrant Commands
|
119
191
|
----------------
|
120
192
|
|
@@ -1,5 +1,16 @@
|
|
1
|
+
require 'resolv'
|
2
|
+
require 'ipaddr'
|
3
|
+
|
1
4
|
module VagrantHosts::Addresses
|
2
5
|
|
6
|
+
# Cache for networking data
|
7
|
+
#
|
8
|
+
# @return [Hash{String => Hash{String => String}}]
|
9
|
+
# @private
|
10
|
+
#
|
11
|
+
# @since 2.7.0
|
12
|
+
CACHE ||= {}
|
13
|
+
|
3
14
|
private
|
4
15
|
|
5
16
|
def all_hosts(config)
|
@@ -9,9 +20,14 @@ module VagrantHosts::Addresses
|
|
9
20
|
if config.autoconfigure
|
10
21
|
all_hosts += vagrant_hosts(@env)
|
11
22
|
end
|
12
|
-
all_hosts += config.hosts
|
13
23
|
|
14
|
-
|
24
|
+
unless config.imports.empty?
|
25
|
+
all_hosts += collect_imports(@machine, config)
|
26
|
+
end
|
27
|
+
|
28
|
+
all_hosts += resolve_host_entries(config.hosts, @machine)
|
29
|
+
|
30
|
+
all_hosts.uniq
|
15
31
|
end
|
16
32
|
|
17
33
|
# Builds an array containing hostname and aliases for a given machine.
|
@@ -53,6 +69,164 @@ module VagrantHosts::Addresses
|
|
53
69
|
hosts
|
54
70
|
end
|
55
71
|
|
72
|
+
# Collect all hosts entries for a machine
|
73
|
+
#
|
74
|
+
# @param machine [Vagrant::Machine] A vagrant VM to perform collection upon.
|
75
|
+
# @param config [VagrantHosts::Config] A configuration object for the hosts
|
76
|
+
# provisioner.
|
77
|
+
#
|
78
|
+
# @return [Array<Array<IPAddr, Array<String>>>] A list of address, alias
|
79
|
+
# tuples.
|
80
|
+
#
|
81
|
+
# @since 2.7.0
|
82
|
+
def collect_imports(machine, config)
|
83
|
+
env = machine.env
|
84
|
+
imports = config.imports
|
85
|
+
|
86
|
+
# TODO: Use Set?
|
87
|
+
hosts = []
|
88
|
+
|
89
|
+
all_machines(env).each do |m|
|
90
|
+
next if m.name == machine.name
|
91
|
+
|
92
|
+
host_provisioners(m).each do |p|
|
93
|
+
imports.each do |k|
|
94
|
+
next unless p.config.exports.has_key?(k)
|
95
|
+
hosts.concat resolve_host_entries(p.config.exports[k], m)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
hosts.uniq
|
101
|
+
end
|
102
|
+
|
103
|
+
# Generate a list of IP addresses and aliases for a vagrant machine
|
104
|
+
#
|
105
|
+
# This functionresolves a list of addresses and aliases, possibly including
|
106
|
+
# special keys, into a list of addresses and aliases.
|
107
|
+
#
|
108
|
+
# See {#resolve_addresses} and {#resolve_aliases} for special key handling.
|
109
|
+
#
|
110
|
+
# @param entries[Array<String, Array<String>>] A list of entries.
|
111
|
+
#
|
112
|
+
# @raise [IPAddr::InvalidAddressError] Raised when an invalid address is
|
113
|
+
# supplied.
|
114
|
+
# @raise [Resolv::ResolvError] When a hostname cannot be resolved to an IP.
|
115
|
+
#
|
116
|
+
# @return [Array<IPAddr, Array<String>>]
|
117
|
+
#
|
118
|
+
# @since 2.7.0
|
119
|
+
def resolve_host_entries(entries, machine)
|
120
|
+
entries.flat_map do |(address, aliases)|
|
121
|
+
names = resolve_aliases(aliases, machine)
|
122
|
+
resolve_addresses(address, machine).map {|ip| [resolve_ip(ip), names]}
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# Generate a list of IP addresses for a vagrant machine
|
127
|
+
#
|
128
|
+
# This function resolves an address or special key into a list of
|
129
|
+
# IP addresses.
|
130
|
+
#
|
131
|
+
# Special keys currently supported:
|
132
|
+
#
|
133
|
+
# - `@vagrant_private_networks`: The IP addresses of each privte network
|
134
|
+
# attached to the machine.
|
135
|
+
#
|
136
|
+
# - `@vagrant_ssh`: The IP address used by Vagrant to communicate with the
|
137
|
+
# machine (also includes WinRM and other communicators).
|
138
|
+
#
|
139
|
+
# @param aliases [String] An IP address or special key.
|
140
|
+
# @param machine [Vagrant::Machine] The Vagrant machine to use when resolving
|
141
|
+
# addresses.
|
142
|
+
#
|
143
|
+
# @return [Array<String>] A list of addresses.
|
144
|
+
#
|
145
|
+
# @since 2.7.0
|
146
|
+
def resolve_addresses(address, machine)
|
147
|
+
# Some network addresses, such as ssh_info, can be expensive to
|
148
|
+
# look up from cloud environments such as AWS, vSphere and OpenStack.
|
149
|
+
# So, we cache these special keys.
|
150
|
+
if CACHE.key?(machine.name) && CACHE[machine.name].key?(address)
|
151
|
+
ips = CACHE[machine.name][address]
|
152
|
+
else
|
153
|
+
ips = case address
|
154
|
+
when '@vagrant_private_networks'
|
155
|
+
machine.config.vm.networks.map do |(net_type, opts)|
|
156
|
+
next unless net_type == :private_network
|
157
|
+
opts[:ip]
|
158
|
+
end.compact
|
159
|
+
when '@vagrant_ssh'
|
160
|
+
if (info = machine.ssh_info)
|
161
|
+
info[:host]
|
162
|
+
else
|
163
|
+
[]
|
164
|
+
end
|
165
|
+
else
|
166
|
+
address
|
167
|
+
end
|
168
|
+
|
169
|
+
if address.start_with?('@')
|
170
|
+
CACHE[machine.name] ||= {}
|
171
|
+
CACHE[machine.name][address] = ips
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
Array(ips)
|
176
|
+
end
|
177
|
+
|
178
|
+
# Generate an list of IP addresses from a string
|
179
|
+
#
|
180
|
+
# This function resolves a string into an IP address.
|
181
|
+
# IP addresses.
|
182
|
+
#
|
183
|
+
# @param address [String] A string that might be an IP address or a hostname.
|
184
|
+
#
|
185
|
+
# @raise [IPAddr::InvalidAddressError] Raised when an invalid address is
|
186
|
+
# supplied.
|
187
|
+
# @raise [Resolv::ResolvError] When a hostname cannot be resolved to an IP.
|
188
|
+
#
|
189
|
+
# @return [IPAddr] An IP address.
|
190
|
+
#
|
191
|
+
# @since 2.7.0
|
192
|
+
def resolve_ip(address)
|
193
|
+
ip = begin
|
194
|
+
IPAddr.new(address)
|
195
|
+
rescue IPAddr::InvalidAddressError
|
196
|
+
# Wasn't an IP address. Resolve it. The AWS provider does this.
|
197
|
+
IPAddr.new(Resolv.getaddress(address))
|
198
|
+
end
|
199
|
+
|
200
|
+
ip
|
201
|
+
end
|
202
|
+
|
203
|
+
# Generate a list of hostnames for a vagrant machine
|
204
|
+
#
|
205
|
+
# This function resolves a list of hostnames or special keys into a list of
|
206
|
+
# hostnmaes.
|
207
|
+
#
|
208
|
+
# Special keys currently supported:
|
209
|
+
#
|
210
|
+
# - `@vagrant_hostnames`: See {#hostnames_for_machine}.
|
211
|
+
#
|
212
|
+
# @param aliases [Array<String>] A list of hostnames or special keys.
|
213
|
+
# @param machine [Vagrant::Machine] The Vagrant machine to use when resolving
|
214
|
+
# aliases.
|
215
|
+
#
|
216
|
+
# @return [Array<String>] A list of hostnames.
|
217
|
+
#
|
218
|
+
# @since 2.7.0
|
219
|
+
def resolve_aliases(aliases, machine)
|
220
|
+
aliases.flat_map do |a|
|
221
|
+
case a
|
222
|
+
when '@vagrant_hostnames'
|
223
|
+
hostnames_for_machine(machine)
|
224
|
+
else
|
225
|
+
a
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
56
230
|
# @return [Array<Vagrant::Machine>]
|
57
231
|
def all_machines(env)
|
58
232
|
env.active_machines.map do |vm_id|
|
@@ -64,4 +238,15 @@ module VagrantHosts::Addresses
|
|
64
238
|
end.compact
|
65
239
|
end
|
66
240
|
|
241
|
+
# NOTE: This method exists for compatibility with Vagrant 1.6 and earlier.
|
242
|
+
# Remove it once support for these versions is dropped.
|
243
|
+
def host_provisioners(machine)
|
244
|
+
machine.config.vm.provisioners.select do |p|
|
245
|
+
if Vagrant::VERSION < '1.7'
|
246
|
+
p.name.intern == :hosts
|
247
|
+
else
|
248
|
+
p.type.intern == :hosts
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
67
252
|
end
|
@@ -14,23 +14,7 @@ class VagrantHosts::Cap::SyncHosts::Base
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def sync!
|
17
|
-
hostname = @machine.config.vm.hostname || @machine.name.to_s
|
18
|
-
change_host_name(hostname)
|
19
|
-
|
20
17
|
# call to method not implemented by abstract base class
|
21
18
|
update_hosts
|
22
19
|
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
# @param name [String] The new hostname to apply on the guest
|
27
|
-
def change_host_name(name)
|
28
|
-
case Vagrant::VERSION
|
29
|
-
when /^1\.1/
|
30
|
-
@machine.guest.change_host_name(name)
|
31
|
-
else
|
32
|
-
@machine.guest.capability(:change_host_name, name)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
20
|
end
|
@@ -15,7 +15,18 @@ class VagrantHosts::Cap::SyncHosts::POSIX < VagrantHosts::Cap::SyncHosts::Base
|
|
15
15
|
|
16
16
|
def update_hosts
|
17
17
|
upload_tmphosts
|
18
|
+
|
19
|
+
# Switch to PTY mode as this provider may execute across multiple machines
|
20
|
+
# which may not have requiretty set to false (i.e. because they're still
|
21
|
+
# booting and scripts that disable requiretty haven't run yet). Not doing
|
22
|
+
# this can have nasty side effects --- such as preventing machines from
|
23
|
+
# being destroyed.
|
24
|
+
old_pty_setting = @machine.config.ssh.pty
|
25
|
+
@machine.config.ssh.pty = true
|
26
|
+
|
18
27
|
@machine.communicate.sudo('cat /tmp/hosts > /etc/hosts')
|
28
|
+
ensure
|
29
|
+
@machine.config.ssh.pty = old_pty_setting
|
19
30
|
end
|
20
31
|
|
21
32
|
# Generates content appropriate for a linux hosts file
|
data/lib/vagrant-hosts/config.rb
CHANGED
@@ -25,8 +25,26 @@ module VagrantHosts
|
|
25
25
|
# destruction. Defaults to `false`.
|
26
26
|
attr_accessor :sync_hosts
|
27
27
|
|
28
|
+
# @!attribute [rw] exports
|
29
|
+
# @return [Hash{String => Array<Array<String, Array<String>>>}]
|
30
|
+
# A hash containing named lists of `[address, [aliases]]` tuples
|
31
|
+
# that are exported by this VM. These exports can be collected by other
|
32
|
+
# VMs using the {#imports} option.
|
33
|
+
#
|
34
|
+
# @since 2.7.0
|
35
|
+
attr_accessor :exports
|
36
|
+
|
37
|
+
# @!attribute [rw] imports
|
38
|
+
# @return [Array<String>]
|
39
|
+
# A list of exports to collect from other VMs.
|
40
|
+
#
|
41
|
+
# @since 2.7.0
|
42
|
+
attr_accessor :imports
|
43
|
+
|
28
44
|
def initialize
|
29
45
|
@hosts = []
|
46
|
+
@exports = {}
|
47
|
+
@imports = []
|
30
48
|
@autoconfigure = UNSET_VALUE
|
31
49
|
@add_localhost_hostnames = UNSET_VALUE
|
32
50
|
@sync_hosts = UNSET_VALUE
|
@@ -51,7 +69,7 @@ module VagrantHosts
|
|
51
69
|
|
52
70
|
def finalize!
|
53
71
|
if @autoconfigure == UNSET_VALUE
|
54
|
-
if @hosts.empty?
|
72
|
+
if @hosts.empty? && @imports.empty?
|
55
73
|
@autoconfigure = true
|
56
74
|
else
|
57
75
|
@autoconfigure = false
|
@@ -1,37 +1,7 @@
|
|
1
|
-
require 'config_builder/
|
1
|
+
require 'config_builder/version'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# @!attribute [rw] hosts
|
8
|
-
attr_accessor :hosts
|
9
|
-
# @!attribute [rw] autoconfigure
|
10
|
-
attr_accessor :autoconfigure
|
11
|
-
# @!attribute [rw] add_localhost_hostnames
|
12
|
-
attr_accessor :add_localhost_hostnames
|
13
|
-
# @!attribute [rw] sync_hosts
|
14
|
-
attr_accessor :sync_hosts
|
15
|
-
|
16
|
-
def initialize
|
17
|
-
@hosts = []
|
18
|
-
end
|
19
|
-
|
20
|
-
def to_proc
|
21
|
-
Proc.new do |vm_config|
|
22
|
-
vm_config.provision :hosts do |h_config|
|
23
|
-
h_config.autoconfigure = attr(:autoconfigure) unless attr(:autoconfigure).nil?
|
24
|
-
h_config.add_localhost_hostnames = attr(:add_localhost_hostnames) unless attr(:add_localhost_hostnames).nil?
|
25
|
-
h_config.sync_hosts = attr(:sync_hosts) unless attr(:sync_hosts).nil?
|
26
|
-
|
27
|
-
@hosts.each do |(address, aliases)|
|
28
|
-
h_config.add_host address, aliases
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
::ConfigBuilder::Model::Provisioner.register('hosts', self)
|
35
|
-
end
|
36
|
-
end
|
3
|
+
if ConfigBuilder::VERSION > '1.0'
|
4
|
+
require_relative 'config_builder/1_x.rb'
|
5
|
+
else
|
6
|
+
require_relative 'config_builder/0_x.rb'
|
37
7
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'config_builder/model'
|
2
|
+
|
3
|
+
# Integration with ConfigBuilder 0.x and older
|
4
|
+
module VagrantHosts
|
5
|
+
module ConfigBuilder
|
6
|
+
class Model < ::ConfigBuilder::Model::Base
|
7
|
+
|
8
|
+
# @!attribute [rw] hosts
|
9
|
+
attr_accessor :hosts
|
10
|
+
# @!attribute [rw] autoconfigure
|
11
|
+
attr_accessor :autoconfigure
|
12
|
+
# @!attribute [rw] add_localhost_hostnames
|
13
|
+
attr_accessor :add_localhost_hostnames
|
14
|
+
# @!attribute [rw] sync_hosts
|
15
|
+
attr_accessor :sync_hosts
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@defaults = {
|
19
|
+
:hosts => [],
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_proc
|
24
|
+
Proc.new do |vm_config|
|
25
|
+
vm_config.provision :hosts do |h_config|
|
26
|
+
h_config.autoconfigure = attr(:autoconfigure) unless attr(:autoconfigure).nil?
|
27
|
+
h_config.add_localhost_hostnames = attr(:add_localhost_hostnames) unless attr(:add_localhost_hostnames).nil?
|
28
|
+
h_config.sync_hosts = attr(:sync_hosts) unless attr(:sync_hosts).nil?
|
29
|
+
|
30
|
+
attr(:hosts).each do |(address, aliases)|
|
31
|
+
h_config.add_host address, aliases
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
::ConfigBuilder::Model::Provisioner.register('hosts', self)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'config_builder/model'
|
2
|
+
|
3
|
+
# Integration with ConfigBuilder 1.x and newer
|
4
|
+
#
|
5
|
+
# @since 2.7.0
|
6
|
+
module VagrantHosts
|
7
|
+
module ConfigBuilder
|
8
|
+
class Model < ::ConfigBuilder::Model::Provisioner::Base
|
9
|
+
|
10
|
+
# @!attribute [rw] hosts
|
11
|
+
def_model_attribute :hosts
|
12
|
+
# @!attribute [rw] autoconfigure
|
13
|
+
def_model_attribute :autoconfigure
|
14
|
+
# @!attribute [rw] add_localhost_hostnames
|
15
|
+
def_model_attribute :add_localhost_hostnames
|
16
|
+
# @!attribute [rw] sync_hosts
|
17
|
+
def_model_attribute :sync_hosts
|
18
|
+
# @!attribute [rw] exports
|
19
|
+
def_model_attribute :exports
|
20
|
+
# @!attribute [rw] exports
|
21
|
+
def_model_attribute :imports
|
22
|
+
|
23
|
+
# @private
|
24
|
+
def configure_hosts(config, val)
|
25
|
+
val.each do |(address, aliases)|
|
26
|
+
config.add_host(address, aliases)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
::ConfigBuilder::Model::Provisioner.register('hosts', self)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -32,14 +32,18 @@ module VagrantHosts
|
|
32
32
|
# returning false (mitchellh/vagrant#6356).
|
33
33
|
false
|
34
34
|
end
|
35
|
-
has_hosts =
|
35
|
+
has_hosts = if Vagrant::VERSION < '1.7'
|
36
|
+
vm.config.vm.provisioners.any? {|p| p.name.intern == :hosts}
|
37
|
+
else
|
38
|
+
vm.config.vm.provisioners.any? {|p| p.type.intern == :hosts}
|
39
|
+
end
|
36
40
|
|
37
41
|
running && has_hosts && (not calling_machine)
|
38
42
|
end
|
39
43
|
|
40
44
|
machines_to_provision.each do |vm|
|
41
45
|
vm.ui.info "Updating hosts on: #{vm.name}"
|
42
|
-
vm.
|
46
|
+
host_provisioners(vm).each do |p|
|
43
47
|
# Duplicate the hosts configuration.
|
44
48
|
hosts_config = @config.class.new.merge(p.config)
|
45
49
|
# Set sync_hosts to false to avoid recursion.
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'vagrant-hosts/addresses'
|
4
|
+
require 'vagrant-hosts/config'
|
5
|
+
|
6
|
+
|
7
|
+
describe 'Vagrant Integration: VagrantHosts::Addresses' do
|
8
|
+
include_context 'vagrant-unit'
|
9
|
+
|
10
|
+
let(:test_env) {
|
11
|
+
env = isolated_environment
|
12
|
+
|
13
|
+
env.vagrantfile <<-EOF
|
14
|
+
Vagrant.configure('2') do |config|
|
15
|
+
config.vm.define 'machine-a' do |node|
|
16
|
+
node.vm.hostname = 'machine-a.testvm'
|
17
|
+
|
18
|
+
node.vm.network :private_network, ip: '10.40.1.1'
|
19
|
+
node.vm.network :private_network, ip: '10.40.1.3'
|
20
|
+
|
21
|
+
node.vm.provision 'hosts' do |p|
|
22
|
+
p.exports = {
|
23
|
+
'global' => [
|
24
|
+
['@vagrant_private_networks', ['@vagrant_hostnames']]
|
25
|
+
],
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
config.vm.define 'machine-b' do |node|
|
31
|
+
node.vm.network :private_network, ip: '10.40.1.2'
|
32
|
+
|
33
|
+
node.vm.provision 'hosts' do |p|
|
34
|
+
p.exports = {
|
35
|
+
'global' => [
|
36
|
+
['@vagrant_private_networks', ['@vagrant_hostnames']],
|
37
|
+
],
|
38
|
+
'ssh' => [
|
39
|
+
['@vagrant_ssh', ['@vagrant_hostnames']],
|
40
|
+
],
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
EOF
|
46
|
+
env
|
47
|
+
}
|
48
|
+
let(:env) {
|
49
|
+
test_env.create_vagrant_env(local_data_path: "#{test_env.workdir}/.vagrant")
|
50
|
+
}
|
51
|
+
let(:machine_a) { env.machine(:'machine-a', :dummy) }
|
52
|
+
let(:machine_b) { env.machine(:'machine-b', :dummy) }
|
53
|
+
|
54
|
+
subject do
|
55
|
+
# A simple class which simulates inclusion of VagrantHosts::Addresses
|
56
|
+
Class.new do
|
57
|
+
include VagrantHosts::Addresses
|
58
|
+
# Expose private methods included above for testing.
|
59
|
+
public *self.private_instance_methods
|
60
|
+
|
61
|
+
def initialize(env, machine)
|
62
|
+
# Create instance variables that VagrantHosts::Addresses expects to
|
63
|
+
# have access to.
|
64
|
+
@env = env
|
65
|
+
@machine = machine
|
66
|
+
end
|
67
|
+
end.new(env, machine_a)
|
68
|
+
end
|
69
|
+
|
70
|
+
# Mark test VMs as active.
|
71
|
+
before :each do
|
72
|
+
allow(env).to receive(:active_machines).and_return([
|
73
|
+
[:'machine-a', :dummy],
|
74
|
+
[:'machine-b', :dummy],
|
75
|
+
])
|
76
|
+
|
77
|
+
# Give Machine B a SSH address.
|
78
|
+
allow(machine_b).to receive(:ssh_info).and_return({:host => '10.40.1.4'})
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#vagrant_hosts' do
|
82
|
+
it 'returns private_network entries for each machine' do
|
83
|
+
expect(subject.vagrant_hosts(env)).to include(
|
84
|
+
['10.40.1.1', ['machine-a.testvm', 'machine-a']],
|
85
|
+
['10.40.1.3', ['machine-a.testvm', 'machine-a']],
|
86
|
+
['10.40.1.2', ['machine-b']],
|
87
|
+
)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#collect_imports' do
|
92
|
+
it 'returns imports from other machines' do
|
93
|
+
config = VagrantHosts::Config.new
|
94
|
+
config.imports = ['global', 'ssh']
|
95
|
+
config.finalize!
|
96
|
+
|
97
|
+
expect(subject.collect_imports(machine_a, config)).to eq([
|
98
|
+
[IPAddr.new('10.40.1.2'), ['machine-b']],
|
99
|
+
[IPAddr.new('10.40.1.4'), ['machine-b']],
|
100
|
+
])
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe '#all_hosts' do
|
105
|
+
it 'resolves special addresses and aliases' do
|
106
|
+
config = VagrantHosts::Config.new
|
107
|
+
config.add_host '@vagrant_private_networks', ['@vagrant_hostnames']
|
108
|
+
config.finalize!
|
109
|
+
|
110
|
+
expect(subject.all_hosts(config)).to include(
|
111
|
+
[IPAddr.new('10.40.1.1'), ['machine-a.testvm', 'machine-a']],
|
112
|
+
)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
data/spec/spec_helper.rb
CHANGED
data/vagrant-hosts.gemspec
CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |gem|
|
|
22
22
|
gem.files = %x{git ls-files -z}.split("\0")
|
23
23
|
gem.require_path = 'lib'
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
# Pinned for compatibility with vagrant-spec.
|
26
|
+
gem.add_development_dependency 'rake', '~> 10.0'
|
27
27
|
gem.add_development_dependency 'rspec', '~> 2.14.0'
|
28
28
|
end
|
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-hosts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adrien Thebo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '10.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '10.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rspec
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 2.14.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.14.0
|
41
41
|
description: |2
|
@@ -45,10 +45,10 @@ executables: []
|
|
45
45
|
extensions: []
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
|
-
- .gitignore
|
49
|
-
- .rspec
|
50
|
-
- .travis.yml
|
51
|
-
- .yardopts
|
48
|
+
- ".gitignore"
|
49
|
+
- ".rspec"
|
50
|
+
- ".travis.yml"
|
51
|
+
- ".yardopts"
|
52
52
|
- CHANGELOG
|
53
53
|
- Gemfile
|
54
54
|
- LICENSE
|
@@ -66,9 +66,12 @@ files:
|
|
66
66
|
- lib/vagrant-hosts/command/puppetize.rb
|
67
67
|
- lib/vagrant-hosts/config.rb
|
68
68
|
- lib/vagrant-hosts/config_builder.rb
|
69
|
+
- lib/vagrant-hosts/config_builder/0_x.rb
|
70
|
+
- lib/vagrant-hosts/config_builder/1_x.rb
|
69
71
|
- lib/vagrant-hosts/plugin.rb
|
70
72
|
- lib/vagrant-hosts/provisioner/hosts.rb
|
71
73
|
- lib/vagrant-hosts/version.rb
|
74
|
+
- spec/integration/addresses_spec.rb
|
72
75
|
- spec/spec_helper.rb
|
73
76
|
- spec/unit/config_spec.rb
|
74
77
|
- tasks/spec.rake
|
@@ -84,17 +87,17 @@ require_paths:
|
|
84
87
|
- lib
|
85
88
|
required_ruby_version: !ruby/object:Gem::Requirement
|
86
89
|
requirements:
|
87
|
-
- -
|
90
|
+
- - ">="
|
88
91
|
- !ruby/object:Gem::Version
|
89
92
|
version: '0'
|
90
93
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
94
|
requirements:
|
92
|
-
- -
|
95
|
+
- - ">="
|
93
96
|
- !ruby/object:Gem::Version
|
94
97
|
version: '0'
|
95
98
|
requirements: []
|
96
99
|
rubyforge_project:
|
97
|
-
rubygems_version: 2.
|
100
|
+
rubygems_version: 2.4.5.1
|
98
101
|
signing_key:
|
99
102
|
specification_version: 4
|
100
103
|
summary: Manage static DNS on vagrant guests
|