vagrant-hosts 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,6 +1,20 @@
1
1
  CHANGELOG
2
2
  =========
3
3
 
4
+ 1.1.2
5
+ -----
6
+
7
+ 2013-08-07
8
+
9
+ This is a backwards compatible bugfix release.
10
+
11
+ * GH-6 provisioner `autoconfigure` option works with explicit hosts
12
+ * GH-7 all host aliases are respected
13
+ * Autoconfigured entries should ensure private_networks have an IP address
14
+ * Remove hardcoded dependency on virtualbox vm provider
15
+
16
+ Thanks to Tom Linkin for his help on this release.
17
+
4
18
  1.1.1
5
19
  -----
6
20
 
@@ -1,7 +1,6 @@
1
- # Declare top level vagrant hosts module.
2
1
  module VagrantHosts
3
- REQUIRED_VAGRANT_VERSION = '1.1.0'
2
+ require 'vagrant-hosts/version'
3
+ require 'vagrant-hosts/plugin'
4
4
  end
5
5
 
6
- require 'vagrant-hosts/version'
7
- require 'vagrant-hosts/plugin'
6
+ I18n.load_path << File.expand_path('../templates/locales/en.yml', File.dirname(__FILE__))
@@ -1,62 +1,66 @@
1
1
  require 'vagrant'
2
2
 
3
3
  module VagrantHosts
4
- class Config < Vagrant.plugin('2', :config)
4
+ class Config < Vagrant.plugin('2', :config)
5
5
 
6
- # @!attribute hosts
7
- # @return [Array<Array<String, Array<String>>>] A list of IP addresses and their aliases
8
- attr_reader :hosts
6
+ # @!attribute hosts
7
+ # @return [Array<Array<String, Array<String>>>] A list of IP addresses and their aliases
8
+ attr_reader :hosts
9
9
 
10
- # @!attribute autoconfigure
11
- # @return [TrueClass, FalseClass] If hosts should be generated from the
12
- # other vagrant machines
13
- attr_accessor :autoconfigure
10
+ # @!attribute autoconfigure
11
+ # @return [TrueClass, FalseClass] If hosts should be generated from the
12
+ # other vagrant machines
13
+ attr_accessor :autoconfigure
14
14
 
15
- def initialize
16
- @hosts = []
17
- @autoconfigure = UNSET_VALUE
18
- end
19
-
20
- # Register a host for entry
21
- #
22
- # @param [String] address The IP address for aliases
23
- # @param [Array] aliases An array of hostnames to assign to the IP address
24
- def add_host(address, aliases)
25
- @hosts << [address, aliases]
26
- end
15
+ def initialize
16
+ @hosts = []
17
+ @autoconfigure = UNSET_VALUE
18
+ end
27
19
 
28
- # All IPv6 multicast addresses
29
- def add_ipv6_multicast
30
- add_host '::1', ['ip6-localhost', 'ip6-loopback']
31
- add_host 'fe00::0', ['ip6-localnet']
32
- add_host 'ff00::0', ['ip6-mcastprefix']
33
- add_host 'ff02::1', ['ip6-allnodes']
34
- add_host 'ff02::2', ['ip6-allrouters']
35
- end
20
+ # Register a host for entry
21
+ #
22
+ # @param [String] address The IP address for aliases
23
+ # @param [Array] aliases An array of hostnames to assign to the IP address
24
+ def add_host(address, aliases)
25
+ @hosts << [address, aliases]
26
+ end
36
27
 
37
- def finalize!
38
- if @autoconfigure == UNSET_VALUE or @hosts.empty?
39
- @autoconfigure = true
28
+ # All IPv6 multicast addresses
29
+ def add_ipv6_multicast
30
+ add_host '::1', ['ip6-localhost', 'ip6-loopback']
31
+ add_host 'fe00::0', ['ip6-localnet']
32
+ add_host 'ff00::0', ['ip6-mcastprefix']
33
+ add_host 'ff02::1', ['ip6-allnodes']
34
+ add_host 'ff02::2', ['ip6-allrouters']
40
35
  end
41
- end
42
36
 
43
- # @param other [VagrantHosts::Config]
44
- # @return [VagrantHosts::Config] The merged results
45
- def merge(other)
46
- super.tap do |result|
47
- result.hosts += other.hosts
37
+ def finalize!
38
+ if @autoconfigure == UNSET_VALUE
39
+ if @hosts.empty?
40
+ @autoconfigure = true
41
+ else
42
+ @autoconfigure = false
43
+ end
44
+ end
48
45
  end
49
- end
50
46
 
51
- def validate(machine)
52
- errors = []
53
- @hosts.each do |(address, aliases)|
54
- unless aliases.is_a? Array
55
- errors << "#{address} should have an array of aliases, got #{aliases.inspect}:#{aliases.class}"
47
+ # @param other [VagrantHosts::Config]
48
+ # @return [VagrantHosts::Config] The merged results
49
+ def merge(other)
50
+ super.tap do |result|
51
+ result.hosts += other.hosts
56
52
  end
57
53
  end
58
54
 
59
- {"Vagrant Hosts" => errors}
55
+ def validate(machine)
56
+ errors = []
57
+ @hosts.each do |(address, aliases)|
58
+ unless aliases.is_a? Array
59
+ errors << "#{address} should have an array of aliases, got #{aliases.inspect}:#{aliases.class}"
60
+ end
61
+ end
62
+
63
+ {"Vagrant Hosts" => errors}
64
+ end
60
65
  end
61
66
  end
62
- end
@@ -0,0 +1,31 @@
1
+ require 'config_builder/model'
2
+
3
+ module VagrantHosts
4
+ module ConfigBuilder
5
+ class Model < ::ConfigBuilder::Model::Base
6
+
7
+ # @!attribute [rw] hosts
8
+ attr_accessor :hosts
9
+ # @!attribute [rw] autoconfigure
10
+ attr_accessor :autoconfigure
11
+
12
+ def initialize
13
+ @hosts = []
14
+ end
15
+
16
+ def to_proc
17
+ Proc.new do |vm_config|
18
+ vm_config.provision :hosts do |h_config|
19
+ h_config.autoconfigure = @autoconfigure if defined? @autoconfigure
20
+
21
+ @hosts.each do |(address, aliases)|
22
+ h_config.add_host address, aliases
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ ::ConfigBuilder::ModelCollection.provisioner.register('hosts', self)
29
+ end
30
+ end
31
+ end
@@ -2,11 +2,6 @@ require 'vagrant'
2
2
  require 'vagrant-hosts'
3
3
  require 'vagrant-hosts/version'
4
4
 
5
- if Vagrant::VERSION < VagrantHosts::REQUIRED_VAGRANT_VERSION
6
- raise "vagrant-hosts version #{VagrantHosts::VERSION} requires Vagrant " +
7
- "#{VagrantHosts::REQUIRED_VAGRANT_VERSION} or later"
8
- end
9
-
10
5
  class VagrantHosts::Plugin < Vagrant.plugin(2)
11
6
  name 'hosts'
12
7
 
@@ -24,4 +19,8 @@ class VagrantHosts::Plugin < Vagrant.plugin(2)
24
19
  require_relative 'config'
25
20
  VagrantHosts::Config
26
21
  end
22
+
23
+ action_hook(:hosts, :config_builder_extension) do
24
+ require_relative 'config_builder'
25
+ end
27
26
  end
@@ -2,95 +2,19 @@ require 'vagrant'
2
2
  require 'tempfile'
3
3
 
4
4
  module VagrantHosts
5
- class Provisioner < Vagrant.plugin('2', :provisioner)
5
+ class Provisioner < Vagrant.plugin('2', :provisioner)
6
6
 
7
- def initialize(machine, config)
8
- @machine, @config = machine, config
9
- end
10
-
11
- def provision
12
- # too tired to do this. detect target platform, select according provider,
13
- # add entries that are specified in the config and are not on the client
14
-
15
- driver = Linux.new(@machine, @config)
16
- driver.sync!
17
- end
18
-
19
- class Linux
20
-
21
- # This has to be inside of this class, because otherwise the hostname mixin
22
- # will create this class with a different superclass. It makes me sad. :(
23
7
  require 'vagrant-hosts/provisioner/hostname'
24
- include VagrantHosts::Provisioner::Hostname
25
-
8
+ require 'vagrant-hosts/provisioner/linux'
26
9
 
27
10
  def initialize(machine, config)
28
11
  @machine, @config = machine, config
29
12
  end
30
13
 
31
- def sync!
32
- upload_tmphosts
33
- update_hosts
34
- end
35
-
36
- private
37
-
38
- def upload_tmphosts
39
- cache = Tempfile.new('tmp-hosts')
40
- cache.write(format_hosts)
41
- cache.flush
42
- @machine.communicate.upload(cache.path, '/tmp/hosts')
43
- end
44
-
45
- def update_hosts
46
- hostname = @machine.config.vm.hostname || @machine.name.to_s
47
- change_host_name(hostname)
48
- @machine.communicate.sudo('install -m 644 /tmp/hosts /etc/hosts')
49
- end
50
-
51
- # Generates content appropriate for a linux hosts file
52
- #
53
- # @return [String] All hosts in the config joined into hosts records
54
- def format_hosts
55
- all_hosts.inject('') do |str, (address, aliases)|
56
- str << "#{address} #{aliases.join(' ')}\n"
57
- end
58
- end
59
-
60
- def all_hosts
61
- all_hosts = []
62
-
63
- if @config.autoconfigure
64
- all_hosts += vagrant_hosts
65
- else
66
- all_hosts += @config.hosts
67
- end
68
-
69
- all_hosts.unshift(['127.0.0.1', ['localhost']])
70
- all_hosts.unshift(['127.0.1.1', [@machine.name]])
71
- end
72
-
73
- def vagrant_hosts
74
- hosts = []
75
- env = @machine.env
76
- names = env.machine_names
77
-
78
- # Assume that all VMs are using the current provider
79
- provider = @machine.provider
80
-
81
- names.each do |name|
82
- network_settings = env.machine(name, :virtualbox).config.vm.networks
83
- hostname = env.machine(name, :virtualbox).config.vm.hostname
84
- network_settings.each do |entry|
85
- if entry[0] == :private_network
86
- ipaddr = entry[1][:ip]
87
- hosts << [ipaddr, [hostname, name]]
88
- end
89
- end
90
- end
91
-
92
- hosts
14
+ # @todo use guest capabilities instead of hardcoded provisioner provider
15
+ def provision
16
+ driver = Linux.new(@machine, @config)
17
+ driver.sync!
93
18
  end
94
19
  end
95
20
  end
96
- end
@@ -1,15 +1,17 @@
1
1
  require 'vagrant'
2
- require 'vagrant-hosts/provisioner'
2
+ require 'vagrant/errors'
3
3
 
4
- module VagrantHosts
5
- class Provisioner
6
- module Hostname
7
- # Abstract the details of setting a guest hostname on different versions of
8
- # Vagrant.
9
- #
10
- # Vagrant commit 61d2f9f96fc0f0ef5869c732674f25c4ccc85c8c converts the
11
- # #change_host_name # method to a capability, which breaks the API between
12
- # 1.1 and 1.2. :(
4
+ # Abstract the details of setting a guest hostname on different versions of
5
+ # Vagrant.
6
+ #
7
+ # Vagrant commit 61d2f9f96fc0f0ef5869c732674f25c4ccc85c8c converts the
8
+ # #change_host_name # method to a capability, which breaks the API between
9
+ # 1.1 and 1.2. :(
10
+ module VagrantHosts::Provisioner::Hostname
11
+
12
+ class UnknownVersion < Vagrant::Errors::VagrantError
13
+ error_key(:unknown_version, 'vagrant_hosts')
14
+ end
13
15
 
14
16
  # @param name [String] The new hostname to apply on the guest
15
17
  def change_host_name(name)
@@ -19,10 +21,7 @@ module Hostname
19
21
  when /1\.2/
20
22
  @machine.guest.capability(:change_host_name, name)
21
23
  else
22
- raise RuntimeError, "#{Vagrant::VERSION} isn't a recognized Vagrant version, can't reliably shim `change_host_name`"
24
+ raise UnknownVersion, :vagrant_version => Vagrant::VERSION
23
25
  end
24
26
  end
25
-
26
- end
27
- end
28
27
  end
@@ -0,0 +1,80 @@
1
+ class VagrantHosts::Provisioner::Linux
2
+
3
+ include VagrantHosts::Provisioner::Hostname
4
+
5
+ def initialize(machine, config)
6
+ @machine, @config = machine, config
7
+
8
+ @env = @machine.env
9
+ end
10
+
11
+ def sync!
12
+ upload_tmphosts
13
+ update_hosts
14
+ end
15
+
16
+ private
17
+
18
+ def upload_tmphosts
19
+ cache = Tempfile.new('tmp-hosts')
20
+ cache.write(format_hosts)
21
+ cache.flush
22
+ @machine.communicate.upload(cache.path, '/tmp/hosts')
23
+ end
24
+
25
+ def update_hosts
26
+ hostname = @machine.config.vm.hostname || @machine.name.to_s
27
+ change_host_name(hostname)
28
+ @machine.communicate.sudo('install -m 644 /tmp/hosts /etc/hosts')
29
+ end
30
+
31
+ # Generates content appropriate for a linux hosts file
32
+ #
33
+ # @return [String] All hosts in the config joined into hosts records
34
+ def format_hosts
35
+ all_hosts.inject('') do |str, (address, aliases)|
36
+ str << "#{address} #{aliases.join(' ')}\n"
37
+ end
38
+ end
39
+
40
+ def all_hosts
41
+ all_hosts = []
42
+ all_hosts += local_hosts
43
+
44
+ if @config.autoconfigure
45
+ all_hosts += vagrant_hosts
46
+ end
47
+ all_hosts += @config.hosts
48
+
49
+ all_hosts
50
+ end
51
+
52
+ def local_hosts
53
+ [
54
+ ['127.0.0.1', ['localhost']],
55
+ ['127.0.1.1', [@machine.name]],
56
+ ]
57
+ end
58
+
59
+ def vagrant_hosts
60
+ hosts = []
61
+
62
+ all_machines.each do |m|
63
+ m_networks = m.config.vm.networks
64
+ m_hostname = m.config.vm.hostname
65
+
66
+ m_networks.each do |(net_type, opts)|
67
+ next unless net_types == :private_network
68
+ addr = opts[:ip]
69
+ hosts << [addr, [m_hostname, @machine.name]]
70
+ end
71
+ end
72
+
73
+ hosts
74
+ end
75
+
76
+ # @return [Array<Vagrant::Machine>]
77
+ def all_machines
78
+ @env.active_machines.map { |vm_id| @env.machine(*vm_id) }
79
+ end
80
+ end
@@ -1,3 +1,3 @@
1
1
  module VagrantHosts
2
- VERSION = '1.1.1'
2
+ VERSION = '1.1.2'
3
3
  end
@@ -0,0 +1,6 @@
1
+ ---
2
+ en:
3
+ vagrant_hosts:
4
+ unknown_version: |-
5
+ %{vagrant_version} isn't a recognized Vagrant version, vagrant-hosts can't reliably
6
+ detect the `change_host_name` method.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-hosts
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-08 00:00:00.000000000 Z
12
+ date: 2013-08-08 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! ' Manage static DNS entries and configuration for Vagrant guests.
15
15
 
@@ -24,10 +24,13 @@ files:
24
24
  - README.markdown
25
25
  - lib/vagrant-hosts.rb
26
26
  - lib/vagrant-hosts/config.rb
27
+ - lib/vagrant-hosts/config_builder.rb
27
28
  - lib/vagrant-hosts/plugin.rb
28
29
  - lib/vagrant-hosts/provisioner.rb
29
30
  - lib/vagrant-hosts/provisioner/hostname.rb
31
+ - lib/vagrant-hosts/provisioner/linux.rb
30
32
  - lib/vagrant-hosts/version.rb
33
+ - templates/locales/en.yml
31
34
  - vagrant-hosts.gemspec
32
35
  homepage: https://github.com/adrienthebo/vagrant-hosts
33
36
  licenses: