vagrant 0.3.4 → 0.4.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.
Files changed (124) hide show
  1. data/Gemfile +2 -2
  2. data/README.md +2 -2
  3. data/Rakefile +1 -1
  4. data/VERSION +1 -1
  5. data/config/default.rb +13 -3
  6. data/lib/vagrant.rb +10 -13
  7. data/lib/vagrant/actions/base.rb +14 -2
  8. data/lib/vagrant/actions/box/download.rb +2 -7
  9. data/lib/vagrant/actions/box/verify.rb +1 -1
  10. data/lib/vagrant/actions/runner.rb +0 -1
  11. data/lib/vagrant/actions/vm/boot.rb +2 -6
  12. data/lib/vagrant/actions/vm/customize.rb +7 -5
  13. data/lib/vagrant/actions/vm/destroy.rb +4 -3
  14. data/lib/vagrant/actions/vm/down.rb +6 -3
  15. data/lib/vagrant/actions/vm/export.rb +2 -4
  16. data/lib/vagrant/actions/vm/forward_ports.rb +77 -16
  17. data/lib/vagrant/actions/vm/halt.rb +10 -2
  18. data/lib/vagrant/actions/vm/import.rb +2 -4
  19. data/lib/vagrant/actions/vm/move_hard_drive.rb +2 -2
  20. data/lib/vagrant/actions/vm/network.rb +120 -0
  21. data/lib/vagrant/actions/vm/package.rb +11 -7
  22. data/lib/vagrant/actions/vm/provision.rb +3 -3
  23. data/lib/vagrant/actions/vm/reload.rb +2 -9
  24. data/lib/vagrant/actions/vm/shared_folders.rb +19 -39
  25. data/lib/vagrant/actions/vm/start.rb +10 -2
  26. data/lib/vagrant/actions/vm/up.rb +5 -6
  27. data/lib/vagrant/active_list.rb +23 -13
  28. data/lib/vagrant/box.rb +2 -2
  29. data/lib/vagrant/busy.rb +3 -3
  30. data/lib/vagrant/command.rb +2 -2
  31. data/lib/vagrant/commands/base.rb +40 -20
  32. data/lib/vagrant/commands/destroy.rb +17 -3
  33. data/lib/vagrant/commands/halt.rb +23 -3
  34. data/lib/vagrant/commands/package.rb +54 -14
  35. data/lib/vagrant/commands/provision.rb +31 -0
  36. data/lib/vagrant/commands/reload.rb +16 -3
  37. data/lib/vagrant/commands/resume.rb +16 -3
  38. data/lib/vagrant/commands/ssh.rb +25 -3
  39. data/lib/vagrant/commands/ssh_config.rb +20 -5
  40. data/lib/vagrant/commands/status.rb +107 -40
  41. data/lib/vagrant/commands/suspend.rb +16 -3
  42. data/lib/vagrant/commands/up.rb +26 -7
  43. data/lib/vagrant/config.rb +82 -12
  44. data/lib/vagrant/downloaders/base.rb +8 -1
  45. data/lib/vagrant/downloaders/http.rb +31 -19
  46. data/lib/vagrant/environment.rb +146 -49
  47. data/lib/vagrant/provisioners/base.rb +19 -5
  48. data/lib/vagrant/provisioners/chef.rb +12 -4
  49. data/lib/vagrant/provisioners/chef_server.rb +13 -6
  50. data/lib/vagrant/provisioners/chef_solo.rb +7 -3
  51. data/lib/vagrant/resource_logger.rb +126 -0
  52. data/lib/vagrant/ssh.rb +109 -8
  53. data/lib/vagrant/systems/base.rb +70 -0
  54. data/lib/vagrant/systems/linux.rb +137 -0
  55. data/lib/vagrant/util.rb +1 -45
  56. data/lib/vagrant/util/error_helper.rb +13 -0
  57. data/lib/vagrant/util/glob_loader.rb +22 -0
  58. data/lib/vagrant/util/output_helper.rb +9 -0
  59. data/lib/vagrant/util/plain_logger.rb +12 -0
  60. data/lib/vagrant/util/platform.rb +7 -2
  61. data/lib/vagrant/util/template_renderer.rb +2 -2
  62. data/lib/vagrant/util/translator.rb +35 -0
  63. data/lib/vagrant/vm.rb +91 -10
  64. data/templates/crontab_entry.erb +1 -0
  65. data/templates/network_entry.erb +8 -0
  66. data/templates/ssh_config.erb +1 -0
  67. data/templates/{errors.yml → strings.yml} +111 -3
  68. data/templates/sync.erb +14 -0
  69. data/test/test_helper.rb +46 -3
  70. data/test/vagrant/actions/box/download_test.rb +0 -17
  71. data/test/vagrant/actions/vm/boot_test.rb +3 -10
  72. data/test/vagrant/actions/vm/customize_test.rb +6 -0
  73. data/test/vagrant/actions/vm/destroy_test.rb +6 -5
  74. data/test/vagrant/actions/vm/down_test.rb +5 -11
  75. data/test/vagrant/actions/vm/export_test.rb +1 -0
  76. data/test/vagrant/actions/vm/forward_ports_test.rb +92 -15
  77. data/test/vagrant/actions/vm/halt_test.rb +36 -4
  78. data/test/vagrant/actions/vm/import_test.rb +2 -0
  79. data/test/vagrant/actions/vm/network_test.rb +237 -0
  80. data/test/vagrant/actions/vm/package_test.rb +35 -5
  81. data/test/vagrant/actions/vm/provision_test.rb +3 -3
  82. data/test/vagrant/actions/vm/reload_test.rb +1 -1
  83. data/test/vagrant/actions/vm/shared_folders_test.rb +41 -74
  84. data/test/vagrant/actions/vm/start_test.rb +41 -3
  85. data/test/vagrant/actions/vm/up_test.rb +10 -21
  86. data/test/vagrant/active_list_test.rb +28 -43
  87. data/test/vagrant/commands/base_test.rb +25 -4
  88. data/test/vagrant/commands/destroy_test.rb +24 -12
  89. data/test/vagrant/commands/halt_test.rb +33 -11
  90. data/test/vagrant/commands/package_test.rb +77 -57
  91. data/test/vagrant/commands/provision_test.rb +50 -0
  92. data/test/vagrant/commands/reload_test.rb +27 -11
  93. data/test/vagrant/commands/resume_test.rb +25 -14
  94. data/test/vagrant/commands/ssh_config_test.rb +40 -17
  95. data/test/vagrant/commands/ssh_test.rb +52 -13
  96. data/test/vagrant/commands/status_test.rb +21 -1
  97. data/test/vagrant/commands/suspend_test.rb +25 -14
  98. data/test/vagrant/commands/up_test.rb +25 -19
  99. data/test/vagrant/config_test.rb +74 -18
  100. data/test/vagrant/downloaders/base_test.rb +2 -1
  101. data/test/vagrant/downloaders/http_test.rb +18 -8
  102. data/test/vagrant/environment_test.rb +245 -77
  103. data/test/vagrant/provisioners/base_test.rb +4 -4
  104. data/test/vagrant/provisioners/chef_server_test.rb +18 -7
  105. data/test/vagrant/provisioners/chef_solo_test.rb +17 -7
  106. data/test/vagrant/provisioners/chef_test.rb +22 -9
  107. data/test/vagrant/resource_logger_test.rb +144 -0
  108. data/test/vagrant/ssh_session_test.rb +46 -0
  109. data/test/vagrant/ssh_test.rb +42 -2
  110. data/test/vagrant/systems/linux_test.rb +174 -0
  111. data/test/vagrant/util/error_helper_test.rb +5 -0
  112. data/test/vagrant/util/output_helper_test.rb +5 -0
  113. data/test/vagrant/util/plain_logger_test.rb +17 -0
  114. data/test/vagrant/util/platform_test.rb +18 -0
  115. data/test/vagrant/util/{errors_test.rb → translator_test.rb} +25 -21
  116. data/test/vagrant/util_test.rb +12 -49
  117. data/test/vagrant/vm_test.rb +133 -11
  118. data/vagrant.gemspec +39 -15
  119. metadata +64 -40
  120. data/lib/vagrant/commands/down.rb +0 -16
  121. data/lib/vagrant/util/errors.rb +0 -36
  122. data/lib/vagrant/util/progress_meter.rb +0 -33
  123. data/test/vagrant/commands/down_test.rb +0 -17
  124. data/test/vagrant/util/progress_meter_test.rb +0 -33
@@ -0,0 +1,14 @@
1
+ #!/bin/sh
2
+ TIMESTART=`date +%s`
3
+ while [ 1 ]
4
+ do
5
+ echo 'Syncing...'
6
+ unison $1 $2 $3 $4
7
+ TIME=$((`date +%s`-$TIMESTART))
8
+ echo $TIME
9
+ if [ $TIME -ge 50 ]
10
+ then
11
+ break
12
+ fi
13
+ sleep 1
14
+ done
@@ -24,10 +24,11 @@ class Test::Unit::TestCase
24
24
 
25
25
  Vagrant::Config.run do |config|
26
26
  config.vagrant.dotfile_name = ".vagrant"
27
+ config.vagrant.log_output = nil
27
28
 
28
29
  config.ssh.username = "foo"
29
- config.ssh.password = "bar"
30
30
  config.ssh.host = "baz"
31
+ config.ssh.port = 22
31
32
  config.ssh.forwarded_port_key = "ssh"
32
33
  config.ssh.max_tries = 10
33
34
  config.ssh.timeout = 10
@@ -36,11 +37,14 @@ class Test::Unit::TestCase
36
37
  config.vm.box = "foo"
37
38
  config.vm.box_ovf = "box.ovf"
38
39
  config.vm.base_mac = "42"
39
- config.vm.project_directory = "/vagrant"
40
40
  config.vm.disk_image_format = 'VMDK'
41
41
  config.vm.forward_port("ssh", 22, 2222)
42
42
  config.vm.shared_folder_uid = nil
43
43
  config.vm.shared_folder_gid = nil
44
+ config.vm.system = :linux
45
+ config.vm.sync_script = "/foo"
46
+ config.vm.sync_crontab_entry_file = "/tmp/foo"
47
+ config.vm.share_folder("v-root", "/vagrant", ".")
44
48
 
45
49
  config.package.name = 'vagrant'
46
50
  config.package.extension = '.box'
@@ -69,9 +73,26 @@ class Test::Unit::TestCase
69
73
  config = Vagrant::Config.execute!
70
74
 
71
75
  environment.instance_variable_set(:@config, config)
76
+
77
+ # Setup the logger. We create it then reset it so that subsequent
78
+ # calls will recreate it for us.
79
+ environment.load_logger!
80
+ environment.logger.class.reset_singleton_logger!
81
+ environment.logger.stubs(:flush_progress)
82
+ environment.logger.stubs(:cl_reset).returns("")
83
+
72
84
  environment
73
85
  end
74
86
 
87
+ # Sets up the mocks for a VM
88
+ def mock_vm(env=nil)
89
+ env ||= mock_environment
90
+ vm = Vagrant::VM.new
91
+ vm.stubs(:env).returns(env)
92
+ vm.stubs(:ssh).returns(Vagrant::SSH.new(vm.env))
93
+ vm
94
+ end
95
+
75
96
  # Sets up the mocks and instantiates an action for testing
76
97
  def mock_action(action_klass, *args)
77
98
  vm = mock("vboxvm")
@@ -79,16 +100,38 @@ class Test::Unit::TestCase
79
100
  action = action_klass.new(mock_vm, *args)
80
101
  stub_default_action_dependecies(action)
81
102
 
103
+ mock_vm.stubs(:name).returns("foo")
82
104
  mock_vm.stubs(:vm).returns(vm)
83
105
  mock_vm.stubs(:vm=)
84
106
  mock_vm.stubs(:invoke_callback)
85
107
  mock_vm.stubs(:invoke_around_callback).yields
86
108
  mock_vm.stubs(:actions).returns([action])
87
109
  mock_vm.stubs(:env).returns(mock_environment)
110
+ mock_vm.env.stubs(:logger).returns(quiet_logger("mock"))
111
+
112
+ mock_ssh = Vagrant::SSH.new(mock_vm.env)
113
+ mock_ssh.stubs(:execute)
114
+
115
+ mock_vm.stubs(:ssh).returns(mock_ssh)
116
+
117
+ vm.stubs(:env).returns(mock_vm.env)
88
118
 
89
119
  [mock_vm, vm, action]
90
120
  end
91
121
 
122
+ # Returns a resource logger which is safe for tests
123
+ def quiet_logger(resource, env=nil)
124
+ logger = Vagrant::ResourceLogger.new(resource, env)
125
+ logger.stubs(:flush_progress)
126
+ logger.stubs(:cl_reset).returns("")
127
+ logger
128
+ end
129
+
130
+ # Returns a linux system
131
+ def linux_system(vm)
132
+ Vagrant::Systems::Linux.new(vm)
133
+ end
134
+
92
135
  def stub_default_action_dependecies(mock)
93
136
  mock.stubs(:precedes).returns([])
94
137
  mock.stubs(:follows).returns([])
@@ -99,7 +142,7 @@ class Test::Unit::TestCase
99
142
  tempfile = mock("tempfile")
100
143
  tempfile.stubs(:write)
101
144
 
102
- [downloader_klass.new, tempfile]
145
+ [downloader_klass.new(mock_environment), tempfile]
103
146
  end
104
147
  end
105
148
 
@@ -93,7 +93,6 @@ class DownloadBoxActionTest < Test::Unit::TestCase
93
93
  @action.with_tempfile
94
94
  end
95
95
 
96
-
97
96
  should "yield the tempfile object" do
98
97
  @tempfile = mock("tempfile")
99
98
  File.expects(:open).yields(@tempfile)
@@ -104,22 +103,6 @@ class DownloadBoxActionTest < Test::Unit::TestCase
104
103
  end
105
104
  end
106
105
 
107
- context "file options" do
108
- should "include add binary bit to options on windows platform" do
109
- # This constant is not defined on non-windows platforms, so define it here
110
- File::BINARY = 4096 unless defined?(File::BINARY)
111
-
112
- Mario::Platform.expects(:windows?).returns(true)
113
- assert_equal @action.file_options, File::CREAT|File::EXCL|File::WRONLY|File::BINARY
114
- end
115
-
116
- should "not include binary bit on other platforms" do
117
- Mario::Platform.expects(:windows?).returns(false)
118
- assert_equal @action.file_options, File::CREAT|File::EXCL|File::WRONLY
119
- end
120
- end
121
-
122
-
123
106
  context "cleaning up" do
124
107
  setup do
125
108
  @temp_path = "foo"
@@ -6,13 +6,6 @@ class BootActionTest < Test::Unit::TestCase
6
6
  @runner.stubs(:invoke_callback)
7
7
  end
8
8
 
9
- context "preparing" do
10
- should "add the root shared folder" do
11
- @runner.env.config.vm.expects(:share_folder).with("v-root", @runner.env.config.vm.project_directory, @runner.env.root_path).once
12
- @action.prepare
13
- end
14
- end
15
-
16
9
  context "execution" do
17
10
  should "invoke the 'boot' around callback" do
18
11
  boot_seq = sequence("boot_seq")
@@ -43,13 +36,13 @@ class BootActionTest < Test::Unit::TestCase
43
36
  context "waiting for boot" do
44
37
  should "repeatedly ping the SSH port and return false with no response" do
45
38
  seq = sequence('pings')
46
- @runner.env.ssh.expects(:up?).times(@runner.env.config.ssh.max_tries.to_i - 1).returns(false).in_sequence(seq)
47
- @runner.env.ssh.expects(:up?).once.returns(true).in_sequence(seq)
39
+ @runner.ssh.expects(:up?).times(@runner.env.config.ssh.max_tries.to_i - 1).returns(false).in_sequence(seq)
40
+ @runner.ssh.expects(:up?).once.returns(true).in_sequence(seq)
48
41
  assert @action.wait_for_boot(0)
49
42
  end
50
43
 
51
44
  should "ping the max number of times then just return" do
52
- @runner.env.ssh.expects(:up?).times(Vagrant.config.ssh.max_tries.to_i).returns(false)
45
+ @runner.ssh.expects(:up?).times(@runner.env.config.ssh.max_tries.to_i).returns(false)
53
46
  assert !@action.wait_for_boot(0)
54
47
  end
55
48
  end
@@ -7,9 +7,15 @@ class CustomizeActionTest < Test::Unit::TestCase
7
7
 
8
8
  context "executing" do
9
9
  should "run the VM customization procs then save the VM" do
10
+ @runner.env.config.vm.customize { |vm| }
10
11
  @runner.env.config.vm.expects(:run_procs!).with(@vm)
11
12
  @vm.expects(:save).once
12
13
  @action.execute!
13
14
  end
15
+
16
+ should "not run anything if no customize blocks exist" do
17
+ @vm.expects(:save).never
18
+ @action.execute!
19
+ end
14
20
  end
15
21
  end
@@ -15,7 +15,7 @@ class DestroyActionTest < Test::Unit::TestCase
15
15
  @runner.stubs(:invoke_around_callback).yields
16
16
  clear_seq = sequence("clear")
17
17
  @action.expects(:destroy_vm).in_sequence(clear_seq)
18
- @action.expects(:depersist).in_sequence(clear_seq)
18
+ @action.expects(:update_dotfile).in_sequence(clear_seq)
19
19
  @action.execute!
20
20
  end
21
21
  end
@@ -23,14 +23,15 @@ class DestroyActionTest < Test::Unit::TestCase
23
23
  context "destroying the VM" do
24
24
  should "destroy VM and attached images" do
25
25
  @vm.expects(:destroy).with(:destroy_medium => :delete).once
26
+ @runner.expects(:vm=).with(nil).once
26
27
  @action.destroy_vm
27
28
  end
28
29
  end
29
30
 
30
- context "depersisting" do
31
- should "call depersist_vm on Env" do
32
- @runner.env.expects(:depersist_vm).once
33
- @action.depersist
31
+ context "updating the dotfile" do
32
+ should "update the environment dotfile" do
33
+ @runner.env.expects(:update_dotfile).once
34
+ @action.update_dotfile
34
35
  end
35
36
  end
36
37
  end
@@ -13,33 +13,27 @@ class DownActionTest < Test::Unit::TestCase
13
13
  def setup_action_expectations(order)
14
14
  default_seq = sequence("default_seq")
15
15
  order.each do |action|
16
- @runner.expects(:add_action).with(action).once.in_sequence(default_seq)
16
+ action = [action] unless action.is_a?(Array)
17
+ @runner.expects(:add_action).with(action.shift, *action).once.in_sequence(default_seq)
17
18
  end
18
19
  end
19
20
 
20
21
  should "add the destroy action alone if VM is not running" do
21
- setup_action_expectations([Vagrant::Actions::VM::Destroy])
22
+ setup_action_expectations([Vagrant::Actions::VM::Network, Vagrant::Actions::VM::Destroy])
22
23
  @action.prepare
23
24
  end
24
25
 
25
26
  should "add the halt action if the VM is running" do
26
27
  @vm.expects(:running?).returns(true)
27
- setup_action_expectations([Vagrant::Actions::VM::Halt, Vagrant::Actions::VM::Destroy])
28
+ setup_action_expectations([[Vagrant::Actions::VM::Halt, {:force => true}], Vagrant::Actions::VM::Network, Vagrant::Actions::VM::Destroy])
28
29
  @action.prepare
29
30
  end
30
31
  end
31
32
 
32
33
  context "after halting" do
33
- should "sleep if boot mode is GUI" do
34
- @runner.env.config.vm.boot_mode = "gui"
34
+ should "sleep" do
35
35
  Kernel.expects(:sleep).once
36
36
  @action.after_halt
37
37
  end
38
-
39
- should "not sleep if boot mode is anything else" do
40
- @runner.env.config.vm.boot_mode = "vrdp"
41
- Kernel.expects(:sleep).never
42
- @action.after_halt
43
- end
44
38
  end
45
39
  end
@@ -3,6 +3,7 @@ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
3
3
  class ExportActionTest < Test::Unit::TestCase
4
4
  setup do
5
5
  @runner, @vm, @action = mock_action(Vagrant::Actions::VM::Export)
6
+ @action.stubs(:complete_progress)
6
7
  end
7
8
 
8
9
  context "executing" do
@@ -2,10 +2,18 @@ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
2
 
3
3
  class ForwardPortsActionTest < Test::Unit::TestCase
4
4
  setup do
5
- @mock_vm, @vm, @action = mock_action(Vagrant::Actions::VM::ForwardPorts)
5
+ @runner, @vm, @action = mock_action(Vagrant::Actions::VM::ForwardPorts)
6
6
  end
7
7
 
8
- context "checking for colliding ports" do
8
+ context "preparing" do
9
+ should "call proper sequence" do
10
+ prep_seq = sequence("prepare")
11
+ @action.expects(:external_collision_check).in_sequence(prep_seq)
12
+ @action.prepare
13
+ end
14
+ end
15
+
16
+ context "checking for colliding external ports" do
9
17
  setup do
10
18
  @forwarded_port = mock("forwarded_port")
11
19
  @forwarded_port.stubs(:hostport)
@@ -15,7 +23,7 @@ class ForwardPortsActionTest < Test::Unit::TestCase
15
23
  @vm.stubs(:forwarded_ports).returns(@forwarded_ports)
16
24
  @vm.stubs(:running?).returns(true)
17
25
  @vm.stubs(:uuid).returns("foo")
18
- @mock_vm.stubs(:uuid).returns("bar")
26
+ @runner.stubs(:uuid).returns("bar")
19
27
  vms = [@vm]
20
28
  VirtualBox::VM.stubs(:all).returns(vms)
21
29
 
@@ -24,37 +32,80 @@ class ForwardPortsActionTest < Test::Unit::TestCase
24
32
  config.vm.forward_port("ssh", 22, 2222)
25
33
  end
26
34
 
27
- @mock_vm.stubs(:env).returns(@env)
35
+ @runner.stubs(:env).returns(@env)
36
+
37
+ # So no exceptions are raised
38
+ @action.stubs(:handle_collision)
28
39
  end
29
40
 
30
41
  should "ignore vms which aren't running" do
31
42
  @vm.expects(:running?).returns(false)
32
43
  @vm.expects(:forwarded_ports).never
33
- @action.prepare
44
+ @action.external_collision_check
34
45
  end
35
46
 
36
47
  should "ignore vms which are equivalent to ours" do
37
- @mock_vm.expects(:uuid).returns(@vm.uuid)
48
+ @runner.expects(:uuid).returns(@vm.uuid)
38
49
  @vm.expects(:forwarded_ports).never
39
- @action.prepare
50
+ @action.external_collision_check
40
51
  end
41
52
 
42
53
  should "not raise any errors if no forwarded ports collide" do
43
54
  @forwarded_port.expects(:hostport).returns(80)
44
- assert_nothing_raised { @action.prepare }
55
+ assert_nothing_raised { @action.external_collision_check }
45
56
  end
46
57
 
47
- should "raise an ActionException if a port collides" do
58
+ should "handle the collision if it happens" do
48
59
  @forwarded_port.expects(:hostport).returns(2222)
60
+ @action.expects(:handle_collision).with("ssh", anything, anything).once
61
+ @action.external_collision_check
62
+ end
63
+ end
64
+
65
+ context "handling collisions" do
66
+ setup do
67
+ @name = :foo
68
+ @options = {
69
+ :hostport => 0,
70
+ :auto => true
71
+ }
72
+ @used_ports = [1,2,3]
73
+
74
+ @runner.env.config.vm.auto_port_range = (1..5)
75
+ end
76
+
77
+ should "raise an exception if auto forwarding is disabled" do
78
+ @options[:auto] = false
79
+
49
80
  assert_raises(Vagrant::Actions::ActionException) {
50
- @action.prepare
81
+ @action.handle_collision(@name, @options, @used_ports)
51
82
  }
52
83
  end
53
84
 
54
- should "convert ports to strings prior to checking" do
55
- @forwarded_port.expects(:hostport).returns("2222")
85
+ should "set the host port to the first available port" do
86
+ assert_equal 0, @options[:hostport]
87
+ @action.handle_collision(@name, @options, @used_ports)
88
+ assert_equal 4, @options[:hostport]
89
+ end
90
+
91
+ should "add the newly used port to the list of used ports" do
92
+ assert !@used_ports.include?(4)
93
+ @action.handle_collision(@name, @options, @used_ports)
94
+ assert @used_ports.include?(4)
95
+ end
96
+
97
+ should "not use a host port which is being forwarded later" do
98
+ @runner.env.config.vm.forward_port("http", 80, 4)
99
+
100
+ assert_equal 0, @options[:hostport]
101
+ @action.handle_collision(@name, @options, @used_ports)
102
+ assert_equal 5, @options[:hostport]
103
+ end
104
+
105
+ should "raise an exception if there are no auto ports available" do
106
+ @runner.env.config.vm.auto_port_range = (1..3)
56
107
  assert_raises(Vagrant::Actions::ActionException) {
57
- @action.prepare
108
+ @action.handle_collision(@name, @options, @used_ports)
58
109
  }
59
110
  end
60
111
  end
@@ -71,18 +122,37 @@ class ForwardPortsActionTest < Test::Unit::TestCase
71
122
  context "forwarding ports" do
72
123
  should "create a port forwarding for the VM" do
73
124
  forwarded_ports = mock("forwarded_ports")
125
+ network_adapter = mock("network_adapter")
74
126
 
75
- @mock_vm.env.config.vm.forwarded_ports.each do |name, opts|
127
+ @vm.expects(:network_adapters).returns([network_adapter])
128
+ network_adapter.expects(:attachment_type).returns(:nat)
129
+
130
+ @runner.env.config.vm.forwarded_ports.each do |name, opts|
76
131
  forwarded_ports.expects(:<<).with do |port|
77
132
  assert_equal name, port.name
78
133
  assert_equal opts[:hostport], port.hostport
79
134
  assert_equal opts[:guestport], port.guestport
135
+ assert_equal opts[:adapter], port.instance
80
136
  true
81
137
  end
82
138
  end
83
139
 
84
140
  @vm.expects(:forwarded_ports).returns(forwarded_ports)
85
141
  @vm.expects(:save).once
142
+ @runner.expects(:reload!).once
143
+ @action.forward_ports
144
+ end
145
+ end
146
+
147
+ context "Not forwarding ports" do
148
+ should "No port forwarding for non NAT interfaces" do
149
+ forwarded_ports = mock("forwarded_ports")
150
+ network_adapter = mock("network_adapter")
151
+
152
+ @vm.expects(:network_adapters).returns([network_adapter])
153
+ network_adapter.expects(:attachment_type).returns(:host_only)
154
+ @vm.expects(:save).once
155
+ @runner.expects(:reload!).once
86
156
  @action.forward_ports
87
157
  end
88
158
  end
@@ -96,7 +166,14 @@ class ForwardPortsActionTest < Test::Unit::TestCase
96
166
  forwarded_ports << port
97
167
  end
98
168
 
99
- @vm.expects(:forwarded_ports).returns(forwarded_ports)
169
+ @vm.stubs(:forwarded_ports).returns(forwarded_ports)
170
+ @runner.expects(:reload!)
171
+ @action.clear
172
+ end
173
+
174
+ should "do nothing if there are no forwarded ports" do
175
+ @vm.stubs(:forwarded_ports).returns([])
176
+ @runner.expects(:reload!).never
100
177
  @action.clear
101
178
  end
102
179
  end
@@ -3,25 +3,57 @@ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
3
3
  class HaltActionTest < Test::Unit::TestCase
4
4
  setup do
5
5
  @runner, @vm, @action = mock_action(Vagrant::Actions::VM::Halt)
6
+ @runner.stubs(:system).returns(linux_system(@vm))
7
+ end
8
+
9
+ context "force?" do
10
+ should "not force by default" do
11
+ @action.options[:force] = nil
12
+ assert !@action.force?
13
+ end
14
+
15
+ should "force if specified" do
16
+ @action.options[:force] = true
17
+ assert @action.force?
18
+ end
6
19
  end
7
20
 
8
21
  context "executing" do
9
22
  setup do
10
23
  @vm.stubs(:running?).returns(true)
24
+
25
+ @runner.system.stubs(:halt)
26
+ @vm.stubs(:stop)
27
+ @vm.stubs(:state).returns(:powered_off)
11
28
  end
12
29
 
13
30
  should "invoke the 'halt' around callback" do
14
- halt_seq = sequence("halt_seq")
15
- @runner.expects(:invoke_around_callback).with(:halt).once.in_sequence(halt_seq).yields
16
- @vm.expects(:stop).in_sequence(halt_seq)
31
+ @runner.expects(:invoke_around_callback).with(:halt).once
17
32
  @action.execute!
18
33
  end
19
34
 
20
- should "force the VM to stop" do
35
+ should "halt with the system and NOT force VM to stop if powered off" do
36
+ @vm.expects(:state).with(true).returns(:powered_off)
37
+
38
+ @runner.system.expects(:halt).once
39
+ @vm.expects(:stop).never
40
+ @action.execute!
41
+ end
42
+
43
+ should "halt with the system and force VM to stop if NOT powered off" do
44
+ @vm.expects(:state).with(true).returns(:running)
45
+
46
+ @runner.system.expects(:halt).once
21
47
  @vm.expects(:stop).once
22
48
  @action.execute!
23
49
  end
24
50
 
51
+ should "not call halt on the system if forcing" do
52
+ @action.stubs(:force).returns(true)
53
+ @runner.system.expects(:halt).never
54
+ @action.execute!
55
+ end
56
+
25
57
  should "raise an ActionException if VM is not running" do
26
58
  @vm.stubs(:running?).returns(false)
27
59
  @vm.expects(:stop).never