landrush 0.13.1 → 0.14.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9367fe3e35d41516cf4a30aaf8ac35b629c166d1
4
- data.tar.gz: 910fb953178c60bf1f51300c6ac97ed33a99b779
3
+ metadata.gz: ec605e64f20e01e018e99697a30959d6e853e08c
4
+ data.tar.gz: 9f277d17166bf5519773ef74a504a54599624ddf
5
5
  SHA512:
6
- metadata.gz: 1defc8f7a0e566f3532bf6c15d890e0c7eaeae1bcff90eb8af335645f9dbad8c6d1e4c2b6fb901880e1bb534a516b48acb41d6ddb368d8c19e3dc208b7a5e256
7
- data.tar.gz: 4874259e55c38e3949afcbb59b6fe46e74759876bd9fefa9dcba85d30635af1267893138bb88f44b3bc0d9fd72a819bf6cdcfa7f906ca3d4755c8ba10c1e315d
6
+ metadata.gz: 8b0f812b769d51e99b15402c0a8caf65e901f1b6055b1dbe4e1e788cfd1f1a4125a2337a9b67b667ab312186dc4b41da51b61261fcb5b4f9893881745bdde15f
7
+ data.tar.gz: 045f68ee5fd1ab4aea77c88a8ef53f16be68c415f97bf9763a406cd2ba3b1384cc0a0f7d21948a3feab29575e87e5bef68a5b25f0fed80d06ac80a2202050e5a
data/.travis.yml CHANGED
@@ -5,3 +5,4 @@ rvm:
5
5
 
6
6
  before_install:
7
7
  - sudo apt-get install dnsutils
8
+ - rvm @global do gem uninstall bundler -x && gem install bundler -v '~> 1.5.2' # For Vagrant 1.5
data/Gemfile CHANGED
@@ -14,7 +14,7 @@ end
14
14
  group :development do
15
15
  gem 'vagrant',
16
16
  :git => 'git://github.com/mitchellh/vagrant.git',
17
- :ref => 'v1.5.1'
17
+ :ref => 'v1.6.1'
18
18
 
19
19
  gem 'byebug'
20
20
  end
data/README.md CHANGED
@@ -18,7 +18,7 @@ Install under Vagrant (1.1 or later):
18
18
 
19
19
  Enable the plugin in your `Vagrantfile`:
20
20
 
21
- config.landrush.enable
21
+ config.landrush.enabled = true
22
22
 
23
23
  Bring up a machine that has a hostname set (see the `Vagrantfile` for an example)
24
24
 
data/examples/Vagrantfile CHANGED
@@ -9,9 +9,9 @@
9
9
  #
10
10
 
11
11
  Vagrant.configure("2") do |config|
12
- config.vm.box = "precise64"
12
+ config.vm.box = "hashicorp/precise64"
13
13
 
14
- config.landrush.enable
14
+ config.landrush.enabled = true
15
15
 
16
16
  config.vm.hostname = "myhost.vagrant.dev"
17
17
 
data/lib/landrush.rb CHANGED
@@ -15,6 +15,7 @@ module Landrush
15
15
  end
16
16
 
17
17
  require 'rubydns'
18
+ require 'ipaddr'
18
19
 
19
20
  require 'landrush/dependent_vms'
20
21
  require 'landrush/plugin'
@@ -52,8 +52,10 @@ module Landrush
52
52
  def setup_static_dns
53
53
  config.hosts.each do |hostname, dns_value|
54
54
  dns_value ||= machine.guest.capability(:read_host_visible_ip_address)
55
- info "adding static entry: #{hostname} => #{dns_value}"
56
- Store.hosts.set hostname, dns_value
55
+ if !Store.hosts.has?(hostname, dns_value)
56
+ info "adding static entry: #{hostname} => #{dns_value}"
57
+ Store.hosts.set hostname, dns_value
58
+ end
57
59
  end
58
60
  end
59
61
 
@@ -61,14 +63,15 @@ module Landrush
61
63
  ip_address = machine.config.landrush.host_ip_address ||
62
64
  machine.guest.capability(:read_host_visible_ip_address)
63
65
 
64
- info "adding machine entry: #{machine_hostname} => #{ip_address}"
65
-
66
66
  if not machine_hostname.match(config.tld)
67
67
  log :error, "hostname #{machine_hostname} does not match the configured TLD: #{config.tld}"
68
68
  log :error, "You will not be able to access #{machine_hostname} from the host"
69
69
  end
70
70
 
71
- Store.hosts.set(machine_hostname, ip_address)
71
+ if !Store.hosts.has?(machine_hostname, ip_address)
72
+ info "adding machine entry: #{machine_hostname} => #{ip_address}"
73
+ Store.hosts.set(machine_hostname, ip_address)
74
+ end
72
75
  end
73
76
 
74
77
  def private_network_exists?
@@ -16,21 +16,22 @@ module Landrush
16
16
  if DependentVMs.none?
17
17
  teardown_static_dns
18
18
  teardown_server
19
- else
20
- info "there are #{DependentVMs.count} VMs left, leaving DNS server and static entries"
21
- info DependentVMs.list.map { |dvm| " - #{dvm}" }.join("\n")
22
19
  end
23
20
  end
24
21
 
25
22
  def teardown_machine_dns
26
- info "removing machine entry: #{machine_hostname}"
27
- Store.hosts.delete(machine_hostname)
23
+ if Store.hosts.has? machine_hostname
24
+ info "removing machine entry: #{machine_hostname}"
25
+ Store.hosts.delete(machine_hostname)
26
+ end
28
27
  end
29
28
 
30
29
  def teardown_static_dns
31
30
  config.hosts.each do |static_hostname, _|
32
- info "removing static entry: #{static_hostname}"
33
- Store.hosts.delete static_hostname
31
+ if Store.hosts.has? static_hostname
32
+ info "removing static entry: #{static_hostname}"
33
+ Store.hosts.delete static_hostname
34
+ end
34
35
  end
35
36
  end
36
37
 
@@ -22,16 +22,24 @@ module Landrush
22
22
  # TODO: Find a better heuristic for this implementation.
23
23
  #
24
24
  def self.read_host_visible_ip_address(machine)
25
- result = ""
25
+ result = ""
26
26
  machine.communicate.execute(command) do |type, data|
27
27
  result << data if type == :stdout
28
28
  end
29
29
 
30
- result.chomp.split("\n").last
30
+ last_line = result.chomp.split("\n").last || ''
31
+ addresses = last_line.split(/\s+/).map { |address| IPAddr.new(address) }
32
+ addresses = addresses.reject { |address| address.ipv6? }
33
+
34
+ if addresses.empty?
35
+ raise "Cannot detect IP address, command `#{command}` returned `#{result}`"
36
+ end
37
+
38
+ addresses.last.to_s
31
39
  end
32
40
 
33
41
  def self.command
34
- %Q(hostname -I | awk -F' ' '{print $NF}')
42
+ %Q(hostname -I)
35
43
  end
36
44
  end
37
45
  end
@@ -1,19 +1,30 @@
1
1
  module Landrush
2
2
  class Config < Vagrant.plugin('2', :config)
3
3
  attr_accessor :hosts
4
+ attr_accessor :enabled
5
+ attr_accessor :tld
4
6
  attr_accessor :upstream_servers
5
7
  attr_accessor :host_ip_address
8
+ attr_accessor :guest_redirect_dns
9
+
10
+ DEFAULTS = {
11
+ :enabled => false,
12
+ :tld => 'vagrant.dev',
13
+ :upstream_servers => [[:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53]],
14
+ :host_ip_address => nil,
15
+ :guest_redirect_dns => true
16
+ }
6
17
 
7
18
  def initialize
8
19
  @hosts = {}
9
- @enabled = false
10
- @default_upstream = [[:udp, '8.8.8.8', 53], [:tcp, '8.8.8.8', 53]]
11
- @default_tld = 'vagrant.dev'
12
- @upstream_servers = @default_upstream
13
- @guest_redirect_dns = true
20
+ @enabled = UNSET_VALUE
21
+ @tld = UNSET_VALUE
22
+ @upstream_servers = UNSET_VALUE
23
+ @host_ip_address = UNSET_VALUE
24
+ @guest_redirect_dns = UNSET_VALUE
14
25
  end
15
26
 
16
- def enable(enabled=true)
27
+ def enable
17
28
  @enabled = true
18
29
  end
19
30
 
@@ -22,11 +33,7 @@ module Landrush
22
33
  end
23
34
 
24
35
  def enabled?
25
- @enabled
26
- end
27
-
28
- def guest_redirect_dns=(guest_redirect_dns=true)
29
- @guest_redirect_dns=guest_redirect_dns
36
+ !!@enabled
30
37
  end
31
38
 
32
39
  def guest_redirect_dns?
@@ -37,16 +44,8 @@ module Landrush
37
44
  @hosts[hostname] = ip_address
38
45
  end
39
46
 
40
- def tld
41
- @tld ||= @default_tld
42
- end
43
-
44
- def tld=(tld)
45
- @tld = tld
46
- end
47
-
48
47
  def upstream(ip, port=53, protocol=nil)
49
- if @upstream_servers == @default_upstream
48
+ if @upstream_servers == UNSET_VALUE
50
49
  @upstream_servers = []
51
50
  end
52
51
 
@@ -64,13 +63,24 @@ module Landrush
64
63
  end
65
64
  end
66
65
 
66
+ def finalize!
67
+ DEFAULTS.each do |name, value|
68
+ if instance_variable_get('@' + name.to_s) == UNSET_VALUE
69
+ instance_variable_set '@' + name.to_s, value
70
+ end
71
+ end
72
+ end
73
+
67
74
  def validate(machine)
75
+ errors = _detected_errors
76
+
68
77
  if enabled?
69
78
  unless machine.config.vm.hostname.to_s.length > 0
70
- return { 'landrush' => ['you must specify a hostname so we can make a DNS entry for it'] }
79
+ errors << 'you must specify a hostname so we can make a DNS entry for it'
71
80
  end
72
81
  end
73
- {}
82
+
83
+ { 'landrush' => errors }
74
84
  end
75
85
  end
76
86
  end
@@ -23,7 +23,7 @@ module Landrush
23
23
  end
24
24
 
25
25
  def info(msg)
26
- @env[:ui].info(msg)
26
+ @env[:ui].info("[landrush] #{msg}")
27
27
  end
28
28
 
29
29
  def desired_contents; <<-EOS.gsub(/^ /, '')
@@ -61,11 +61,6 @@ module Landrush
61
61
  end
62
62
 
63
63
  def ensure_config_exists!
64
- unless osx?
65
- puts "Not an OSX machine, so skipping host DNS resolver config."
66
- return
67
- end
68
-
69
64
  if contents_match?
70
65
  info "Host DNS resolver config looks good."
71
66
  else
@@ -26,6 +26,14 @@ module Landrush
26
26
  write(current_config.reject { |k, _| k == key })
27
27
  end
28
28
 
29
+ def has?(key, value = nil)
30
+ if value.nil?
31
+ current_config.has_key? key
32
+ else
33
+ current_config[key] == value
34
+ end
35
+ end
36
+
29
37
  def find(search)
30
38
  current_config.keys.detect do |key|
31
39
  key.casecmp(search) == 0 ||
@@ -1,3 +1,3 @@
1
1
  module Landrush
2
- VERSION = "0.13.1"
2
+ VERSION = "0.14.0"
3
3
  end
@@ -77,9 +77,8 @@ module Landrush
77
77
  it "does nothing if it is not enabled via config" do
78
78
  app = Proc.new {}
79
79
  setup = Setup.new(app, nil)
80
- env = fake_environment
80
+ env = fake_environment(enabled: false)
81
81
 
82
- env[:machine].config.landrush.disable
83
82
  setup.call(env)
84
83
 
85
84
  Store.hosts.get('somehost.vagrant.dev').must_equal nil
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ module Landrush
4
+ module Cap
5
+ module Linux
6
+
7
+ describe ReadHostVisibleIpAddress do
8
+ describe 'read_host_visible_ip_address' do
9
+ let (:machine) { fake_machine }
10
+
11
+ it 'should read the last address' do
12
+ machine.communicate.stub_command(Landrush::Cap::Linux::ReadHostVisibleIpAddress.command, "1.2.3.4 5.6.7.8\n")
13
+ machine.guest.capability(:read_host_visible_ip_address).must_equal '5.6.7.8'
14
+ end
15
+
16
+ it 'should ignore IPv6 addresses' do
17
+ machine.communicate.stub_command(Landrush::Cap::Linux::ReadHostVisibleIpAddress.command, "1.2.3.4 5.6.7.8 fdb2:2c26:f4e4:0:21c:42ff:febc:ea4f\n")
18
+ machine.guest.capability(:read_host_visible_ip_address).must_equal '5.6.7.8'
19
+ end
20
+
21
+ it 'should fail on invalid address' do
22
+ machine.communicate.stub_command(Landrush::Cap::Linux::ReadHostVisibleIpAddress.command, "hello world\n")
23
+ lambda {
24
+ machine.guest.capability(:read_host_visible_ip_address)
25
+ }.must_raise(IPAddr::InvalidAddressError)
26
+ end
27
+
28
+ it 'should fail without address' do
29
+ machine.communicate.stub_command(Landrush::Cap::Linux::ReadHostVisibleIpAddress.command, "\n")
30
+ lambda {
31
+ machine.guest.capability(:read_host_visible_ip_address)
32
+ }.must_raise(RuntimeError, 'Cannot detect IP address, command `hostname -I` returned ``')
33
+ end
34
+ end
35
+ end
36
+
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ describe 'Landrush::Config' do
4
+ it "supports enabling via accessor style" do
5
+ machine = fake_machine
6
+ config = machine.config.landrush
7
+
8
+ machine.config.landrush.enabled = true
9
+ config.enabled?.must_equal true
10
+ machine.config.landrush.enabled = false
11
+ config.enabled?.must_equal false
12
+ end
13
+
14
+ it "is backwards-compatible with the old method call style" do
15
+ machine = fake_machine
16
+ config = machine.config.landrush
17
+
18
+ machine.config.landrush.enable
19
+ config.enabled?.must_equal true
20
+ machine.config.landrush.disable
21
+ config.enabled?.must_equal false
22
+ end
23
+ end
data/test/test_helper.rb CHANGED
@@ -8,7 +8,7 @@ require 'landrush/cap/linux/read_host_visible_ip_address'
8
8
 
9
9
  require 'minitest/autorun'
10
10
 
11
- def fake_environment(options={})
11
+ def fake_environment(options = { enabled: true })
12
12
  { machine: fake_machine(options), ui: FakeUI }
13
13
  end
14
14
 
@@ -89,7 +89,7 @@ def fake_machine(options={})
89
89
  "#{options.fetch(:ip, '1.2.3.4')}\n"
90
90
  )
91
91
 
92
- machine.config.landrush.enable
92
+ machine.config.landrush.enabled = options.fetch(:enabled, false)
93
93
  machine.config.vm.hostname = options.fetch(:hostname, 'somehost.vagrant.dev')
94
94
 
95
95
  machine
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: landrush
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Hinze
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-11 00:00:00.000000000 Z
11
+ date: 2014-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubydns
@@ -80,6 +80,8 @@ files:
80
80
  - lib/landrush/version.rb
81
81
  - test/landrush/action/setup_test.rb
82
82
  - test/landrush/action/teardown_test.rb
83
+ - test/landrush/cap/linux/read_host_visible_ip_address_test.rb
84
+ - test/landrush/config_test.rb
83
85
  - test/landrush/dependent_vms_test.rb
84
86
  - test/landrush/resolver_config_test.rb
85
87
  - test/landrush/server_test.rb
@@ -110,13 +112,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
112
  version: '0'
111
113
  requirements: []
112
114
  rubyforge_project:
113
- rubygems_version: 2.2.0
115
+ rubygems_version: 2.2.2
114
116
  signing_key:
115
117
  specification_version: 4
116
118
  summary: a vagrant plugin providing consistent DNS visible on host and guests
117
119
  test_files:
118
120
  - test/landrush/action/setup_test.rb
119
121
  - test/landrush/action/teardown_test.rb
122
+ - test/landrush/cap/linux/read_host_visible_ip_address_test.rb
123
+ - test/landrush/config_test.rb
120
124
  - test/landrush/dependent_vms_test.rb
121
125
  - test/landrush/resolver_config_test.rb
122
126
  - test/landrush/server_test.rb