vagrant 0.8.10 → 0.9.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 (324) hide show
  1. data/CHANGELOG.md +77 -1
  2. data/Gemfile +0 -14
  3. data/LICENSE +1 -1
  4. data/bin/vagrant +47 -20
  5. data/config/default.rb +6 -14
  6. data/lib/vagrant.rb +132 -5
  7. data/lib/vagrant/action.rb +45 -123
  8. data/lib/vagrant/action/box/destroy.rb +7 -3
  9. data/lib/vagrant/action/box/download.rb +8 -8
  10. data/lib/vagrant/action/box/package.rb +2 -2
  11. data/lib/vagrant/action/box/unpackage.rb +13 -7
  12. data/lib/vagrant/action/box/verify.rb +5 -5
  13. data/lib/vagrant/action/builder.rb +23 -19
  14. data/lib/vagrant/action/builtin.rb +117 -79
  15. data/lib/vagrant/action/env/set.rb +7 -4
  16. data/lib/vagrant/action/environment.rb +3 -41
  17. data/lib/vagrant/action/general/package.rb +14 -29
  18. data/lib/vagrant/action/general/validate.rb +2 -2
  19. data/lib/vagrant/action/runner.rb +53 -0
  20. data/lib/vagrant/action/vm/boot.rb +9 -9
  21. data/lib/vagrant/action/vm/check_accessible.rb +2 -2
  22. data/lib/vagrant/action/vm/check_box.rb +10 -12
  23. data/lib/vagrant/action/vm/check_guest_additions.rb +8 -8
  24. data/lib/vagrant/action/vm/check_port_collisions.rb +85 -0
  25. data/lib/vagrant/action/vm/clean_machine_folder.rb +4 -4
  26. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +3 -11
  27. data/lib/vagrant/action/vm/clear_network_interfaces.rb +31 -0
  28. data/lib/vagrant/action/vm/clear_shared_folders.rb +2 -11
  29. data/lib/vagrant/action/vm/customize.rb +19 -9
  30. data/lib/vagrant/action/vm/destroy.rb +4 -4
  31. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +2 -12
  32. data/lib/vagrant/action/vm/discard_state.rb +4 -4
  33. data/lib/vagrant/action/vm/export.rb +13 -8
  34. data/lib/vagrant/action/vm/forward_ports.rb +55 -102
  35. data/lib/vagrant/action/vm/halt.rb +9 -6
  36. data/lib/vagrant/action/vm/host_name.rb +4 -4
  37. data/lib/vagrant/action/vm/import.rb +19 -10
  38. data/lib/vagrant/action/vm/match_mac_address.rb +4 -9
  39. data/lib/vagrant/action/vm/network.rb +300 -94
  40. data/lib/vagrant/action/vm/nfs.rb +41 -26
  41. data/lib/vagrant/action/vm/package.rb +1 -1
  42. data/lib/vagrant/action/vm/package_vagrantfile.rb +5 -2
  43. data/lib/vagrant/action/vm/provision.rb +42 -13
  44. data/lib/vagrant/action/vm/provisioner_cleanup.rb +2 -2
  45. data/lib/vagrant/action/vm/{clear_nfs_exports.rb → prune_nfs_exports.rb} +7 -7
  46. data/lib/vagrant/action/vm/resume.rb +4 -4
  47. data/lib/vagrant/action/vm/setup_package_files.rb +54 -0
  48. data/lib/vagrant/action/vm/share_folders.rb +63 -39
  49. data/lib/vagrant/action/vm/suspend.rb +4 -4
  50. data/lib/vagrant/action/warden.rb +13 -6
  51. data/lib/vagrant/box.rb +9 -55
  52. data/lib/vagrant/box_collection.rb +22 -17
  53. data/lib/vagrant/cli.rb +62 -47
  54. data/lib/vagrant/command.rb +18 -20
  55. data/lib/vagrant/command/base.rb +135 -90
  56. data/lib/vagrant/command/box.rb +46 -21
  57. data/lib/vagrant/command/box_add.rb +33 -0
  58. data/lib/vagrant/command/box_list.rb +25 -0
  59. data/lib/vagrant/command/box_remove.rb +23 -0
  60. data/lib/vagrant/command/box_repackage.rb +23 -0
  61. data/lib/vagrant/command/destroy.rb +16 -5
  62. data/lib/vagrant/command/halt.rb +25 -7
  63. data/lib/vagrant/command/init.rb +30 -7
  64. data/lib/vagrant/command/package.rb +49 -18
  65. data/lib/vagrant/command/provision.rb +22 -9
  66. data/lib/vagrant/command/reload.rb +18 -5
  67. data/lib/vagrant/command/resume.rb +18 -5
  68. data/lib/vagrant/command/ssh.rb +69 -31
  69. data/lib/vagrant/command/ssh_config.rb +37 -22
  70. data/lib/vagrant/command/status.rb +22 -20
  71. data/lib/vagrant/command/suspend.rb +18 -5
  72. data/lib/vagrant/command/up.rb +41 -8
  73. data/lib/vagrant/communication.rb +7 -0
  74. data/lib/vagrant/communication/base.rb +56 -0
  75. data/lib/vagrant/communication/ssh.rb +200 -0
  76. data/lib/vagrant/config.rb +29 -103
  77. data/lib/vagrant/config/base.rb +18 -26
  78. data/lib/vagrant/config/container.rb +37 -0
  79. data/lib/vagrant/config/error_recorder.rb +1 -1
  80. data/lib/vagrant/config/loader.rb +125 -0
  81. data/lib/vagrant/config/nfs.rb +1 -3
  82. data/lib/vagrant/config/package.rb +1 -3
  83. data/lib/vagrant/config/ssh.rb +31 -16
  84. data/lib/vagrant/config/top.rb +36 -25
  85. data/lib/vagrant/config/vagrant.rb +2 -5
  86. data/lib/vagrant/config/vm.rb +115 -56
  87. data/lib/vagrant/config/vm/provisioner.rb +16 -20
  88. data/lib/vagrant/config/vm/sub_vm.rb +1 -1
  89. data/lib/vagrant/data_store.rb +23 -15
  90. data/lib/vagrant/downloaders/base.rb +7 -5
  91. data/lib/vagrant/downloaders/file.rb +4 -4
  92. data/lib/vagrant/downloaders/http.rb +4 -5
  93. data/lib/vagrant/driver.rb +7 -0
  94. data/lib/vagrant/driver/virtualbox.rb +121 -0
  95. data/lib/vagrant/driver/virtualbox_4_0.rb +411 -0
  96. data/lib/vagrant/driver/virtualbox_4_1.rb +411 -0
  97. data/lib/vagrant/driver/virtualbox_base.rb +284 -0
  98. data/lib/vagrant/environment.rb +221 -240
  99. data/lib/vagrant/errors.rb +74 -25
  100. data/lib/vagrant/guest.rb +16 -0
  101. data/lib/vagrant/guest/arch.rb +48 -0
  102. data/lib/vagrant/{systems → guest}/base.rb +30 -18
  103. data/lib/vagrant/guest/debian.rb +61 -0
  104. data/lib/vagrant/{systems → guest}/freebsd.rb +11 -18
  105. data/lib/vagrant/guest/gentoo.rb +32 -0
  106. data/lib/vagrant/guest/linux.rb +78 -0
  107. data/lib/vagrant/{systems → guest}/linux/config.rb +2 -4
  108. data/lib/vagrant/guest/linux/error.rb +9 -0
  109. data/lib/vagrant/guest/redhat.rb +66 -0
  110. data/lib/vagrant/guest/solaris.rb +114 -0
  111. data/lib/vagrant/{systems → guest}/suse.rb +2 -2
  112. data/lib/vagrant/guest/ubuntu.rb +23 -0
  113. data/lib/vagrant/hosts.rb +23 -6
  114. data/lib/vagrant/hosts/arch.rb +7 -3
  115. data/lib/vagrant/hosts/base.rb +36 -46
  116. data/lib/vagrant/hosts/bsd.rb +53 -16
  117. data/lib/vagrant/hosts/fedora.rb +14 -0
  118. data/lib/vagrant/hosts/freebsd.rb +6 -36
  119. data/lib/vagrant/hosts/linux.rb +45 -20
  120. data/lib/vagrant/hosts/windows.rb +16 -0
  121. data/lib/vagrant/provisioners.rb +10 -7
  122. data/lib/vagrant/provisioners/base.rb +11 -34
  123. data/lib/vagrant/provisioners/chef.rb +30 -26
  124. data/lib/vagrant/provisioners/chef_client.rb +37 -23
  125. data/lib/vagrant/provisioners/chef_solo.rb +61 -16
  126. data/lib/vagrant/provisioners/puppet.rb +70 -38
  127. data/lib/vagrant/provisioners/puppet_server.rb +12 -13
  128. data/lib/vagrant/provisioners/shell.rb +24 -24
  129. data/lib/vagrant/registry.rb +49 -0
  130. data/lib/vagrant/ssh.rb +82 -153
  131. data/lib/vagrant/ui.rb +118 -50
  132. data/lib/vagrant/util/busy.rb +1 -1
  133. data/lib/vagrant/util/file_mode.rb +12 -0
  134. data/lib/vagrant/util/network_ip.rb +28 -0
  135. data/lib/vagrant/util/platform.rb +1 -0
  136. data/lib/vagrant/util/subprocess.rb +227 -0
  137. data/lib/vagrant/version.rb +1 -1
  138. data/lib/vagrant/vm.rb +111 -97
  139. data/tasks/acceptance.rake +3 -3
  140. data/tasks/test.rake +7 -2
  141. data/templates/commands/init/Vagrantfile.erb +11 -4
  142. data/templates/{ssh_config.erb → commands/ssh_config/config.erb} +0 -0
  143. data/templates/guests/arch/network_dhcp.erb +7 -0
  144. data/templates/guests/arch/network_static.erb +7 -0
  145. data/templates/guests/debian/network_dhcp.erb +6 -0
  146. data/templates/guests/debian/network_static.erb +7 -0
  147. data/templates/guests/gentoo/network_dhcp.erb +4 -0
  148. data/templates/guests/gentoo/network_static.erb +4 -0
  149. data/templates/guests/redhat/network_dhcp.erb +6 -0
  150. data/templates/guests/redhat/network_static.erb +7 -0
  151. data/templates/locales/en.yml +241 -122
  152. data/templates/{chef_server_client.erb → provisioners/chef_client/client.erb} +0 -0
  153. data/templates/{chef_solo_solo.erb → provisioners/chef_solo/solo.erb} +0 -0
  154. data/test/acceptance/base.rb +10 -10
  155. data/test/acceptance/box_test.rb +28 -6
  156. data/test/acceptance/destroy_test.rb +1 -1
  157. data/test/acceptance/halt_test.rb +4 -4
  158. data/test/acceptance/init_test.rb +3 -3
  159. data/test/acceptance/networking/host_only_test.rb +37 -0
  160. data/test/acceptance/networking/port_forward_test.rb +125 -0
  161. data/test/acceptance/package_test.rb +46 -0
  162. data/test/acceptance/provisioning/basic_test.rb +61 -0
  163. data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
  164. data/test/acceptance/provisioning/shell_test.rb +53 -0
  165. data/test/acceptance/resume_test.rb +1 -1
  166. data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
  167. data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
  168. data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
  169. data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
  170. data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
  171. data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
  172. data/test/acceptance/ssh_test.rb +7 -2
  173. data/test/acceptance/support/config.rb +1 -1
  174. data/test/acceptance/support/isolated_environment.rb +41 -150
  175. data/test/acceptance/support/matchers/match_output.rb +1 -1
  176. data/test/acceptance/support/matchers/succeed.rb +14 -0
  177. data/test/acceptance/support/network_tests.rb +29 -0
  178. data/test/acceptance/support/output.rb +9 -1
  179. data/test/acceptance/support/shared/base_context.rb +16 -9
  180. data/test/acceptance/support/shared/command_examples.rb +4 -4
  181. data/test/acceptance/suspend_test.rb +1 -1
  182. data/test/acceptance/up_basic_test.rb +26 -7
  183. data/test/acceptance/up_with_box_url.rb +1 -1
  184. data/test/acceptance/vagrant_test.rb +1 -1
  185. data/test/acceptance/version_test.rb +0 -5
  186. data/test/support/isolated_environment.rb +46 -0
  187. data/test/{acceptance/support → support}/tempdir.rb +0 -0
  188. data/test/unit/base.rb +21 -0
  189. data/test/unit/support/isolated_environment.rb +39 -0
  190. data/test/unit/support/shared/base_context.rb +30 -0
  191. data/test/unit/vagrant/action/builder_test.rb +126 -177
  192. data/test/unit/vagrant/action/environment_test.rb +10 -21
  193. data/test/unit/vagrant/action/runner_test.rb +65 -0
  194. data/test/unit/vagrant/action/warden_test.rb +64 -97
  195. data/test/unit/vagrant/box_collection_test.rb +44 -33
  196. data/test/unit/vagrant/box_test.rb +25 -65
  197. data/test/unit/vagrant/command/base_test.rb +141 -14
  198. data/test/unit/vagrant/config/base_test.rb +16 -43
  199. data/test/unit/vagrant/config/loader_test.rb +79 -0
  200. data/test/unit/vagrant/config/top_test.rb +69 -0
  201. data/test/unit/vagrant/config/vm_test.rb +62 -47
  202. data/test/unit/vagrant/config_test.rb +16 -151
  203. data/test/unit/vagrant/data_store_test.rb +43 -61
  204. data/test/unit/vagrant/downloaders/base_test.rb +12 -22
  205. data/test/unit/vagrant/downloaders/file_test.rb +58 -31
  206. data/test/unit/vagrant/downloaders/http_test.rb +12 -86
  207. data/test/unit/vagrant/environment_test.rb +107 -536
  208. data/test/unit/vagrant/hosts_test.rb +36 -0
  209. data/test/unit/vagrant/registry_test.rb +56 -0
  210. data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
  211. data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +23 -24
  212. data/test/unit/vagrant/util/network_ip_test.rb +17 -0
  213. data/test/unit/vagrant/util/retryable_test.rb +90 -34
  214. data/test/unit/vagrant_test.rb +27 -0
  215. data/test/{unit → unit_legacy}/locales/en.yml +0 -0
  216. data/test/{unit → unit_legacy}/test_helper.rb +0 -0
  217. data/test/{unit → unit_legacy}/vagrant/action/box/destroy_test.rb +0 -0
  218. data/test/{unit → unit_legacy}/vagrant/action/box/download_test.rb +0 -0
  219. data/test/{unit → unit_legacy}/vagrant/action/box/package_test.rb +0 -0
  220. data/test/{unit → unit_legacy}/vagrant/action/box/unpackage_test.rb +0 -0
  221. data/test/{unit → unit_legacy}/vagrant/action/box/verify_test.rb +0 -0
  222. data/test/{unit → unit_legacy}/vagrant/action/env/set_test.rb +0 -0
  223. data/test/{unit → unit_legacy}/vagrant/action/general/package_test.rb +0 -0
  224. data/test/{unit → unit_legacy}/vagrant/action/general/validate_test.rb +0 -0
  225. data/test/{unit → unit_legacy}/vagrant/action/vm/boot_test.rb +0 -0
  226. data/test/{unit → unit_legacy}/vagrant/action/vm/check_accessible_test.rb +0 -0
  227. data/test/{unit → unit_legacy}/vagrant/action/vm/check_box_test.rb +0 -0
  228. data/test/{unit → unit_legacy}/vagrant/action/vm/check_guest_additions_test.rb +0 -0
  229. data/test/{unit → unit_legacy}/vagrant/action/vm/clean_machine_folder_test.rb +0 -0
  230. data/test/{unit → unit_legacy}/vagrant/action/vm/clear_forwarded_ports_test.rb +0 -0
  231. data/test/{unit → unit_legacy}/vagrant/action/vm/clear_nfs_exports_test.rb +0 -0
  232. data/test/{unit → unit_legacy}/vagrant/action/vm/clear_shared_folders_test.rb +0 -0
  233. data/test/{unit → unit_legacy}/vagrant/action/vm/customize_test.rb +0 -0
  234. data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_test.rb +0 -0
  235. data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +0 -0
  236. data/test/{unit → unit_legacy}/vagrant/action/vm/discard_state_test.rb +0 -0
  237. data/test/{unit → unit_legacy}/vagrant/action/vm/export_test.rb +0 -0
  238. data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_helpers_test.rb +0 -0
  239. data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_test.rb +0 -0
  240. data/test/{unit → unit_legacy}/vagrant/action/vm/halt_test.rb +0 -0
  241. data/test/{unit → unit_legacy}/vagrant/action/vm/host_name_test.rb +0 -0
  242. data/test/{unit → unit_legacy}/vagrant/action/vm/import_test.rb +0 -0
  243. data/test/{unit → unit_legacy}/vagrant/action/vm/match_mac_address_test.rb +0 -0
  244. data/test/{unit → unit_legacy}/vagrant/action/vm/modify_test.rb +0 -0
  245. data/test/{unit → unit_legacy}/vagrant/action/vm/network_test.rb +0 -0
  246. data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_helpers_test.rb +0 -0
  247. data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_test.rb +0 -0
  248. data/test/{unit → unit_legacy}/vagrant/action/vm/package_test.rb +0 -0
  249. data/test/{unit → unit_legacy}/vagrant/action/vm/package_vagrantfile_test.rb +0 -0
  250. data/test/{unit → unit_legacy}/vagrant/action/vm/provision_test.rb +0 -0
  251. data/test/{unit → unit_legacy}/vagrant/action/vm/provisioner_cleanup_test.rb +0 -0
  252. data/test/{unit → unit_legacy}/vagrant/action/vm/resume_test.rb +0 -0
  253. data/test/{unit → unit_legacy}/vagrant/action/vm/share_folders_test.rb +0 -0
  254. data/test/{unit → unit_legacy}/vagrant/action/vm/suspend_test.rb +0 -0
  255. data/test/{unit → unit_legacy}/vagrant/action_test.rb +0 -0
  256. data/test/unit_legacy/vagrant/box_collection_test.rb +45 -0
  257. data/test/unit_legacy/vagrant/box_test.rb +74 -0
  258. data/test/{unit → unit_legacy}/vagrant/cli_test.rb +0 -0
  259. data/test/unit_legacy/vagrant/command/base_test.rb +23 -0
  260. data/test/{unit → unit_legacy}/vagrant/command/group_base_test.rb +0 -0
  261. data/test/{unit → unit_legacy}/vagrant/command/helpers_test.rb +0 -0
  262. data/test/{unit → unit_legacy}/vagrant/command/init_test.rb +0 -0
  263. data/test/{unit → unit_legacy}/vagrant/command/package_test.rb +0 -0
  264. data/test/unit_legacy/vagrant/config/base_test.rb +52 -0
  265. data/test/{unit → unit_legacy}/vagrant/config/error_recorder_test.rb +0 -0
  266. data/test/{unit → unit_legacy}/vagrant/config/ssh_test.rb +0 -0
  267. data/test/{unit → unit_legacy}/vagrant/config/vagrant_test.rb +0 -0
  268. data/test/{unit → unit_legacy}/vagrant/config/vm/provisioner_test.rb +0 -0
  269. data/test/unit_legacy/vagrant/config/vm_test.rb +47 -0
  270. data/test/unit_legacy/vagrant/config_test.rb +148 -0
  271. data/test/unit_legacy/vagrant/downloaders/http_test.rb +93 -0
  272. data/test/unit_legacy/vagrant/environment_test.rb +539 -0
  273. data/test/{unit → unit_legacy}/vagrant/errors_test.rb +0 -0
  274. data/test/{unit → unit_legacy}/vagrant/hosts/base_test.rb +0 -0
  275. data/test/{unit → unit_legacy}/vagrant/hosts/bsd_test.rb +0 -0
  276. data/test/{unit → unit_legacy}/vagrant/hosts/linux_test.rb +0 -0
  277. data/test/{unit → unit_legacy}/vagrant/plugin_test.rb +0 -0
  278. data/test/{unit → unit_legacy}/vagrant/provisioners/base_test.rb +0 -0
  279. data/test/{unit → unit_legacy}/vagrant/provisioners/chef_client_test.rb +0 -0
  280. data/test/{unit → unit_legacy}/vagrant/provisioners/chef_solo_test.rb +0 -0
  281. data/test/{unit → unit_legacy}/vagrant/provisioners/chef_test.rb +0 -0
  282. data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_server_test.rb +0 -0
  283. data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_test.rb +0 -0
  284. data/test/{unit → unit_legacy}/vagrant/provisioners/shell_test.rb +0 -0
  285. data/test/{unit → unit_legacy}/vagrant/ssh/session_test.rb +0 -0
  286. data/test/{unit → unit_legacy}/vagrant/ssh_test.rb +0 -0
  287. data/test/{unit → unit_legacy}/vagrant/systems/base_test.rb +0 -0
  288. data/test/{unit → unit_legacy}/vagrant/systems/linux_test.rb +0 -0
  289. data/test/{unit → unit_legacy}/vagrant/util/busy_test.rb +0 -0
  290. data/test/{unit → unit_legacy}/vagrant/util/counter_test.rb +0 -0
  291. data/test/{unit → unit_legacy}/vagrant/util/platform_test.rb +0 -0
  292. data/test/{unit → unit_legacy}/vagrant/util/stacked_proc_runner_test.rb +0 -0
  293. data/test/{unit → unit_legacy}/vagrant/util/template_renderer_test.rb +0 -0
  294. data/test/{unit → unit_legacy}/vagrant/vm_test.rb +0 -0
  295. data/vagrant.gemspec +7 -9
  296. metadata +214 -216
  297. data/keys/vagrant.ppk +0 -26
  298. data/lib/vagrant/action/box.rb +0 -11
  299. data/lib/vagrant/action/env.rb +0 -7
  300. data/lib/vagrant/action/general.rb +0 -8
  301. data/lib/vagrant/action/vm.rb +0 -34
  302. data/lib/vagrant/action/vm/forward_ports_helpers.rb +0 -28
  303. data/lib/vagrant/action/vm/modify.rb +0 -37
  304. data/lib/vagrant/action/vm/nfs_helpers.rb +0 -11
  305. data/lib/vagrant/command/group_base.rb +0 -107
  306. data/lib/vagrant/command/helpers.rb +0 -33
  307. data/lib/vagrant/command/named_base.rb +0 -14
  308. data/lib/vagrant/command/upgrade_to_060.rb +0 -45
  309. data/lib/vagrant/command/version.rb +0 -13
  310. data/lib/vagrant/ssh/session.rb +0 -136
  311. data/lib/vagrant/systems.rb +0 -13
  312. data/lib/vagrant/systems/arch.rb +0 -34
  313. data/lib/vagrant/systems/debian.rb +0 -36
  314. data/lib/vagrant/systems/gentoo.rb +0 -27
  315. data/lib/vagrant/systems/linux.rb +0 -82
  316. data/lib/vagrant/systems/linux/error.rb +0 -9
  317. data/lib/vagrant/systems/redhat.rb +0 -48
  318. data/lib/vagrant/systems/solaris.rb +0 -113
  319. data/lib/vagrant/systems/ubuntu.rb +0 -17
  320. data/templates/network_entry_arch.erb +0 -9
  321. data/templates/network_entry_debian.erb +0 -8
  322. data/templates/network_entry_gentoo.erb +0 -5
  323. data/templates/network_entry_redhat.erb +0 -9
  324. data/test/unit/vagrant/ui_test.rb +0 -29
@@ -0,0 +1,53 @@
1
+ require File.expand_path("../../base", __FILE__)
2
+
3
+ describe "vagrant provisioning with shell" do
4
+ include_context "acceptance"
5
+
6
+ it "runs a script on boot" do
7
+ require_box("default")
8
+
9
+ assert_execute("vagrant", "box", "add", "base", box_path("default"))
10
+
11
+ environment.workdir.join("Vagrantfile").open("w+") do |f|
12
+ f.write(<<-vf)
13
+ Vagrant::Config.run do |config|
14
+ config.vm.box = "base"
15
+ config.vm.provision :shell, :path => "script.sh"
16
+ end
17
+ vf
18
+ end
19
+
20
+ environment.workdir.join("script.sh").open("w+") do |f|
21
+ f.write(<<-vf)
22
+ echo success > /vagrant/results
23
+ vf
24
+ end
25
+
26
+ assert_execute("vagrant", "up")
27
+
28
+ result_file = environment.workdir.join("results")
29
+ result_file.exist?.should be
30
+ result_file.read.should == "success\n"
31
+ end
32
+
33
+ it "runs an inline script" do
34
+ require_box("default")
35
+
36
+ assert_execute("vagrant", "box", "add", "base", box_path("default"))
37
+
38
+ environment.workdir.join("Vagrantfile").open("w+") do |f|
39
+ f.write(<<-vf)
40
+ Vagrant::Config.run do |config|
41
+ config.vm.box = "base"
42
+ config.vm.provision :shell, :inline => "echo success > /vagrant/results"
43
+ end
44
+ vf
45
+ end
46
+
47
+ assert_execute("vagrant", "up")
48
+
49
+ result_file = environment.workdir.join("results")
50
+ result_file.exist?.should be
51
+ result_file.read.should == "success\n"
52
+ end
53
+ end
@@ -1,5 +1,5 @@
1
1
  require File.expand_path("../base", __FILE__)
2
- require "support/shared/command_examples"
2
+ require "acceptance/support/shared/command_examples"
3
3
 
4
4
  describe "vagrant resume" do
5
5
  include_context "acceptance"
@@ -0,0 +1,3 @@
1
+ # Chef Solo Basic Skeleton
2
+
3
+ This is a skeleton that contains a basic chef solo setup.
@@ -0,0 +1,5 @@
1
+ # Just create a file
2
+ file "/tmp/chef_solo_basic" do
3
+ mode 0644
4
+ content "success"
5
+ end
@@ -0,0 +1,3 @@
1
+ # Chef Solo Basic Skeleton
2
+
3
+ This is a skeleton that contains a basic chef solo setup.
@@ -0,0 +1,6 @@
1
+ # Create a file where the contents is the data we set with
2
+ # the Vagrantfile.
3
+ file "/tmp/chef_solo_basic" do
4
+ mode 0644
5
+ content node[:test][:data]
6
+ end
@@ -0,0 +1,3 @@
1
+ # Chef Solo Basic Skeleton
2
+
3
+ This is a skeleton that contains a basic chef solo setup.
@@ -0,0 +1,5 @@
1
+ # Just create a file
2
+ file "/vagrant/chef_solo" do
3
+ mode 0644
4
+ content "success"
5
+ end
@@ -1,5 +1,5 @@
1
1
  require File.expand_path("../base", __FILE__)
2
- require "support/shared/command_examples"
2
+ require "acceptance/support/shared/command_examples"
3
3
 
4
4
  describe "vagrant ssh" do
5
5
  include_context "acceptance"
@@ -32,8 +32,13 @@ describe "vagrant ssh" do
32
32
  assert_execute("vagrant", "init")
33
33
  assert_execute("vagrant", "up")
34
34
 
35
- result = assert_execute("vagrant", "ssh", "-c", "echo foo")
35
+ result = execute("vagrant", "ssh", "-c", "echo foo")
36
+ result.exit_code.should == 0
36
37
  result.stdout.should == "foo\n"
38
+
39
+ result = execute("vagrant", "ssh", "-c", "foooooooooo")
40
+ result.exit_code.should == 127
41
+ result.stderr.should =~ /foooooooooo: command not found/
37
42
  end
38
43
 
39
44
  # TODO:
@@ -11,7 +11,7 @@ module Acceptance
11
11
  attr_reader :box_directory
12
12
 
13
13
  def initialize(path)
14
- @logger = Log4r::Logger.new("acceptance::config")
14
+ @logger = Log4r::Logger.new("test::acceptance::config")
15
15
  @logger.info("Loading configuration from: #{path}")
16
16
  options = YAML.load_file(path)
17
17
  @logger.info("Loaded: #{options.inspect}")
@@ -4,142 +4,65 @@ require "pathname"
4
4
  require "log4r"
5
5
  require "childprocess"
6
6
 
7
- require File.expand_path("../tempdir", __FILE__)
8
- require File.expand_path("../virtualbox", __FILE__)
7
+ require "vagrant/util/subprocess"
8
+
9
+ require "acceptance/support/virtualbox"
10
+ require "support/isolated_environment"
9
11
 
10
12
  module Acceptance
11
13
  # This class manages an isolated environment for Vagrant to
12
14
  # run in. It creates a temporary directory to act as the
13
15
  # working directory as well as sets a custom home directory.
14
- class IsolatedEnvironment
15
- attr_reader :homedir
16
- attr_reader :workdir
16
+ class IsolatedEnvironment < ::IsolatedEnvironment
17
+ SKELETON_DIR = Pathname.new(File.expand_path("../../skeletons", __FILE__))
17
18
 
18
- # Initializes an isolated environment. You can pass in some
19
- # options here to configure runing custom applications in place
20
- # of others as well as specifying environmental variables.
21
- #
22
- # @param [Hash] apps A mapping of application name (such as "vagrant")
23
- # to an alternate full path to the binary to run.
24
- # @param [Hash] env Additional environmental variables to inject
25
- # into the execution environments.
26
19
  def initialize(apps=nil, env=nil)
27
- @logger = Log4r::Logger.new("acceptance::isolated_environment")
28
-
29
- @apps = apps || {}
30
- @env = env || {}
31
-
32
- # Create a temporary directory for our work
33
- @tempdir = Tempdir.new("vagrant")
34
- @logger.info("Initialize isolated environment: #{@tempdir.path}")
20
+ super()
35
21
 
36
- # Setup the home and working directories
37
- @homedir = Pathname.new(File.join(@tempdir.path, "home"))
38
- @workdir = Pathname.new(File.join(@tempdir.path, "work"))
22
+ @logger = Log4r::Logger.new("test::acceptance::isolated_environment")
39
23
 
40
- @homedir.mkdir
41
- @workdir.mkdir
24
+ @apps = apps.clone || {}
25
+ @env = env.clone || {}
42
26
 
43
27
  # Set the home directory and virtualbox home directory environmental
44
28
  # variables so that Vagrant and VirtualBox see the proper paths here.
45
- @env["HOME"] = @homedir.to_s
46
- @env["VBOX_USER_HOME"] = @homedir.to_s
29
+ @env["HOME"] ||= @homedir.to_s
30
+ @env["VBOX_USER_HOME"] ||= @homedir.to_s
31
+ end
32
+
33
+ # Copies a skeleton into this isolated environment. This is useful
34
+ # for testing environments that require a complex setup.
35
+ #
36
+ # @param [String] name Name of the skeleton in the skeletons/ directory.
37
+ def skeleton!(name)
38
+ # Copy all the files into the home directory
39
+ source = Dir.glob(SKELETON_DIR.join(name).join("*").to_s)
40
+ FileUtils.cp_r(source, @workdir.to_s)
47
41
  end
48
42
 
49
43
  # Executes a command in the context of this isolated environment.
50
44
  # Any command executed will therefore see our temporary directory
51
45
  # as the home directory.
52
46
  def execute(command, *argN)
47
+ # Create the command
53
48
  command = replace_command(command)
54
49
 
55
- # Get the hash options passed to this method
50
+ # Determine the options
56
51
  options = argN.last.is_a?(Hash) ? argN.pop : {}
57
- timeout = options.delete(:timeout)
58
-
59
- # Build a child process to run this command. For the stdout/stderr
60
- # we use pipes so that we can select() on it and block and stream
61
- # data in as it comes.
62
- @logger.info("Executing: #{command} #{argN.inspect}. Output will stream in...")
63
- process = ChildProcess.build(command, *argN)
64
- stdout, stdout_writer = IO.pipe
65
- process.io.stdout = stdout_writer
66
-
67
- stderr, stderr_writer = IO.pipe
68
- process.io.stderr = stderr_writer
69
- process.duplex = true
70
-
71
- @env.each do |k, v|
72
- process.environment[k] = v
73
- end
74
-
75
- Dir.chdir(@workdir.to_s) do
76
- process.start
77
- process.io.stdin.sync = true
78
- end
79
-
80
- # Close our side of the pipes, since we're just reading
81
- stdout_writer.close
82
- stderr_writer.close
83
-
84
- # Create a hash to store all the data we see.
85
- io_data = { stdout => "", stderr => "" }
86
-
87
- # Record the start time for timeout purposes
88
- start_time = Time.now.to_i
89
-
90
- @logger.debug("Selecting on IO...")
91
- while true
92
- results = IO.select([stdout, stderr],
93
- [process.io.stdin], nil, timeout || 5)
94
-
95
- # Check if we have exceeded our timeout from waiting on a select()
96
- raise TimeoutExceeded, process.pid if timeout && (Time.now.to_i - start_time) > timeout
97
-
98
- # Check the readers first to see if they're ready
99
- readers = results[0]
100
- if !readers.empty?
101
- begin
102
- readers.each do |r|
103
- data = r.read_nonblock(1024)
104
- io_data[r] += data
105
- io_name = r == stdout ? "stdout" : "stderr"
106
- @logger.debug(data)
107
- yield io_name.to_sym, data if block_given?
108
- end
109
- rescue IO::WaitReadable
110
- # This just means the IO wasn't actually ready and we should
111
- # wait some more. So we just let this pass through.
112
- rescue EOFError
113
- # Process exited, so break out of this while loop
114
- break
115
- end
116
- end
117
-
118
- # Check if the process exited in order to break the loop before
119
- # we try to see if any stdin is ready.
120
- break if process.exited?
121
-
122
- # Check the writers to see if they're ready, and notify any listeners
123
- if !results[1].empty?
124
- yield :stdin, process.io.stdin if block_given?
125
- end
52
+ options = {
53
+ :workdir => @workdir,
54
+ :env => @env
55
+ }.merge(options)
56
+
57
+ # Add the options to be passed on
58
+ argN << options
59
+
60
+ # Execute, logging out the stdout/stderr as we get it
61
+ @logger.info("Executing: #{[command].concat(argN).inspect}")
62
+ Vagrant::Util::Subprocess.execute(command, *argN) do |type, data|
63
+ @logger.debug("#{type}: #{data}") if type == :stdout || type == :stderr
64
+ yield type, data if block_given?
126
65
  end
127
-
128
- # Continually try to wait for the process to end, but do so asynchronously
129
- # so that we can also check to see if we have exceeded a timeout.
130
- begin
131
- # If a timeout is not set, we set a very large timeout to
132
- # simulate "forever"
133
- @logger.debug("Waiting for process to exit...")
134
- remaining = (timeout || 32000) - (Time.now.to_i - start_time)
135
- remaining = 0 if remaining < 0
136
- process.poll_for_exit(remaining)
137
- rescue ChildProcess::TimeoutError
138
- raise TimeoutExceeded, process.pid
139
- end
140
-
141
- @logger.debug("Exit status: #{process.exit_code}")
142
- return ExecuteProcess.new(process.exit_code, io_data[stdout], io_data[stderr])
143
66
  end
144
67
 
145
68
  # Closes the environment, cleans up the temporary directories, etc.
@@ -149,9 +72,8 @@ module Acceptance
149
72
  # environment.
150
73
  delete_virtual_machines if VirtualBox.find_vboxsvc
151
74
 
152
- # Delete the temporary directory
153
- @logger.info("Removing isolated environment: #{@tempdir.path}")
154
- FileUtils.rm_rf(@tempdir.path)
75
+ # Let the parent handle cleaning up
76
+ super
155
77
  end
156
78
 
157
79
  def delete_virtual_machines
@@ -167,7 +89,7 @@ module Acceptance
167
89
  # reason it will simply freeze, although the VM is successfully
168
90
  # "aborted." The timeout gets around this strange behavior.
169
91
  execute("VBoxManage", "controlvm", data[:uuid], "poweroff", :timeout => 5)
170
- rescue TimeoutExceeded => e
92
+ rescue Vagrant::Util::Subprocess::TimeoutExceeded => e
171
93
  @logger.info("Failed to poweroff VM '#{data[:uuid]}'. Killing process.")
172
94
 
173
95
  # Kill the process and wait a bit for it to disappear
@@ -178,7 +100,7 @@ module Acceptance
178
100
  sleep 0.5
179
101
 
180
102
  result = execute("VBoxManage", "unregistervm", data[:uuid], "--delete")
181
- raise Exception, "VM unregistration failed!" if result.exit_status != 0
103
+ raise Exception, "VM unregistration failed!" if result.exit_code != 0
182
104
  end
183
105
 
184
106
  @logger.info("Removed all virtual machines")
@@ -192,35 +114,4 @@ module Acceptance
192
114
  return command
193
115
  end
194
116
  end
195
-
196
- # This class represents a process which has run via the IsolatedEnvironment.
197
- # This is a readonly structure that can be used to inspect the exit status,
198
- # stdout, stderr, etc. from the process which ran.
199
- class ExecuteProcess
200
- attr_reader :exit_status
201
- attr_reader :stdout
202
- attr_reader :stderr
203
-
204
- def initialize(exit_status, stdout, stderr)
205
- @exit_status = exit_status
206
- @stdout = stdout
207
- @stderr = stderr
208
- end
209
-
210
- def success?
211
- @exit_status == 0
212
- end
213
- end
214
-
215
- # This exception is raised if the timeout for a process is exceeded.
216
- class TimeoutExceeded < StandardError
217
- attr_reader :pid
218
-
219
- def initialize(pid)
220
- @pid = pid
221
-
222
- super()
223
- end
224
- end
225
117
  end
226
-
@@ -1,4 +1,4 @@
1
- require "support/output"
1
+ require "acceptance/support/output"
2
2
 
3
3
  # This creates a matcher that is used to match against certain
4
4
  # Vagrant output. Vagrant output is not what is being tested,
@@ -0,0 +1,14 @@
1
+ # Matcher that verifies that a process succeeds.
2
+ RSpec::Matchers.define :succeed do
3
+ match do |thing|
4
+ thing.exit_code.should == 0
5
+ end
6
+
7
+ failure_message_for_should do |actual|
8
+ "expected process to succeed. exit code: #{actual.exit_code}"
9
+ end
10
+
11
+ failure_message_for_should_not do |actual|
12
+ "expected process to fail. exit code: #{actual.exit_code}"
13
+ end
14
+ end
@@ -0,0 +1,29 @@
1
+ require "vagrant/util/retryable"
2
+
3
+ module Acceptance
4
+ module NetworkTests
5
+ include Vagrant::Util::Retryable
6
+
7
+ # Tests that the host can access the VM through the network.
8
+ #
9
+ # @param [String] url URL to request from the host.
10
+ # @param [Integer] guest_port Port to run a web server on the guest.
11
+ def assert_host_to_vm_network(url, guest_port)
12
+ # Start up a web server in another thread by SSHing into the VM.
13
+ thr = Thread.new do
14
+ assert_execute("vagrant", "ssh", "-c", "python -m SimpleHTTPServer #{guest_port}")
15
+ end
16
+
17
+ # Verify that port forwarding works by making a simple HTTP request
18
+ # to the port. We should get a 200 response. We retry this a few times
19
+ # as we wait for the HTTP server to come online.
20
+ retryable(:tries => 5, :sleep => 2) do
21
+ result = Net::HTTP.get_response(URI.parse(url))
22
+ result.code.should == "200"
23
+ end
24
+ ensure
25
+ # The server needs to die. This is how.
26
+ thr.kill if thr
27
+ end
28
+ end
29
+ end
@@ -8,6 +8,10 @@ module Acceptance
8
8
  @text = text
9
9
  end
10
10
 
11
+ def box_already_exists(name)
12
+ @text =~ /^A box already exists under the name of '#{name}'/
13
+ end
14
+
11
15
  # Checks that an error message was outputted about the box
12
16
  # being added being invalid.
13
17
  def box_invalid
@@ -33,7 +37,7 @@ module Acceptance
33
37
  # Tests that the output says there is no Vagrantfile, and as such
34
38
  # can't do whatever we requested Vagrant to do.
35
39
  def no_vagrantfile
36
- @text =~ /^No Vagrant environment detected/
40
+ @text =~ /^A Vagrant environment is required/
37
41
  end
38
42
 
39
43
  # Tests that the output contains a specific Vagrant version.
@@ -41,6 +45,10 @@ module Acceptance
41
45
  @text =~ /^Vagrant version #{version}$/
42
46
  end
43
47
 
48
+ def resume_port_collision
49
+ @text =~ /^This VM cannot be resumed, because the forwarded ports/
50
+ end
51
+
44
52
  # This checks that the VM with the given `vm_name` has the
45
53
  # status of `status`.
46
54
  def status(vm_name, status)