vagrant 0.1.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 (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,103 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
+
3
+ class ProvisionActionTest < Test::Unit::TestCase
4
+ setup do
5
+ @mock_vm, @vm, @action = mock_action(Vagrant::Actions::VM::Provision)
6
+
7
+ Vagrant::SSH.stubs(:execute)
8
+ Vagrant::SSH.stubs(:upload!)
9
+
10
+ mock_config
11
+ end
12
+
13
+ context "shared folders" do
14
+ should "setup shared folder on VM for the cookbooks" do
15
+ File.expects(:expand_path).with(Vagrant.config.chef.cookbooks_path, Vagrant::Env.root_path).returns("foo")
16
+ @action.expects(:cookbooks_path).returns("bar")
17
+ assert_equal ["vagrant-provisioning", "foo", "bar"], @action.collect_shared_folders
18
+ end
19
+ end
20
+
21
+ context "cookbooks path" do
22
+ should "return the proper cookbook path" do
23
+ cookbooks_path = File.join(Vagrant.config.chef.provisioning_path, "cookbooks")
24
+ assert_equal cookbooks_path, @action.cookbooks_path
25
+ end
26
+ end
27
+
28
+ context "permissions on provisioning folder" do
29
+ should "chown the folder to the ssh user" do
30
+ ssh = mock("ssh")
31
+ ssh.expects(:exec!).with("sudo chown #{Vagrant.config.ssh.username} #{Vagrant.config.chef.provisioning_path}")
32
+ Vagrant::SSH.expects(:execute).yields(ssh)
33
+ @action.chown_provisioning_folder
34
+ end
35
+ end
36
+
37
+ context "generating and uploading json" do
38
+ def assert_json
39
+ Vagrant::SSH.expects(:upload!).with do |json, path|
40
+ data = JSON.parse(json.read)
41
+ yield data
42
+ true
43
+ end
44
+
45
+ @action.setup_json
46
+ end
47
+
48
+ should "merge in the extra json specified in the config" do
49
+ Vagrant.config.chef.json = { :foo => "BAR" }
50
+ assert_json do |data|
51
+ assert_equal "BAR", data["foo"]
52
+ end
53
+ end
54
+
55
+ should "add the directory as a special case to the JSON" do
56
+ assert_json do |data|
57
+ assert_equal Vagrant.config.vm.project_directory, data["vagrant"]["directory"]
58
+ end
59
+ end
60
+
61
+ should "add the config to the JSON" do
62
+ assert_json do |data|
63
+ assert_equal Vagrant.config.vm.project_directory, data["vagrant"]["config"]["vm"]["project_directory"]
64
+ end
65
+ end
66
+
67
+ should "upload a StringIO to dna.json" do
68
+ StringIO.expects(:new).with(anything).returns("bar")
69
+ File.expects(:join).with(Vagrant.config.chef.provisioning_path, "dna.json").once.returns("baz")
70
+ Vagrant::SSH.expects(:upload!).with("bar", "baz").once
71
+ @action.setup_json
72
+ end
73
+ end
74
+
75
+ context "generating and uploading chef solo configuration file" do
76
+ should "upload properly generate the configuration file using configuration data" do
77
+ expected_config = <<-config
78
+ file_cache_path "#{Vagrant.config.chef.provisioning_path}"
79
+ cookbook_path "#{@action.cookbooks_path}"
80
+ config
81
+
82
+ StringIO.expects(:new).with(expected_config).once
83
+ @action.setup_solo_config
84
+ end
85
+
86
+ should "upload this file as solo.rb to the provisioning folder" do
87
+ @action.expects(:cookbooks_path).returns("cookbooks")
88
+ StringIO.expects(:new).returns("foo")
89
+ File.expects(:join).with(Vagrant.config.chef.provisioning_path, "solo.rb").once.returns("bar")
90
+ Vagrant::SSH.expects(:upload!).with("foo", "bar").once
91
+ @action.setup_solo_config
92
+ end
93
+ end
94
+
95
+ context "running chef solo" do
96
+ should "cd into the provisioning directory and run chef solo" do
97
+ ssh = mock("ssh")
98
+ ssh.expects(:exec!).with("cd #{Vagrant.config.chef.provisioning_path} && sudo chef-solo -c solo.rb -j dna.json").once
99
+ Vagrant::SSH.expects(:execute).yields(ssh)
100
+ @action.run_chef_solo
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,44 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
+
3
+ class ReloadActionTest < Test::Unit::TestCase
4
+ setup do
5
+ @runner, @vm, @action = mock_action(Vagrant::Actions::VM::Reload)
6
+ mock_config
7
+ end
8
+
9
+ context "sub-actions" do
10
+ setup do
11
+ @default_order = [Vagrant::Actions::VM::ForwardPorts, Vagrant::Actions::VM::SharedFolders, Vagrant::Actions::VM::Start]
12
+ @vm.stubs(:running?).returns(false)
13
+ end
14
+
15
+ def setup_action_expectations
16
+ default_seq = sequence("default_seq")
17
+ @default_order.each do |action|
18
+ @runner.expects(:add_action).with(action).once.in_sequence(default_seq)
19
+ end
20
+ end
21
+
22
+ should "do the proper actions by default" do
23
+ setup_action_expectations
24
+ @action.prepare
25
+ end
26
+
27
+ should "halt if the VM is running" do
28
+ @vm.expects(:running?).returns(true)
29
+ @default_order.unshift(Vagrant::Actions::VM::Halt)
30
+ setup_action_expectations
31
+ @action.prepare
32
+ end
33
+
34
+ should "add in the provisioning step if enabled" do
35
+ mock_config do |config|
36
+ config.chef.enabled = true
37
+ end
38
+
39
+ @default_order.push(Vagrant::Actions::VM::Provision)
40
+ setup_action_expectations
41
+ @action.prepare
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,27 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
+
3
+ class ResumeActionTest < Test::Unit::TestCase
4
+ setup do
5
+ @runner, @vm, @action = mock_action(Vagrant::Actions::VM::Resume)
6
+ mock_config
7
+ end
8
+
9
+ context "executing" do
10
+ setup do
11
+ @vm.stubs(:saved?).returns(true)
12
+ end
13
+
14
+ should "save the state of the VM" do
15
+ @runner.expects(:start).once
16
+ @action.execute!
17
+ end
18
+
19
+ should "raise an ActionException if the VM is not saved" do
20
+ @vm.expects(:saved?).returns(false)
21
+ @vm.expects(:start).never
22
+ assert_raises(Vagrant::Actions::ActionException) {
23
+ @action.execute!
24
+ }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,117 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
+
3
+ class SharedFoldersActionTest < Test::Unit::TestCase
4
+ setup do
5
+ @mock_vm, @vm, @action = mock_action(Vagrant::Actions::VM::SharedFolders)
6
+ mock_config
7
+ end
8
+
9
+ def stub_shared_folders
10
+ folders = [%w{foo from to}, %w{bar bfrom bto}]
11
+ @action.expects(:shared_folders).returns(folders)
12
+ folders
13
+ end
14
+
15
+ context "collecting shared folders" do
16
+ should "return the arrays that the callback returns" do
17
+ result = [[1,2,3],[4,5,6]]
18
+ @mock_vm.expects(:invoke_callback).with(:collect_shared_folders).once.returns(result)
19
+ assert_equal result, @action.shared_folders
20
+ end
21
+
22
+ should "filter out invalid results" do
23
+ result = [[1,2,3],[4,5]]
24
+ @mock_vm.expects(:invoke_callback).with(:collect_shared_folders).once.returns(result)
25
+ assert_equal [[1,2,3]], @action.shared_folders
26
+ end
27
+ end
28
+
29
+ context "setting up shared folder metadata" do
30
+ setup do
31
+ @folders = stub_shared_folders
32
+ end
33
+
34
+ should "add all shared folders to the VM" do
35
+ share_seq = sequence("share_seq")
36
+ shared_folders = mock("shared_folders")
37
+ shared_folders.expects(:<<).in_sequence(share_seq).with() { |sf| sf.name == "foo" && sf.hostpath == "from" }
38
+ shared_folders.expects(:<<).in_sequence(share_seq).with() { |sf| sf.name == "bar" && sf.hostpath == "bfrom" }
39
+ @vm.stubs(:shared_folders).returns(shared_folders)
40
+ @vm.expects(:save).with(true).once
41
+
42
+ @action.before_boot
43
+ end
44
+ end
45
+
46
+ context "mounting the shared folders" do
47
+ setup do
48
+ @folders = stub_shared_folders
49
+ end
50
+
51
+ should "mount all shared folders to the VM" do
52
+ mount_seq = sequence("mount_seq")
53
+ ssh = mock("ssh")
54
+ @folders.each do |name, hostpath, guestpath|
55
+ ssh.expects(:exec!).with("sudo mkdir -p #{guestpath}").in_sequence(mount_seq)
56
+ @action.expects(:mount_folder).with(ssh, name, guestpath).in_sequence(mount_seq)
57
+ ssh.expects(:exec!).with("sudo chown #{Vagrant.config.ssh.username} #{guestpath}").in_sequence(mount_seq)
58
+ end
59
+ Vagrant::SSH.expects(:execute).yields(ssh)
60
+
61
+ @action.after_boot
62
+ end
63
+ end
64
+
65
+ context "mounting the main folder" do
66
+ setup do
67
+ @ssh = mock("ssh")
68
+ @name = "foo"
69
+ @guestpath = "bar"
70
+ @sleeptime = 0
71
+ @limit = 10
72
+
73
+ @success_return = false
74
+ end
75
+
76
+ def mount_folder
77
+ @action.mount_folder(@ssh, @name, @guestpath, @sleeptime)
78
+ end
79
+
80
+ should "execute the proper mount command" do
81
+ @ssh.expects(:exec!).with("sudo mount -t vboxsf #{@name} #{@guestpath}").returns(@success_return)
82
+ mount_folder
83
+ end
84
+
85
+ should "test type of text and text string to detect error" do
86
+ data = mock("data")
87
+ data.expects(:[]=).with(:result, !@success_return)
88
+
89
+ @ssh.expects(:exec!).yields(data, :stderr, "No such device").returns(@success_return)
90
+ mount_folder
91
+ end
92
+
93
+ should "test type of text and test string to detect success" do
94
+ data = mock("data")
95
+ data.expects(:[]=).with(:result, @success_return)
96
+
97
+ @ssh.expects(:exec!).yields(data, :stdout, "Nothing such device").returns(@success_return)
98
+ mount_folder
99
+ end
100
+
101
+ should "raise an ActionException if the command fails constantly" do
102
+ @ssh.expects(:exec!).times(@limit).returns(!@success_return)
103
+
104
+ assert_raises(Vagrant::Actions::ActionException) {
105
+ mount_folder
106
+ }
107
+ end
108
+
109
+ should "not raise any exception if the command succeeded" do
110
+ @ssh.expects(:exec!).once.returns(@success_return)
111
+
112
+ assert_nothing_raised {
113
+ mount_folder
114
+ }
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,55 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
+
3
+ class StartActionTest < Test::Unit::TestCase
4
+ setup do
5
+ @mock_vm, @vm, @action = mock_action(Vagrant::Actions::VM::Start)
6
+ @mock_vm.stubs(:invoke_callback)
7
+ mock_config
8
+ end
9
+
10
+ context "execution" do
11
+ should "invoke the 'boot' around callback" do
12
+ boot_seq = sequence("boot_seq")
13
+ @mock_vm.expects(:invoke_around_callback).with(:boot).once.in_sequence(boot_seq).yields
14
+ @action.expects(:boot).in_sequence(boot_seq)
15
+ @action.expects(:wait_for_boot).returns(true).in_sequence(boot_seq)
16
+ @action.execute!
17
+ end
18
+
19
+ should "error and exit if the bootup failed" do
20
+ fail_boot_seq = sequence("fail_boot_seq")
21
+ @action.expects(:boot).once.in_sequence(fail_boot_seq)
22
+ @action.expects(:wait_for_boot).returns(false).in_sequence(fail_boot_seq)
23
+ @action.expects(:error_and_exit).once.in_sequence(fail_boot_seq)
24
+ @action.execute!
25
+ end
26
+ end
27
+
28
+ context "booting" do
29
+ should "start the VM in headless mode" do
30
+ @vm.expects(:start).with(:headless, true).once
31
+ @action.boot
32
+ end
33
+ end
34
+
35
+ context "waiting for boot" do
36
+ should "repeatedly ping the SSH port and return false with no response" do
37
+ seq = sequence('pings')
38
+ Vagrant::SSH.expects(:up?).times(Vagrant.config[:ssh][:max_tries].to_i - 1).returns(false).in_sequence(seq)
39
+ Vagrant::SSH.expects(:up?).once.returns(true).in_sequence(seq)
40
+ assert @action.wait_for_boot(0)
41
+ end
42
+
43
+ should "ping the max number of times then just return" do
44
+ Vagrant::SSH.expects(:up?).times(Vagrant.config[:ssh][:max_tries].to_i).returns(false)
45
+ assert !@action.wait_for_boot(0)
46
+ end
47
+ end
48
+
49
+ context "callbacks" do
50
+ should "setup the root directory shared folder" do
51
+ expected = ["vagrant-root", Vagrant::Env.root_path, Vagrant.config.vm.project_directory]
52
+ assert_equal expected, @action.collect_shared_folders
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,27 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
+
3
+ class SuspendActionTest < Test::Unit::TestCase
4
+ setup do
5
+ @runner, @vm, @action = mock_action(Vagrant::Actions::VM::Suspend)
6
+ mock_config
7
+ end
8
+
9
+ context "executing" do
10
+ setup do
11
+ @vm.stubs(:running?).returns(true)
12
+ end
13
+
14
+ should "save the state of the VM" do
15
+ @vm.expects(:save_state).with(true).once
16
+ @action.execute!
17
+ end
18
+
19
+ should "raise an ActionException if the VM is not running" do
20
+ @vm.expects(:running?).returns(false)
21
+ @vm.expects(:save_state).never
22
+ assert_raises(Vagrant::Actions::ActionException) {
23
+ @action.execute!
24
+ }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,76 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
2
+
3
+ class UpActionTest < Test::Unit::TestCase
4
+ setup do
5
+ @mock_vm, @vm, @action = mock_action(Vagrant::Actions::VM::Up)
6
+ mock_config
7
+ end
8
+
9
+ context "sub-actions" do
10
+ setup do
11
+ @default_order = [Vagrant::Actions::VM::Import, Vagrant::Actions::VM::ForwardPorts, Vagrant::Actions::VM::SharedFolders, Vagrant::Actions::VM::Start]
12
+ end
13
+
14
+ def setup_action_expectations
15
+ default_seq = sequence("default_seq")
16
+ @default_order.each do |action|
17
+ @mock_vm.expects(:add_action).with(action).once.in_sequence(default_seq)
18
+ end
19
+ end
20
+
21
+ should "do the proper actions by default" do
22
+ setup_action_expectations
23
+ @action.prepare
24
+ end
25
+
26
+ should "add in the provisioning step if enabled" do
27
+ mock_config do |config|
28
+ config.chef.enabled = true
29
+ end
30
+
31
+ @default_order.push(Vagrant::Actions::VM::Provision)
32
+ setup_action_expectations
33
+ @action.prepare
34
+ end
35
+
36
+ should "add in the action to move hard drive if config is set" do
37
+ mock_config do |config|
38
+ File.expects(:directory?).with("foo").returns(true)
39
+ config.vm.hd_location = "foo"
40
+ end
41
+
42
+ @default_order.insert(0, Vagrant::Actions::VM::MoveHardDrive)
43
+ setup_action_expectations
44
+ @action.prepare
45
+ end
46
+ end
47
+
48
+ context "callbacks" do
49
+ should "call persist and mac address setup after import" do
50
+ boot_seq = sequence("boot")
51
+ @action.expects(:persist).once.in_sequence(boot_seq)
52
+ @action.expects(:setup_mac_address).once.in_sequence(boot_seq)
53
+ @action.after_import
54
+ end
55
+ end
56
+
57
+ context "persisting" do
58
+ should "persist the VM with Env" do
59
+ @vm.stubs(:uuid)
60
+ Vagrant::Env.expects(:persist_vm).with(@vm).once
61
+ @action.persist
62
+ end
63
+ end
64
+
65
+ context "setting up MAC address" do
66
+ should "match the mac address with the base" do
67
+ nic = mock("nic")
68
+ nic.expects(:macaddress=).once
69
+
70
+ @vm.expects(:nics).returns([nic]).once
71
+ @vm.expects(:save).with(true).once
72
+
73
+ @action.setup_mac_address
74
+ end
75
+ end
76
+ end