vagrant 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/.gitignore +11 -0
  2. data/Gemfile +17 -0
  3. data/README.md +45 -0
  4. data/Rakefile +41 -0
  5. data/VERSION +1 -0
  6. data/bin/.gitignore +0 -0
  7. data/bin/vagrant +15 -0
  8. data/bin/vagrant-box +35 -0
  9. data/bin/vagrant-down +28 -0
  10. data/bin/vagrant-halt +29 -0
  11. data/bin/vagrant-init +28 -0
  12. data/bin/vagrant-package +30 -0
  13. data/bin/vagrant-reload +30 -0
  14. data/bin/vagrant-resume +28 -0
  15. data/bin/vagrant-ssh +28 -0
  16. data/bin/vagrant-suspend +28 -0
  17. data/bin/vagrant-up +30 -0
  18. data/config/default.rb +29 -0
  19. data/lib/vagrant.rb +14 -0
  20. data/lib/vagrant/actions/base.rb +93 -0
  21. data/lib/vagrant/actions/box/add.rb +22 -0
  22. data/lib/vagrant/actions/box/destroy.rb +14 -0
  23. data/lib/vagrant/actions/box/download.rb +63 -0
  24. data/lib/vagrant/actions/box/unpackage.rb +49 -0
  25. data/lib/vagrant/actions/runner.rb +128 -0
  26. data/lib/vagrant/actions/vm/destroy.rb +14 -0
  27. data/lib/vagrant/actions/vm/down.rb +12 -0
  28. data/lib/vagrant/actions/vm/export.rb +41 -0
  29. data/lib/vagrant/actions/vm/forward_ports.rb +32 -0
  30. data/lib/vagrant/actions/vm/halt.rb +14 -0
  31. data/lib/vagrant/actions/vm/import.rb +17 -0
  32. data/lib/vagrant/actions/vm/move_hard_drive.rb +53 -0
  33. data/lib/vagrant/actions/vm/package.rb +61 -0
  34. data/lib/vagrant/actions/vm/provision.rb +71 -0
  35. data/lib/vagrant/actions/vm/reload.rb +17 -0
  36. data/lib/vagrant/actions/vm/resume.rb +16 -0
  37. data/lib/vagrant/actions/vm/shared_folders.rb +69 -0
  38. data/lib/vagrant/actions/vm/start.rb +50 -0
  39. data/lib/vagrant/actions/vm/suspend.rb +16 -0
  40. data/lib/vagrant/actions/vm/up.rb +35 -0
  41. data/lib/vagrant/box.rb +129 -0
  42. data/lib/vagrant/busy.rb +73 -0
  43. data/lib/vagrant/commands.rb +174 -0
  44. data/lib/vagrant/config.rb +156 -0
  45. data/lib/vagrant/downloaders/base.rb +13 -0
  46. data/lib/vagrant/downloaders/file.rb +21 -0
  47. data/lib/vagrant/downloaders/http.rb +47 -0
  48. data/lib/vagrant/env.rb +140 -0
  49. data/lib/vagrant/ssh.rb +43 -0
  50. data/lib/vagrant/util.rb +45 -0
  51. data/lib/vagrant/vm.rb +57 -0
  52. data/script/vagrant-ssh-expect.sh +22 -0
  53. data/templates/Vagrantfile +8 -0
  54. data/test/test_helper.rb +91 -0
  55. data/test/vagrant/actions/base_test.rb +32 -0
  56. data/test/vagrant/actions/box/add_test.rb +37 -0
  57. data/test/vagrant/actions/box/destroy_test.rb +18 -0
  58. data/test/vagrant/actions/box/download_test.rb +118 -0
  59. data/test/vagrant/actions/box/unpackage_test.rb +101 -0
  60. data/test/vagrant/actions/runner_test.rb +236 -0
  61. data/test/vagrant/actions/vm/destroy_test.rb +24 -0
  62. data/test/vagrant/actions/vm/down_test.rb +32 -0
  63. data/test/vagrant/actions/vm/export_test.rb +88 -0
  64. data/test/vagrant/actions/vm/forward_ports_test.rb +50 -0
  65. data/test/vagrant/actions/vm/halt_test.rb +27 -0
  66. data/test/vagrant/actions/vm/import_test.rb +36 -0
  67. data/test/vagrant/actions/vm/move_hard_drive_test.rb +108 -0
  68. data/test/vagrant/actions/vm/package_test.rb +155 -0
  69. data/test/vagrant/actions/vm/provision_test.rb +103 -0
  70. data/test/vagrant/actions/vm/reload_test.rb +44 -0
  71. data/test/vagrant/actions/vm/resume_test.rb +27 -0
  72. data/test/vagrant/actions/vm/shared_folders_test.rb +117 -0
  73. data/test/vagrant/actions/vm/start_test.rb +55 -0
  74. data/test/vagrant/actions/vm/suspend_test.rb +27 -0
  75. data/test/vagrant/actions/vm/up_test.rb +76 -0
  76. data/test/vagrant/box_test.rb +92 -0
  77. data/test/vagrant/busy_test.rb +81 -0
  78. data/test/vagrant/commands_test.rb +252 -0
  79. data/test/vagrant/config_test.rb +123 -0
  80. data/test/vagrant/downloaders/base_test.rb +20 -0
  81. data/test/vagrant/downloaders/file_test.rb +32 -0
  82. data/test/vagrant/downloaders/http_test.rb +40 -0
  83. data/test/vagrant/env_test.rb +293 -0
  84. data/test/vagrant/ssh_test.rb +95 -0
  85. data/test/vagrant/util_test.rb +64 -0
  86. data/test/vagrant/vm_test.rb +96 -0
  87. metadata +275 -0
@@ -0,0 +1,92 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class BoxTest < Test::Unit::TestCase
4
+ context "class methods" do
5
+ context "finding" do
6
+ setup do
7
+ @dir = "foo"
8
+ @name = "bar"
9
+ Vagrant::Box.stubs(:directory).with(@name).returns(@dir)
10
+ end
11
+
12
+ should "return nil if the box doesn't exist" do
13
+ File.expects(:directory?).with(@dir).once.returns(false)
14
+ assert_nil Vagrant::Box.find(@name)
15
+ end
16
+
17
+ should "return a box object with the proper name set" do
18
+ File.expects(:directory?).with(@dir).once.returns(true)
19
+ result = Vagrant::Box.find(@name)
20
+ assert result
21
+ assert_equal @name, result.name
22
+ end
23
+ end
24
+
25
+ context "adding" do
26
+ setup do
27
+ @name = "foo"
28
+ @uri = "bar"
29
+ end
30
+
31
+ should "create a new instance, set the variables, and add it" do
32
+ box = mock("box")
33
+ box.expects(:name=).with(@name)
34
+ box.expects(:uri=).with(@uri)
35
+ box.expects(:add).once
36
+ Vagrant::Box.expects(:new).returns(box)
37
+ Vagrant::Box.add(@name, @uri)
38
+ end
39
+ end
40
+
41
+ context "box directory" do
42
+ setup do
43
+ @name = "foo"
44
+ @box_dir = File.join(Vagrant::Env.boxes_path, @name)
45
+ end
46
+
47
+ should "return the boxes_path joined with the name" do
48
+ assert_equal @box_dir, Vagrant::Box.directory(@name)
49
+ end
50
+ end
51
+ end
52
+
53
+ context "instance methods" do
54
+ setup do
55
+ @box = Vagrant::Box.new
56
+ end
57
+
58
+ should "execute the Add action when add is called" do
59
+ @box.expects(:execute!).with(Vagrant::Actions::Box::Add).once
60
+ @box.add
61
+ end
62
+
63
+ context "box directory" do
64
+ setup do
65
+ @box.name = "foo"
66
+ end
67
+
68
+ should "return the boxes_path joined with the name" do
69
+ result = mock("object")
70
+ Vagrant::Box.expects(:directory).with(@box.name).returns(result)
71
+ assert result.equal?(@box.directory)
72
+ end
73
+ end
74
+
75
+ context "destroying" do
76
+ should "execute the destroy action" do
77
+ @box.expects(:execute!).with(Vagrant::Actions::Box::Destroy).once
78
+ @box.destroy
79
+ end
80
+ end
81
+
82
+ context "ovf file" do
83
+ setup do
84
+ @box.stubs(:directory).returns("foo")
85
+ end
86
+
87
+ should "be the directory joined with the config ovf file" do
88
+ assert_equal File.join(@box.directory, Vagrant.config.vm.box_ovf), @box.ovf_file
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,81 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class BusyTest < Test::Unit::TestCase
4
+ context "waiting for not busy" do
5
+ setup do
6
+ Vagrant::Busy.reset_trap_thread!
7
+ end
8
+
9
+ should "run in a thread" do
10
+ Thread.expects(:new).once.returns(nil)
11
+ Vagrant::Busy.wait_for_not_busy
12
+ end
13
+
14
+ should "not start a thread multiple times" do
15
+ Thread.expects(:new).once.returns("foo")
16
+ Vagrant::Busy.wait_for_not_busy
17
+ end
18
+ end
19
+
20
+ context "during an action in a busy block" do
21
+ should "report as busy" do
22
+ Vagrant.busy do
23
+ # Inside the block Vagrant.busy? should be true
24
+ assert Vagrant.busy?
25
+ end
26
+
27
+ #After the block finishes Vagrant.busy? should be false
28
+ assert !Vagrant.busy?
29
+ end
30
+
31
+ should "set busy to false upon exception and reraise the error" do
32
+ assert_raise Exception do
33
+ Vagrant.busy do
34
+ assert Vagrant.busy?
35
+ raise Exception
36
+ end
37
+ end
38
+
39
+ assert !Vagrant.busy?
40
+ end
41
+
42
+ should "complete the trap thread even if an exception occurs" do
43
+ trap_thread = mock("trap_thread")
44
+ trap_thread.expects(:join).once
45
+ Vagrant::Busy.stubs(:trap_thread).returns(trap_thread)
46
+
47
+ assert_raise Exception do
48
+ Vagrant.busy do
49
+ raise Exception
50
+ end
51
+ end
52
+ end
53
+
54
+ should "report busy to the outside world regardless of thread" do
55
+ Thread.new do
56
+ Vagrant.busy do
57
+ sleep(1)
58
+ end
59
+ end
60
+
61
+ # While the above thread is executing vagrant should be busy
62
+ assert Vagrant.busy?
63
+ end
64
+
65
+ should "run the action in a new thread" do
66
+ runner_thread = nil
67
+ Vagrant.busy do
68
+ runner_thread = Thread.current
69
+ end
70
+
71
+ assert_not_equal Thread.current, runner_thread
72
+ end
73
+
74
+ should "trap INT" do
75
+ trap_seq = sequence("trap_seq")
76
+ Signal.expects(:trap).with("INT", anything).once.in_sequence(trap_seq)
77
+ Signal.expects(:trap).with("INT", "DEFAULT").once.in_sequence(trap_seq)
78
+ Vagrant.busy do; end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,252 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class CommandsTest < Test::Unit::TestCase
4
+ setup do
5
+ Vagrant::Env.stubs(:load!)
6
+
7
+ @persisted_vm = mock("persisted_vm")
8
+ @persisted_vm.stubs(:execute!)
9
+ Vagrant::Env.stubs(:persisted_vm).returns(@persisted_vm)
10
+ end
11
+
12
+ context "init" do
13
+ setup do
14
+ File.stubs(:copy)
15
+ @rootfile_path = File.join(Dir.pwd, Vagrant::Env::ROOTFILE_NAME)
16
+ @template_path = File.join(PROJECT_ROOT, "templates", Vagrant::Env::ROOTFILE_NAME)
17
+ end
18
+
19
+ should "error and exit if a rootfile already exists" do
20
+ File.expects(:exist?).with(@rootfile_path).returns(true)
21
+ Vagrant::Commands.expects(:error_and_exit).once
22
+ Vagrant::Commands.init
23
+ end
24
+
25
+ should "copy the templated rootfile to the current path" do
26
+ File.expects(:exist?).with(@rootfile_path).returns(false)
27
+ File.expects(:copy).with(@template_path, @rootfile_path).once
28
+ Vagrant::Commands.init
29
+ end
30
+ end
31
+
32
+ context "up" do
33
+ setup do
34
+ Vagrant::Env.stubs(:persisted_vm).returns(nil)
35
+ Vagrant::VM.stubs(:execute!)
36
+ Vagrant::Env.stubs(:require_box)
37
+ end
38
+
39
+ should "require load the environment" do
40
+ Vagrant::Env.expects(:load!).once
41
+ Vagrant::Commands.up
42
+ end
43
+
44
+ should "require a box" do
45
+ Vagrant::Env.expects(:require_box).once
46
+ Vagrant::Commands.up
47
+ end
48
+
49
+ should "call the up action on VM if it doesn't exist" do
50
+ Vagrant::VM.expects(:execute!).with(Vagrant::Actions::VM::Up).once
51
+ Vagrant::Commands.up
52
+ end
53
+
54
+ should "call start on the persisted vm if it exists" do
55
+ Vagrant::Env.stubs(:persisted_vm).returns(@persisted_vm)
56
+ @persisted_vm.expects(:start).once
57
+ Vagrant::VM.expects(:execute!).never
58
+ Vagrant::Commands.up
59
+ end
60
+ end
61
+
62
+ context "down" do
63
+ setup do
64
+ @persisted_vm.stubs(:destroy)
65
+ end
66
+
67
+ should "require a persisted VM" do
68
+ Vagrant::Env.expects(:require_persisted_vm).once
69
+ Vagrant::Commands.down
70
+ end
71
+
72
+ should "destroy the persisted VM and the VM image" do
73
+ @persisted_vm.expects(:destroy).once
74
+ Vagrant::Commands.down
75
+ end
76
+ end
77
+
78
+ context "reload" do
79
+ should "require a persisted VM" do
80
+ Vagrant::Env.expects(:require_persisted_vm).once
81
+ Vagrant::Commands.reload
82
+ end
83
+
84
+ should "call the `reload` action on the VM" do
85
+ @persisted_vm.expects(:execute!).with(Vagrant::Actions::VM::Reload).once
86
+ Vagrant::Commands.reload
87
+ end
88
+ end
89
+
90
+ context "ssh" do
91
+ setup do
92
+ Vagrant::SSH.stubs(:connect)
93
+ end
94
+
95
+ should "require a persisted VM" do
96
+ Vagrant::Env.expects(:require_persisted_vm).once
97
+ Vagrant::Commands.ssh
98
+ end
99
+
100
+ should "connect to SSH" do
101
+ Vagrant::SSH.expects(:connect).once
102
+ Vagrant::Commands.ssh
103
+ end
104
+ end
105
+
106
+ context "halt" do
107
+ should "require a persisted VM" do
108
+ Vagrant::Env.expects(:require_persisted_vm).once
109
+ Vagrant::Commands.halt
110
+ end
111
+
112
+ should "call the `halt` action on the VM" do
113
+ @persisted_vm.expects(:execute!).with(Vagrant::Actions::VM::Halt).once
114
+ Vagrant::Commands.halt
115
+ end
116
+ end
117
+
118
+ context "suspend" do
119
+ setup do
120
+ @persisted_vm.stubs(:suspend)
121
+ @persisted_vm.stubs(:saved?).returns(false)
122
+ end
123
+
124
+ should "require a persisted VM" do
125
+ Vagrant::Env.expects(:require_persisted_vm).once
126
+ Vagrant::Commands.suspend
127
+ end
128
+
129
+ should "suspend the VM" do
130
+ @persisted_vm.expects(:suspend).once
131
+ Vagrant::Commands.suspend
132
+ end
133
+ end
134
+
135
+ context "resume" do
136
+ setup do
137
+ @persisted_vm.stubs(:resume)
138
+ @persisted_vm.stubs(:saved?).returns(true)
139
+ end
140
+
141
+ should "require a persisted VM" do
142
+ Vagrant::Env.expects(:require_persisted_vm).once
143
+ Vagrant::Commands.resume
144
+ end
145
+
146
+ should "save the state of the VM" do
147
+ @persisted_vm.expects(:resume).once
148
+ Vagrant::Commands.resume
149
+ end
150
+ end
151
+
152
+ context "package" do
153
+ setup do
154
+ @persisted_vm.stubs(:package)
155
+ @persisted_vm.stubs(:powered_off?).returns(true)
156
+ end
157
+
158
+ should "require a persisted vm" do
159
+ Vagrant::Env.expects(:require_persisted_vm).once
160
+ Vagrant::Commands.package
161
+ end
162
+
163
+ should "error and exit if the VM is not powered off" do
164
+ @persisted_vm.stubs(:powered_off?).returns(false)
165
+ Vagrant::Commands.expects(:error_and_exit).once
166
+ @persisted_vm.expects(:package).never
167
+ Vagrant::Commands.package
168
+ end
169
+
170
+ should "call package on the persisted VM" do
171
+ @persisted_vm.expects(:package).once
172
+ Vagrant::Commands.package
173
+ end
174
+
175
+ should "pass the out path and include_files to the package method" do
176
+ out_path = mock("out_path")
177
+ include_files = mock("include_files")
178
+ @persisted_vm.expects(:package).with(out_path, include_files).once
179
+ Vagrant::Commands.package(out_path, include_files)
180
+ end
181
+
182
+ should "default to an empty array when not include_files are specified" do
183
+ out_path = mock("out_path")
184
+ @persisted_vm.expects(:package).with(out_path, []).once
185
+ Vagrant::Commands.package(out_path)
186
+ end
187
+ end
188
+
189
+ context "box" do
190
+ setup do
191
+ Vagrant::Commands.stubs(:box_foo)
192
+ Vagrant::Commands.stubs(:box_add)
193
+ Vagrant::Commands.stubs(:box_remove)
194
+ end
195
+
196
+ should "load the environment" do
197
+ Vagrant::Env.expects(:load!).with(:suppress_errors => true).once
198
+ Vagrant::Commands.box(["add"])
199
+ end
200
+
201
+ should "error and exit if the first argument is not 'add' or 'remove'" do
202
+ Vagrant::Commands.expects(:error_and_exit).once
203
+ Vagrant::Commands.box(["foo"])
204
+ end
205
+
206
+ should "not error and exit if the first argument is 'add' or 'remove'" do
207
+ commands = ["add", "remove"]
208
+
209
+ commands.each do |command|
210
+ Vagrant::Commands.expects(:error_and_exit).never
211
+ Vagrant::Commands.expects("box_#{command}".to_sym).once
212
+ Vagrant::Commands.box([command])
213
+ end
214
+ end
215
+
216
+ should "forward any additional arguments" do
217
+ Vagrant::Commands.expects(:box_add).with(1,2,3).once
218
+ Vagrant::Commands.box(["add",1,2,3])
219
+ end
220
+ end
221
+
222
+ context "box add" do
223
+ setup do
224
+ @name = "foo"
225
+ @path = "bar"
226
+ end
227
+
228
+ should "execute the add action with the name and path" do
229
+ Vagrant::Box.expects(:add).with(@name, @path).once
230
+ Vagrant::Commands.box_add(@name, @path)
231
+ end
232
+ end
233
+
234
+ context "box remove" do
235
+ setup do
236
+ @name = "foo"
237
+ end
238
+
239
+ should "error and exit if the box doesn't exist" do
240
+ Vagrant::Box.expects(:find).returns(nil)
241
+ Vagrant::Commands.expects(:error_and_exit).once
242
+ Vagrant::Commands.box_remove(@name)
243
+ end
244
+
245
+ should "call destroy on the box if it exists" do
246
+ @box = mock("box")
247
+ Vagrant::Box.expects(:find).with(@name).returns(@box)
248
+ @box.expects(:destroy).once
249
+ Vagrant::Commands.box_remove(@name)
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,123 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+ class ConfigTest < Test::Unit::TestCase
4
+ context "resetting" do
5
+ setup do
6
+ Vagrant::Config.run { |config| }
7
+ Vagrant::Config.execute!
8
+ end
9
+
10
+ should "return the same config object typically" do
11
+ config = Vagrant::Config.config
12
+ assert config.equal?(Vagrant::Config.config)
13
+ end
14
+
15
+ should "create a new object if cleared" do
16
+ config = Vagrant::Config.config
17
+ Vagrant::Config.reset!
18
+ assert !config.equal?(Vagrant::Config.config)
19
+ end
20
+
21
+ should "empty the runners" do
22
+ assert !Vagrant::Config.config_runners.empty?
23
+ Vagrant::Config.reset!
24
+ assert Vagrant::Config.config_runners.empty?
25
+ end
26
+ end
27
+
28
+ context "accessing configuration" do
29
+ setup do
30
+ Vagrant::Config.run { |config| }
31
+ Vagrant::Config.execute!
32
+ end
33
+
34
+ should "forward config to the class method" do
35
+ assert_equal Vagrant.config, Vagrant::Config.config
36
+ end
37
+ end
38
+
39
+ context "initializing" do
40
+ teardown do
41
+ Vagrant::Config.instance_variable_set(:@config_runners, nil)
42
+ Vagrant::Config.instance_variable_set(:@config, nil)
43
+ end
44
+
45
+ should "not run the blocks right away" do
46
+ obj = mock("obj")
47
+ obj.expects(:foo).never
48
+ Vagrant::Config.run { |config| obj.foo }
49
+ Vagrant::Config.run { |config| obj.foo }
50
+ Vagrant::Config.run { |config| obj.foo }
51
+ end
52
+
53
+ should "run the blocks when execute! is ran" do
54
+ obj = mock("obj")
55
+ obj.expects(:foo).times(2)
56
+ Vagrant::Config.run { |config| obj.foo }
57
+ Vagrant::Config.run { |config| obj.foo }
58
+ Vagrant::Config.execute!
59
+ end
60
+
61
+ should "run the blocks with the same config object" do
62
+ Vagrant::Config.run { |config| assert config }
63
+ Vagrant::Config.run { |config| assert config }
64
+ Vagrant::Config.execute!
65
+ end
66
+
67
+ should "not be loaded, initially" do
68
+ assert !Vagrant::Config.config.loaded?
69
+ end
70
+
71
+ should "be loaded after running" do
72
+ Vagrant::Config.run {}
73
+ Vagrant::Config.execute!
74
+ assert Vagrant::Config.config.loaded?
75
+ end
76
+ end
77
+
78
+ context "base class" do
79
+ setup do
80
+ @base = Vagrant::Config::Base.new
81
+ end
82
+
83
+ should "forward [] access to methods" do
84
+ @base.expects(:foo).once
85
+ @base[:foo]
86
+ end
87
+
88
+ should "return a hash of instance variables" do
89
+ data = { :foo => "bar", :bar => "baz" }
90
+
91
+ data.each do |iv, value|
92
+ @base.instance_variable_set("@#{iv}".to_sym, value)
93
+ end
94
+
95
+ result = @base.instance_variables_hash
96
+ assert_equal data.length, result.length
97
+
98
+ data.each do |iv, value|
99
+ assert_equal value, result[iv]
100
+ end
101
+ end
102
+
103
+ should "convert instance variable hash to json" do
104
+ @json = mock("json")
105
+ @iv_hash = mock("iv_hash")
106
+ @iv_hash.expects(:to_json).once.returns(@json)
107
+ @base.expects(:instance_variables_hash).returns(@iv_hash)
108
+ assert_equal @json, @base.to_json
109
+ end
110
+ end
111
+
112
+ context "chef config" do
113
+ setup do
114
+ @config = Vagrant::Config::ChefConfig.new
115
+ @config.json = "HEY"
116
+ end
117
+
118
+ should "not include the 'json' key in the config dump" do
119
+ result = JSON.parse(@config.to_json)
120
+ assert !result.has_key?("json")
121
+ end
122
+ end
123
+ end