vagrant-hostmaster 0.8.0 → 0.8.1
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.
- data/.gitignore +3 -0
- data/README.md +2 -10
- data/Rakefile +9 -0
- data/lib/vagrant/hostmaster.rb +1 -2
- data/lib/vagrant/hostmaster/command/base.rb +3 -1
- data/lib/vagrant/hostmaster/middleware/remove.rb +1 -1
- data/lib/vagrant/hostmaster/middleware/update.rb +1 -1
- data/lib/vagrant/hostmaster/version.rb +1 -1
- data/lib/vagrant/hostmaster/vm.rb +37 -18
- data/test/vagrant/hostmaster/command_tests/list_test.rb +43 -0
- data/test/vagrant/hostmaster/command_tests/remove_test.rb +43 -0
- data/test/vagrant/hostmaster/command_tests/root_test.rb +49 -0
- data/test/vagrant/hostmaster/command_tests/update_test.rb +43 -0
- data/test/vagrant/hostmaster/config_test.rb +29 -0
- data/test/vagrant/hostmaster/middleware_tests/remove_test.rb +40 -0
- data/test/vagrant/hostmaster/middleware_tests/update_test.rb +38 -0
- data/test/vagrant/hostmaster/multiple_vm_test.rb +88 -0
- data/test/vagrant/hostmaster/simple_vm_test.rb +77 -0
- data/test/vagrant/hostmaster/test_helpers.rb +137 -0
- data/test/vagrant/hostmaster/ui/capture.rb +35 -0
- data/vagrant-hostmaster.gemspec +4 -2
- metadata +53 -6
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -4,17 +4,9 @@
|
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
|
7
|
+
Install into vagrant's isolated RubyGems instance using:
|
8
8
|
|
9
|
-
gem
|
10
|
-
|
11
|
-
And then execute:
|
12
|
-
|
13
|
-
$ bundle
|
14
|
-
|
15
|
-
Or install it yourself as:
|
16
|
-
|
17
|
-
$ gem install vagrant-hostmaster
|
9
|
+
$ vagrant gem install vagrant-hostmaster
|
18
10
|
|
19
11
|
## Usage
|
20
12
|
|
data/Rakefile
CHANGED
data/lib/vagrant/hostmaster.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'vagrant
|
1
|
+
require 'vagrant'
|
2
2
|
require 'vagrant/hostmaster/command/base'
|
3
3
|
require 'vagrant/hostmaster/command/root'
|
4
4
|
require 'vagrant/hostmaster/config'
|
@@ -8,7 +8,6 @@ require 'vagrant/hostmaster/middleware/update'
|
|
8
8
|
|
9
9
|
Vagrant.commands.register(:hosts) { Vagrant::Hostmaster::Command::Root }
|
10
10
|
Vagrant.config_keys.register(:hosts) { Vagrant::Hostmaster::Config }
|
11
|
-
Vagrant.commands.register(:hosts) { Vagrant::Hostmaster::Command::Root }
|
12
11
|
|
13
12
|
Vagrant.actions[:destroy].insert_after(Vagrant::Action::VM::ProvisionerCleanup, Vagrant::Hostmaster::Middleware::Remove)
|
14
13
|
|
@@ -14,8 +14,10 @@ module Vagrant
|
|
14
14
|
return if !argv
|
15
15
|
|
16
16
|
with_target_vms(argv) do |vm|
|
17
|
-
if vm.
|
17
|
+
if vm.state == :running
|
18
18
|
Hostmaster::VM.new(vm).send sub_command.to_sym
|
19
|
+
elsif vm.created?
|
20
|
+
vm.ui.info I18n.t("vagrant.commands.common.vm_not_running")
|
19
21
|
else
|
20
22
|
vm.ui.info I18n.t("vagrant.commands.common.vm_not_created")
|
21
23
|
end
|
@@ -7,6 +7,12 @@ module Vagrant
|
|
7
7
|
|
8
8
|
def_delegators :@vm, :channel, :config, :env, :name, :uuid
|
9
9
|
|
10
|
+
class << self
|
11
|
+
def hosts_path
|
12
|
+
Util::Platform.windows? ? "#{ENV['SYSTEMROOT']}/system32/drivers/etc/hosts" : "/etc/hosts"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
10
16
|
def initialize(vm)
|
11
17
|
@vm = vm
|
12
18
|
end
|
@@ -17,26 +23,29 @@ module Vagrant
|
|
17
23
|
sudo add_command
|
18
24
|
end
|
19
25
|
|
20
|
-
with_other_vms { |vm| channel.sudo vm.add_command(uuid) } if process_guests?(options)
|
26
|
+
with_other_vms { |vm| channel.sudo vm.add_command(:uuid => uuid, :hosts_path => hosts_path) } if process_guests?(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def hosts_path
|
30
|
+
# TODO: if windows guests are supported, this will need to be smarter
|
31
|
+
"/etc/hosts"
|
21
32
|
end
|
22
33
|
|
23
34
|
def list(options = {})
|
24
35
|
if process_local?(options)
|
25
36
|
output = `#{list_command}`.chomp
|
26
|
-
env.ui.info("
|
37
|
+
env.ui.info("[local] #{output}\n\n", :prefix => false) unless output.empty?
|
27
38
|
end
|
28
39
|
|
29
40
|
if process_guests?(options)
|
30
|
-
entries =
|
41
|
+
entries = ""
|
31
42
|
with_other_vms do |vm|
|
32
|
-
|
33
|
-
|
34
|
-
entry << data if type == :stdout
|
43
|
+
channel.execute(vm.list_command(:uuid => uuid, :hosts_path => hosts_path), :error_check => false) do |type, data|
|
44
|
+
entries << data if type == :stdout
|
35
45
|
end
|
36
|
-
entry.chomp!
|
37
|
-
entries << entry unless entry.empty?
|
38
46
|
end
|
39
|
-
|
47
|
+
entries = entries.split($/).collect { |entry| "[#{name}] #{entry}" }.join("\n")
|
48
|
+
env.ui.info("#{entries}\n\n", :prefix => false) unless entries.empty?
|
40
49
|
end
|
41
50
|
end
|
42
51
|
|
@@ -45,7 +54,7 @@ module Vagrant
|
|
45
54
|
env.ui.info("Removing host entry for #{name} VM. Administrator privileges will be required...") unless options[:quiet]
|
46
55
|
sudo remove_command
|
47
56
|
end
|
48
|
-
with_other_vms { |vm| channel.sudo vm.remove_command(uuid) } if process_guests?(options)
|
57
|
+
with_other_vms { |vm| channel.sudo vm.remove_command(:uuid => uuid, :hosts_path => hosts_path) } if process_guests?(options)
|
49
58
|
end
|
50
59
|
|
51
60
|
def update(options = {})
|
@@ -53,12 +62,14 @@ module Vagrant
|
|
53
62
|
env.ui.info("Updating host entry for #{name} VM. Administrator privileges will be required...") unless options[:quiet]
|
54
63
|
sudo(remove_command) && sudo(add_command)
|
55
64
|
end
|
56
|
-
with_other_vms { |vm| channel.sudo(vm.remove_command(uuid)) && channel.sudo(vm.add_command(uuid)) } if process_guests?(options)
|
65
|
+
with_other_vms { |vm| channel.sudo(vm.remove_command(:uuid => uuid, :hosts_path => hosts_path)) && channel.sudo(vm.add_command(:uuid => uuid, :hosts_path => hosts_path)) } if process_guests?(options)
|
57
66
|
end
|
58
67
|
|
59
68
|
protected
|
60
|
-
def add_command(
|
61
|
-
|
69
|
+
def add_command(options = {})
|
70
|
+
uuid = options[:uuid] || self.uuid
|
71
|
+
hosts_path = options[:hosts_path] || self.class.hosts_path
|
72
|
+
%Q(sh -c 'echo "#{host_entry(uuid)}" >>#{hosts_path}')
|
62
73
|
end
|
63
74
|
|
64
75
|
def address
|
@@ -90,8 +101,10 @@ module Vagrant
|
|
90
101
|
{:local => true}.merge(options)[:local]
|
91
102
|
end
|
92
103
|
|
93
|
-
def list_command(
|
94
|
-
|
104
|
+
def list_command(options = {})
|
105
|
+
uuid = options[:uuid] || self.uuid
|
106
|
+
hosts_path = options[:hosts_path] || self.class.hosts_path
|
107
|
+
%Q(grep '#{signature(uuid)}$' #{hosts_path})
|
95
108
|
end
|
96
109
|
|
97
110
|
def network
|
@@ -108,8 +121,10 @@ module Vagrant
|
|
108
121
|
@networks ||= config.vm.networks
|
109
122
|
end
|
110
123
|
|
111
|
-
def remove_command(
|
112
|
-
|
124
|
+
def remove_command(options = {})
|
125
|
+
uuid = options[:uuid] || self.uuid
|
126
|
+
hosts_path = options[:hosts_path] || self.class.hosts_path
|
127
|
+
%Q(sed -e '/#{signature(uuid)}$/ d' -ibak #{hosts_path})
|
113
128
|
end
|
114
129
|
|
115
130
|
def signature(uuid = self.uuid)
|
@@ -117,7 +132,11 @@ module Vagrant
|
|
117
132
|
end
|
118
133
|
|
119
134
|
def sudo(command)
|
120
|
-
|
135
|
+
if Util::Platform.windows?
|
136
|
+
`#{command}`
|
137
|
+
else
|
138
|
+
`sudo #{command}`
|
139
|
+
end
|
121
140
|
end
|
122
141
|
|
123
142
|
def with_other_vms
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'mocha'
|
3
|
+
require 'vagrant/hostmaster'
|
4
|
+
require 'vagrant/hostmaster/command/list'
|
5
|
+
|
6
|
+
module Vagrant
|
7
|
+
module Hostmaster
|
8
|
+
module CommandTests
|
9
|
+
class ListTest < Test::Unit::TestCase
|
10
|
+
include Vagrant::TestHelpers
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@env = vagrant_env
|
14
|
+
@vm = @env.vms.values.first
|
15
|
+
@vm.stubs(:state).returns(:running)
|
16
|
+
@command = Vagrant::Hostmaster::Command::List.new([], @env)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_not_created
|
20
|
+
@vm.stubs(:state).returns(:not_created)
|
21
|
+
Vagrant::Hostmaster::Command::List.expects(:new).with([], @env).returns(@command)
|
22
|
+
Vagrant::Hostmaster::VM.expects(:new).never
|
23
|
+
@env.cli('hosts', 'list')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_not_running
|
27
|
+
@vm.stubs(:state).returns(:poweroff)
|
28
|
+
Vagrant::Hostmaster::Command::List.expects(:new).with([], @env).returns(@command)
|
29
|
+
Vagrant::Hostmaster::VM.expects(:new).never
|
30
|
+
@env.cli('hosts', 'list')
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_list
|
34
|
+
Vagrant::Hostmaster::Command::List.stubs(:new).with([], @env).returns(@command)
|
35
|
+
vm = Vagrant::Hostmaster::VM.new(@vm)
|
36
|
+
Vagrant::Hostmaster::VM.expects(:new).with(@vm).returns(vm)
|
37
|
+
vm.expects(:list).with()
|
38
|
+
@env.cli('hosts', 'list')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'mocha'
|
3
|
+
require 'vagrant/hostmaster'
|
4
|
+
require 'vagrant/hostmaster/command/remove'
|
5
|
+
|
6
|
+
module Vagrant
|
7
|
+
module Hostmaster
|
8
|
+
module CommandTests
|
9
|
+
class RemoveTest < Test::Unit::TestCase
|
10
|
+
include Vagrant::TestHelpers
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@env = vagrant_env
|
14
|
+
@vm = @env.vms.values.first
|
15
|
+
@vm.stubs(:state).returns(:running)
|
16
|
+
@command = Vagrant::Hostmaster::Command::Remove.new([], @env)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_not_created
|
20
|
+
@vm.stubs(:state).returns(:not_created)
|
21
|
+
Vagrant::Hostmaster::Command::Remove.expects(:new).with([], @env).returns(@command)
|
22
|
+
Vagrant::Hostmaster::VM.expects(:new).never
|
23
|
+
@env.cli('hosts', 'remove')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_not_running
|
27
|
+
@vm.stubs(:state).returns(:poweroff)
|
28
|
+
Vagrant::Hostmaster::Command::Remove.expects(:new).with([], @env).returns(@command)
|
29
|
+
Vagrant::Hostmaster::VM.expects(:new).never
|
30
|
+
@env.cli('hosts', 'remove')
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_remove
|
34
|
+
Vagrant::Hostmaster::Command::Remove.stubs(:new).with([], @env).returns(@command)
|
35
|
+
vm = Vagrant::Hostmaster::VM.new(@vm)
|
36
|
+
Vagrant::Hostmaster::VM.expects(:new).with(@vm).returns(vm)
|
37
|
+
vm.expects(:remove).with()
|
38
|
+
@env.cli('hosts', 'remove')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'mocha'
|
3
|
+
require 'vagrant/hostmaster'
|
4
|
+
require 'vagrant/hostmaster/command/list'
|
5
|
+
require 'vagrant/hostmaster/command/remove'
|
6
|
+
require 'vagrant/hostmaster/command/update'
|
7
|
+
|
8
|
+
module Vagrant
|
9
|
+
module Hostmaster
|
10
|
+
module CommandTests
|
11
|
+
class RootTest < Test::Unit::TestCase
|
12
|
+
include Vagrant::TestHelpers
|
13
|
+
|
14
|
+
def setup
|
15
|
+
@env = vagrant_env
|
16
|
+
@vm = @env.vms.values.first
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_no_command
|
20
|
+
command = Vagrant::Hostmaster::Command::Root.new([], @env)
|
21
|
+
Vagrant::Hostmaster::Command::Root.expects(:new).with([], @env).returns(command)
|
22
|
+
command.expects(:help)
|
23
|
+
@env.cli('hosts')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_list
|
27
|
+
command = Vagrant::Hostmaster::Command::List.new([], @env)
|
28
|
+
Vagrant::Hostmaster::Command::List.expects(:new).with([], @env).returns(command)
|
29
|
+
command.expects(:execute).with()
|
30
|
+
@env.cli('hosts', 'list')
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_remove
|
34
|
+
command = Vagrant::Hostmaster::Command::Remove.new([], @env)
|
35
|
+
Vagrant::Hostmaster::Command::Remove.expects(:new).with([], @env).returns(command)
|
36
|
+
command.expects(:execute).with()
|
37
|
+
@env.cli('hosts', 'remove')
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_update
|
41
|
+
command = Vagrant::Hostmaster::Command::Update.new([], @env)
|
42
|
+
Vagrant::Hostmaster::Command::Update.expects(:new).with([], @env).returns(command)
|
43
|
+
command.expects(:execute).with()
|
44
|
+
@env.cli('hosts', 'update')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'mocha'
|
3
|
+
require 'vagrant/hostmaster'
|
4
|
+
require 'vagrant/hostmaster/command/update'
|
5
|
+
|
6
|
+
module Vagrant
|
7
|
+
module Hostmaster
|
8
|
+
module CommandTests
|
9
|
+
class UpdateTest < Test::Unit::TestCase
|
10
|
+
include Vagrant::TestHelpers
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@env = vagrant_env
|
14
|
+
@vm = @env.vms.values.first
|
15
|
+
@vm.stubs(:state).returns(:running)
|
16
|
+
@command = Vagrant::Hostmaster::Command::Update.new([], @env)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_not_created
|
20
|
+
@vm.stubs(:state).returns(:not_created)
|
21
|
+
Vagrant::Hostmaster::Command::Update.expects(:new).with([], @env).returns(@command)
|
22
|
+
Vagrant::Hostmaster::VM.expects(:new).never
|
23
|
+
@env.cli('hosts', 'update')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_not_running
|
27
|
+
@vm.stubs(:state).returns(:poweroff)
|
28
|
+
Vagrant::Hostmaster::Command::Update.expects(:new).with([], @env).returns(@command)
|
29
|
+
Vagrant::Hostmaster::VM.expects(:new).never
|
30
|
+
@env.cli('hosts', 'update')
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_update
|
34
|
+
Vagrant::Hostmaster::Command::Update.stubs(:new).with([], @env).returns(@command)
|
35
|
+
vm = Vagrant::Hostmaster::VM.new(@vm)
|
36
|
+
Vagrant::Hostmaster::VM.expects(:new).with(@vm).returns(vm)
|
37
|
+
vm.expects(:update).with()
|
38
|
+
@env.cli('hosts', 'update')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require "mocha"
|
3
|
+
require 'vagrant/hostmaster'
|
4
|
+
|
5
|
+
module Vagrant
|
6
|
+
module Hostmaster
|
7
|
+
class ConfigTest < Test::Unit::TestCase
|
8
|
+
include Vagrant::TestHelpers
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@config = Vagrant::Hostmaster::Config.new
|
12
|
+
@errors = Vagrant::Config::ErrorRecorder.new
|
13
|
+
@env = vagrant_env
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_default_valid
|
17
|
+
@config.validate(@env, @errors)
|
18
|
+
assert @errors.errors.empty?, "Default configuration should not have any errors."
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_valid
|
22
|
+
@config.name = 'hostmaster.dev'
|
23
|
+
@config.aliases = %w(www.hostmaster.dev)
|
24
|
+
@config.validate(@env, @errors)
|
25
|
+
assert @errors.errors.empty?, "Configuration should not have any errors."
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require "mocha"
|
3
|
+
require 'vagrant/hostmaster'
|
4
|
+
|
5
|
+
module Vagrant
|
6
|
+
module Hostmaster
|
7
|
+
module MiddlewareTests
|
8
|
+
class RemoveTest < Test::Unit::TestCase
|
9
|
+
include Vagrant::TestHelpers
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@app, @env = action_env(vagrant_env.vms.values.first.env)
|
13
|
+
@env['vm'].stubs(:state).returns(:running)
|
14
|
+
@middleware = Vagrant::Hostmaster::Middleware::Remove.new(@app, @env)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_not_created
|
18
|
+
@env['vm'].stubs(:state).returns(:not_created)
|
19
|
+
Vagrant::Hostmaster::VM.expects(:new).never
|
20
|
+
@middleware.call(@env)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_not_running
|
24
|
+
@env['vm'].stubs(:state).returns(:poweroff)
|
25
|
+
vm = Vagrant::Hostmaster::VM.new(@env['vm'])
|
26
|
+
Vagrant::Hostmaster::VM.expects(:new).with(@env['vm']).returns(vm)
|
27
|
+
vm.expects(:remove).with(:guests => false)
|
28
|
+
@middleware.call(@env)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_remove
|
32
|
+
vm = Vagrant::Hostmaster::VM.new(@env['vm'])
|
33
|
+
Vagrant::Hostmaster::VM.expects(:new).with(@env['vm']).returns(vm)
|
34
|
+
vm.expects(:remove).with(:guests => false)
|
35
|
+
@middleware.call(@env)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require "mocha"
|
3
|
+
require 'vagrant/hostmaster'
|
4
|
+
|
5
|
+
module Vagrant
|
6
|
+
module Hostmaster
|
7
|
+
module MiddlewareTests
|
8
|
+
class UpdateTest < Test::Unit::TestCase
|
9
|
+
include Vagrant::TestHelpers
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@app, @env = action_env(vagrant_env.vms.values.first.env)
|
13
|
+
@env['vm'].stubs(:state).returns(:running)
|
14
|
+
@middleware = Vagrant::Hostmaster::Middleware::Update.new(@app, @env)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_not_created
|
18
|
+
@env['vm'].stubs(:state).returns(:not_created)
|
19
|
+
Vagrant::Hostmaster::VM.expects(:new).never
|
20
|
+
@middleware.call(@env)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_not_running
|
24
|
+
@env['vm'].stubs(:state).returns(:poweroff)
|
25
|
+
Vagrant::Hostmaster::VM.expects(:new).never
|
26
|
+
@middleware.call(@env)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_update
|
30
|
+
vm = Vagrant::Hostmaster::VM.new(@env['vm'])
|
31
|
+
Vagrant::Hostmaster::VM.expects(:new).with(@env['vm']).returns(vm)
|
32
|
+
vm.expects(:update).with()
|
33
|
+
@middleware.call(@env)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require "mocha"
|
3
|
+
require 'vagrant/hostmaster'
|
4
|
+
require 'vagrant/hostmaster/test_helpers'
|
5
|
+
|
6
|
+
module Vagrant
|
7
|
+
module Hostmaster
|
8
|
+
class MultipleVMTest < Test::Unit::TestCase
|
9
|
+
include Vagrant::TestHelpers
|
10
|
+
include Vagrant::Hostmaster::TestHelpers
|
11
|
+
|
12
|
+
def setup
|
13
|
+
super
|
14
|
+
|
15
|
+
# TODO: test both windows and non-windows
|
16
|
+
Util::Platform.stubs(:windows?).returns(false)
|
17
|
+
@hosts_file = Tempfile.new('hosts')
|
18
|
+
hostmaster_box :one, 'one.hostmaster.dev', '10.0.0.100', '11111111-1111-1111-1111-111111111111'
|
19
|
+
hostmaster_box :two, 'two.hostmaster.dev', '10.0.0.200', '22222222-2222-2222-2222-222222222222'
|
20
|
+
@vms = hostmaster_vms(hostmaster_env)
|
21
|
+
end
|
22
|
+
|
23
|
+
def teardown
|
24
|
+
@hosts_file.unlink
|
25
|
+
clean_paths
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_add
|
30
|
+
Vagrant::Hostmaster::VM.stubs(:hosts_path).returns @hosts_file.path
|
31
|
+
@vms.each do |vm|
|
32
|
+
hostmaster_boxes.each do |name,box|
|
33
|
+
next if name == vm.name
|
34
|
+
param = %Q(sh -c 'echo \"#{box[:address]} #{box[:host_name]} # VAGRANT: #{vm.uuid} \(#{name}\)\" >>#{vm.hosts_path}')
|
35
|
+
vm.channel.expects(:sudo).with(param)
|
36
|
+
end
|
37
|
+
vm.add
|
38
|
+
end
|
39
|
+
assert_local_host_entries_for @vms, @hosts_file
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_list
|
43
|
+
Vagrant::Hostmaster::VM.stubs(:hosts_path).returns @hosts_file.path
|
44
|
+
write_local_host_entries @hosts_file
|
45
|
+
hostmaster_boxes.each do |target_name,target_box|
|
46
|
+
address, host_name, uuid, vm = target_box.values_at(:address, :host_name, :uuid, :vm)
|
47
|
+
hostmaster_boxes.each do |name,box|
|
48
|
+
next if name == target_name
|
49
|
+
param = "grep '# VAGRANT: #{uuid} (#{name})$' #{vm.hosts_path}"
|
50
|
+
vm.channel.expects(:execute).with(param, :error_check => false)
|
51
|
+
end
|
52
|
+
output = Vagrant::Hostmaster::UI::Capture.capture { vm.list }
|
53
|
+
assert_match /^\[local\] #{address} #{host_name} # VAGRANT: #{uuid} \(#{target_name}\)$/, output
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_remove_local_hosts_entry
|
58
|
+
Vagrant::Hostmaster::VM.stubs(:hosts_path).returns @hosts_file.path
|
59
|
+
write_local_host_entries @hosts_file
|
60
|
+
@vms.each do |vm|
|
61
|
+
hostmaster_boxes.each do |name,box|
|
62
|
+
next if name == vm.name
|
63
|
+
param = %Q(sed -e '/# VAGRANT: #{vm.uuid} (#{name})$/ d' -ibak #{vm.hosts_path})
|
64
|
+
vm.channel.expects(:sudo).with(param)
|
65
|
+
end
|
66
|
+
vm.remove
|
67
|
+
end
|
68
|
+
assert_no_local_host_entries_for @vms, @hosts_file
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_update_local_hosts_entry
|
72
|
+
Vagrant::Hostmaster::VM.stubs(:hosts_path).returns @hosts_file.path
|
73
|
+
write_local_host_entries @hosts_file, :one => {:address => '10.10.10.11', :host_name => 'a.hostmaster.dev'}, :two => {:address => '10.10.10.22', :host_name => 'b.hostmaster.dev'}
|
74
|
+
@vms.each do |vm|
|
75
|
+
hostmaster_boxes.each do |name,box|
|
76
|
+
next if name == vm.name
|
77
|
+
param = %Q(sed -e '/# VAGRANT: #{vm.uuid} (#{name})$/ d' -ibak #{vm.hosts_path})
|
78
|
+
vm.channel.expects(:sudo).with(param).returns(0)
|
79
|
+
param = %Q(sh -c 'echo \"#{box[:address]} #{box[:host_name]} # VAGRANT: #{vm.uuid} \(#{name}\)\" >>#{vm.hosts_path}')
|
80
|
+
vm.channel.expects(:sudo).with(param).returns(0)
|
81
|
+
end
|
82
|
+
vm.update
|
83
|
+
end
|
84
|
+
assert_local_host_entries_for @vms, @hosts_file
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require "mocha"
|
3
|
+
require 'vagrant/hostmaster'
|
4
|
+
require 'vagrant/hostmaster/test_helpers'
|
5
|
+
|
6
|
+
module Vagrant
|
7
|
+
module Hostmaster
|
8
|
+
class SimpleVMTest < Test::Unit::TestCase
|
9
|
+
include Vagrant::TestHelpers
|
10
|
+
include Vagrant::Hostmaster::TestHelpers
|
11
|
+
|
12
|
+
def setup
|
13
|
+
super
|
14
|
+
|
15
|
+
# TODO: test both windows and non-windows
|
16
|
+
Util::Platform.stubs(:windows?).returns(false)
|
17
|
+
@hosts_file = Tempfile.new('hosts')
|
18
|
+
hostmaster_box :default, 'hostmaster.dev', '123.45.67.89', '01234567-89ab-cdef-fedc-ba9876543210'
|
19
|
+
@vms = hostmaster_vms(hostmaster_env)
|
20
|
+
end
|
21
|
+
|
22
|
+
def teardown
|
23
|
+
@hosts_file.unlink
|
24
|
+
clean_paths
|
25
|
+
super
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_hosts_path
|
29
|
+
assert_equal '/etc/hosts', Vagrant::Hostmaster::VM.hosts_path
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_hosts_path_on_windows
|
33
|
+
Util::Platform.stubs(:windows?).returns(true)
|
34
|
+
ENV.stubs(:[]).with('SYSTEMROOT').returns('/windows')
|
35
|
+
assert_equal '/windows/system32/drivers/etc/hosts', Vagrant::Hostmaster::VM.hosts_path
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_vm_hosts_path
|
39
|
+
assert_equal '/etc/hosts', @vms.first.hosts_path
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_hosts_path_on_windows
|
43
|
+
Util::Platform.stubs(:windows?).returns(true)
|
44
|
+
assert_equal '/etc/hosts', @vms.first.hosts_path
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_add_local_hosts_entry
|
48
|
+
Vagrant::Hostmaster::VM.stubs(:hosts_path).returns @hosts_file.path
|
49
|
+
@vms.each { |vm| vm.add }
|
50
|
+
assert_local_host_entries_for @vms, @hosts_file
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_list_local_hosts_entry
|
54
|
+
Vagrant::Hostmaster::VM.stubs(:hosts_path).returns @hosts_file.path
|
55
|
+
write_local_host_entries @hosts_file
|
56
|
+
hostmaster_boxes.each do |name,box|
|
57
|
+
output = Vagrant::Hostmaster::UI::Capture.capture { box[:vm].list }
|
58
|
+
assert_match /^\[local\]\s+#{box[:address]}\s+#{box[:host_name]}\s*# VAGRANT: #{box[:uuid]} \(#{name}\)$/, output
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_remove_local_hosts_entry
|
63
|
+
Vagrant::Hostmaster::VM.stubs(:hosts_path).returns @hosts_file.path
|
64
|
+
write_local_host_entries @hosts_file
|
65
|
+
@vms.each { |vm| vm.remove }
|
66
|
+
assert_no_local_host_entries_for @vms, @hosts_file
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_update
|
70
|
+
Vagrant::Hostmaster::VM.stubs(:hosts_path).returns @hosts_file.path
|
71
|
+
write_local_host_entries @hosts_file, :default => {:address => '10.10.10.10', :host_name => 'www.hostmaster.dev'}
|
72
|
+
@vms.each { |vm| vm.update }
|
73
|
+
assert_local_host_entries_for @vms, @hosts_file
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'generator'
|
2
|
+
require 'vagrant/hostmaster/ui/capture'
|
3
|
+
|
4
|
+
module Vagrant
|
5
|
+
module Hostmaster
|
6
|
+
module TestHelpers
|
7
|
+
protected
|
8
|
+
def assert_local_host_address_of(address, vm, hosts_file, message=nil)
|
9
|
+
_wrap_assertion do
|
10
|
+
hosts_file.open
|
11
|
+
full_message = build_message(message,
|
12
|
+
"Expected host address of ? for ?.\n?",
|
13
|
+
address,
|
14
|
+
vm.uuid,
|
15
|
+
hosts_file.read
|
16
|
+
)
|
17
|
+
hosts_file.rewind
|
18
|
+
assert_block(full_message) do
|
19
|
+
hosts_file.grep(/# VAGRANT: #{vm.uuid} \(#{vm.name}\)$/).any? do |entry|
|
20
|
+
scanner = StringScanner.new(entry.chomp)
|
21
|
+
scanner.skip(/\s+/)
|
22
|
+
scanner.scan(/[0-9.]+/) == address
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def assert_local_host_entries_for(vms, hosts_file)
|
29
|
+
hostmaster_boxes.each do |name,box|
|
30
|
+
assert_local_host_entry_for box[:vm], hosts_file
|
31
|
+
assert_local_host_address_of box[:address], box[:vm], hosts_file
|
32
|
+
assert_local_host_name_of box[:host_name], box[:vm], hosts_file
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def assert_local_host_entry_for(vm, hosts_file, message=nil)
|
37
|
+
_wrap_assertion do
|
38
|
+
hosts_file.open
|
39
|
+
full_message = build_message(message,
|
40
|
+
"Expected host entry for ? to exist.\n?",
|
41
|
+
vm.uuid,
|
42
|
+
hosts_file.read
|
43
|
+
)
|
44
|
+
hosts_file.rewind
|
45
|
+
assert_block(full_message) do
|
46
|
+
hosts_file.grep(/# VAGRANT: #{vm.uuid} \(#{vm.name}\)$/).any?
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def assert_local_host_name_of(name, vm, hosts_file, message=nil)
|
52
|
+
_wrap_assertion do
|
53
|
+
hosts_file.open
|
54
|
+
full_message = build_message(message,
|
55
|
+
"Expected host name of ? for ?.\n?",
|
56
|
+
name,
|
57
|
+
vm.uuid,
|
58
|
+
hosts_file.read
|
59
|
+
)
|
60
|
+
hosts_file.rewind
|
61
|
+
assert_block(full_message) do
|
62
|
+
hosts_file.grep(/# VAGRANT: #{vm.uuid} \(#{vm.name}\)$/).any? do |entry|
|
63
|
+
scanner = StringScanner.new(entry.chomp)
|
64
|
+
scanner.skip(/\s+/)
|
65
|
+
scanner.skip(/[0-9.]+/)
|
66
|
+
scanner.skip(/\s+/)
|
67
|
+
scanner.scan(/[^\s#]+/) == name
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def assert_no_local_host_entries_for(vms, hosts_file)
|
74
|
+
vms.each do |vm|
|
75
|
+
assert_no_local_host_entry_for(vm, hosts_file)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def assert_no_local_host_entry_for(vm, hosts_file, message=nil)
|
80
|
+
_wrap_assertion do
|
81
|
+
hosts_file.open
|
82
|
+
full_message = build_message(message,
|
83
|
+
"Expected host entry for ? to not exist.\n?",
|
84
|
+
vm.uuid,
|
85
|
+
hosts_file.read
|
86
|
+
)
|
87
|
+
hosts_file.rewind
|
88
|
+
assert_block(full_message) do
|
89
|
+
hosts_file.grep(/# VAGRANT: #{vm.uuid} \(#{vm.name}\)$/).empty?
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def hostmaster_box(name, host_name, address, uuid)
|
95
|
+
hostmaster_boxes[name] = {:name => name, :host_name => host_name, :address => address, :uuid => uuid}
|
96
|
+
hostmaster_boxes
|
97
|
+
end
|
98
|
+
|
99
|
+
def hostmaster_boxes
|
100
|
+
@boxes ||= {}
|
101
|
+
end
|
102
|
+
|
103
|
+
def hostmaster_config
|
104
|
+
hostmaster_boxes.inject("") do |config,(name,box)|
|
105
|
+
config << <<-EOF
|
106
|
+
config.vm.define :#{name} do |box|
|
107
|
+
box.vm.host_name = "#{box[:host_name]}"
|
108
|
+
box.vm.network :hostonly, "#{box[:address]}"
|
109
|
+
end
|
110
|
+
EOF
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def hostmaster_env
|
115
|
+
Vagrant::Environment.new(:cwd => vagrantfile(hostmaster_config), :ui_class => Vagrant::Hostmaster::UI::Capture).load!
|
116
|
+
end
|
117
|
+
|
118
|
+
def hostmaster_vms(env)
|
119
|
+
env.vms.values.collect do |vm|
|
120
|
+
box = hostmaster_boxes[vm.name]
|
121
|
+
vm.stubs(:state).returns(:running)
|
122
|
+
vm.stubs(:uuid).returns(box[:uuid])
|
123
|
+
box[:vm] = Vagrant::Hostmaster::VM.new(vm)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def write_local_host_entries(hosts_file, entries={})
|
128
|
+
hostmaster_boxes.each do |name,box|
|
129
|
+
entry = box.merge(entries[name] || {})
|
130
|
+
hosts_file.puts "#{entry[:address]} #{entry[:host_name]} # VAGRANT: #{entry[:uuid]} (#{entry[:name]})"
|
131
|
+
end
|
132
|
+
hosts_file.fsync
|
133
|
+
hosts_file
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Vagrant
|
2
|
+
module Hostmaster
|
3
|
+
module UI
|
4
|
+
class Capture < Vagrant::UI::Silent
|
5
|
+
class << self
|
6
|
+
def capture
|
7
|
+
return @capture unless block_given?
|
8
|
+
begin
|
9
|
+
current, @capture = @capture, ""
|
10
|
+
yield
|
11
|
+
result = @capture
|
12
|
+
ensure
|
13
|
+
@capture = current
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def capture?
|
18
|
+
@capture
|
19
|
+
end
|
20
|
+
end
|
21
|
+
[:info, :warn, :error, :success].each do |method|
|
22
|
+
class_eval <<-CODE
|
23
|
+
def #{method}(message, *args)
|
24
|
+
super(message)
|
25
|
+
if self.class.capture?
|
26
|
+
self.class.capture << message
|
27
|
+
self.class.capture << "\n" unless message[-1,1] == "\n"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
CODE
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/vagrant-hostmaster.gemspec
CHANGED
@@ -15,6 +15,8 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Vagrant::Hostmaster::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency
|
19
|
-
gem.add_development_dependency
|
18
|
+
gem.add_dependency 'vagrant', '~>1.0.3'
|
19
|
+
gem.add_development_dependency 'bundler'
|
20
|
+
gem.add_development_dependency 'mocha', '~>0.12.3'
|
21
|
+
gem.add_development_dependency 'rake'
|
20
22
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 8
|
8
|
-
-
|
9
|
-
version: 0.8.
|
8
|
+
- 1
|
9
|
+
version: 0.8.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- S. Brent Faulkner
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2012-08-
|
17
|
+
date: 2012-08-29 00:00:00 -04:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -40,9 +40,35 @@ dependencies:
|
|
40
40
|
segments:
|
41
41
|
- 0
|
42
42
|
version: "0"
|
43
|
-
name:
|
43
|
+
name: bundler
|
44
44
|
requirement: *id002
|
45
45
|
prerelease: false
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
type: :development
|
48
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ~>
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
segments:
|
53
|
+
- 0
|
54
|
+
- 12
|
55
|
+
- 3
|
56
|
+
version: 0.12.3
|
57
|
+
name: mocha
|
58
|
+
requirement: *id003
|
59
|
+
prerelease: false
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
type: :development
|
62
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
name: rake
|
70
|
+
requirement: *id004
|
71
|
+
prerelease: false
|
46
72
|
description: vagrant-hostmaster is a Vagrant plugin to manage /etc/hosts entries on both the host OS and guest VMs.
|
47
73
|
email:
|
48
74
|
- brent.faulkner@mosaic.com
|
@@ -70,6 +96,17 @@ files:
|
|
70
96
|
- lib/vagrant/hostmaster/version.rb
|
71
97
|
- lib/vagrant/hostmaster/vm.rb
|
72
98
|
- lib/vagrant_init.rb
|
99
|
+
- test/vagrant/hostmaster/command_tests/list_test.rb
|
100
|
+
- test/vagrant/hostmaster/command_tests/remove_test.rb
|
101
|
+
- test/vagrant/hostmaster/command_tests/root_test.rb
|
102
|
+
- test/vagrant/hostmaster/command_tests/update_test.rb
|
103
|
+
- test/vagrant/hostmaster/config_test.rb
|
104
|
+
- test/vagrant/hostmaster/middleware_tests/remove_test.rb
|
105
|
+
- test/vagrant/hostmaster/middleware_tests/update_test.rb
|
106
|
+
- test/vagrant/hostmaster/multiple_vm_test.rb
|
107
|
+
- test/vagrant/hostmaster/simple_vm_test.rb
|
108
|
+
- test/vagrant/hostmaster/test_helpers.rb
|
109
|
+
- test/vagrant/hostmaster/ui/capture.rb
|
73
110
|
- vagrant-hostmaster.gemspec
|
74
111
|
has_rdoc: true
|
75
112
|
homepage: https://github.com/mosaicxm/vagrant-hostmaster
|
@@ -101,5 +138,15 @@ rubygems_version: 1.3.6
|
|
101
138
|
signing_key:
|
102
139
|
specification_version: 3
|
103
140
|
summary: Vagrant plugin to manage /etc/hosts entries.
|
104
|
-
test_files:
|
105
|
-
|
141
|
+
test_files:
|
142
|
+
- test/vagrant/hostmaster/command_tests/list_test.rb
|
143
|
+
- test/vagrant/hostmaster/command_tests/remove_test.rb
|
144
|
+
- test/vagrant/hostmaster/command_tests/root_test.rb
|
145
|
+
- test/vagrant/hostmaster/command_tests/update_test.rb
|
146
|
+
- test/vagrant/hostmaster/config_test.rb
|
147
|
+
- test/vagrant/hostmaster/middleware_tests/remove_test.rb
|
148
|
+
- test/vagrant/hostmaster/middleware_tests/update_test.rb
|
149
|
+
- test/vagrant/hostmaster/multiple_vm_test.rb
|
150
|
+
- test/vagrant/hostmaster/simple_vm_test.rb
|
151
|
+
- test/vagrant/hostmaster/test_helpers.rb
|
152
|
+
- test/vagrant/hostmaster/ui/capture.rb
|