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,32 @@
1
+ require 'tempfile'
2
+
3
+ module Vagrant
4
+ module Guest
5
+ class Gentoo < Linux
6
+ def configure_networks(networks)
7
+ # Remove any previous host only network additions to the interface file
8
+ vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' /etc/conf.d/net > /tmp/vagrant-network-interfaces")
9
+ vm.channel.sudo("cat /tmp/vagrant-network-interfaces > /etc/conf.d/net")
10
+
11
+ # Configure each network interface
12
+ networks.each do |network|
13
+ entry = TemplateRenderer.render("guests/gentoo/network_#{network[:type]}",
14
+ :options => network)
15
+
16
+ # Upload the entry to a temporary location
17
+ temp = Tempfile.new("vagrant")
18
+ temp.write(entry)
19
+ temp.close
20
+
21
+ vm.channel.upload(temp.path, "/tmp/vagrant-network-entry")
22
+
23
+ # Configure the interface
24
+ vm.channel.sudo("ln -fs /etc/init.d/net.lo /etc/init.d/net.eth#{network[:interface]}")
25
+ vm.channel.sudo("/etc/init.d/net.eth#{network[:interface]} stop 2> /dev/null")
26
+ vm.channel.sudo("cat /tmp/vagrant-network-entry >> /etc/conf.d/net")
27
+ vm.channel.sudo("/etc/init.d/net.eth#{network[:interface]} start")
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,78 @@
1
+ require 'vagrant/guest/linux/error'
2
+ require 'vagrant/guest/linux/config'
3
+
4
+ module Vagrant
5
+ module Guest
6
+ class Linux < Base
7
+ def distro_dispatch
8
+ if @vm.channel.test("cat /etc/debian_version")
9
+ return :debian if @vm.channel.test("cat /proc/version | grep 'Debian'")
10
+ return :ubuntu if @vm.channel.test("cat /proc/version | grep 'Ubuntu'")
11
+ end
12
+
13
+ return :gentoo if @vm.channel.test("cat /etc/gentoo-release")
14
+ return :redhat if @vm.channel.test("cat /etc/redhat-release")
15
+ return :suse if @vm.channel.test("cat /etc/SuSE-release")
16
+ return :arch if @vm.channel.test("cat /etc/arch-release")
17
+
18
+ # Can't detect the distro, assume vanilla linux
19
+ nil
20
+ end
21
+
22
+ def halt
23
+ vm.channel.sudo("shutdown -h now")
24
+
25
+ # Wait until the VM's state is actually powered off. If this doesn't
26
+ # occur within a reasonable amount of time (15 seconds by default),
27
+ # then simply return and allow Vagrant to kill the machine.
28
+ count = 0
29
+ while vm.state != :poweroff
30
+ count += 1
31
+
32
+ return if count >= vm.config.linux.halt_timeout
33
+ sleep vm.config.linux.halt_check_interval
34
+ end
35
+ end
36
+
37
+ def mount_shared_folder(name, guestpath, options)
38
+ @vm.channel.sudo("mkdir -p #{guestpath}")
39
+ mount_folder(name, guestpath, options)
40
+ @vm.channel.sudo("chown `id -u #{options[:owner]}`:`id -g #{options[:group]}` #{guestpath}")
41
+ end
42
+
43
+ def mount_nfs(ip, folders)
44
+ # TODO: Maybe check for nfs support on the guest, since its often
45
+ # not installed by default
46
+ folders.each do |name, opts|
47
+ vm.channel.sudo("mkdir -p #{opts[:guestpath]}")
48
+ vm.channel.sudo("mount #{ip}:'#{opts[:hostpath]}' #{opts[:guestpath]}",
49
+ :error_class => LinuxError,
50
+ :error_key => :mount_nfs_fail)
51
+ end
52
+ end
53
+
54
+ #-------------------------------------------------------------------
55
+ # "Private" methods which assist above methods
56
+ #-------------------------------------------------------------------
57
+ def mount_folder(name, guestpath, options)
58
+ # Determine the permission string to attach to the mount command
59
+ mount_options = "-o uid=`id -u #{options[:owner]}`,gid=`id -g #{options[:group]}`"
60
+ mount_options += ",#{options[:extra]}" if options[:extra]
61
+
62
+ attempts = 0
63
+ while true
64
+ success = true
65
+ @vm.channel.sudo("mount -t vboxsf #{mount_options} #{name} #{guestpath}") do |type, data|
66
+ success = false if type == :stderr && data =~ /No such device/i
67
+ end
68
+
69
+ break if success
70
+
71
+ attempts += 1
72
+ raise LinuxError, :mount_fail if attempts >= 10
73
+ sleep 5
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -1,13 +1,11 @@
1
1
  module Vagrant
2
- module Systems
3
- class Linux < Vagrant::Systems::Base
2
+ module Guest
3
+ class Linux < Vagrant::Guest::Base
4
4
  # A custom config class which will be made accessible via `config.linux`
5
5
  # This is not necessary for all system implementers, of course. However,
6
6
  # generally, Vagrant tries to make almost every aspect of its execution
7
7
  # configurable, and this assists that goal.
8
8
  class LinuxConfig < Vagrant::Config::Base
9
- configures :linux
10
-
11
9
  attr_accessor :halt_timeout
12
10
  attr_accessor :halt_check_interval
13
11
 
@@ -0,0 +1,9 @@
1
+ module Vagrant
2
+ module Guest
3
+ class Linux < Vagrant::Guest::Base
4
+ class LinuxError < Errors::VagrantError
5
+ error_namespace("vagrant.guest.linux")
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,66 @@
1
+ require 'set'
2
+ require 'tempfile'
3
+
4
+ require 'vagrant/util/template_renderer'
5
+
6
+ module Vagrant
7
+ module Guest
8
+ class Redhat < Linux
9
+ # Make the TemplateRenderer top-level
10
+ include Vagrant::Util
11
+
12
+ def configure_networks(networks)
13
+ # Accumulate the configurations to add to the interfaces file as
14
+ # well as what interfaces we're actually configuring since we use that
15
+ # later.
16
+ interfaces = Set.new
17
+ networks.each do |network|
18
+ interfaces.add(network[:interface])
19
+
20
+ # Remove any previous vagrant configuration in this network interface's
21
+ # configuration files.
22
+ vm.channel.sudo("touch #{network_scripts_dir}/ifcfg-eth#{network[:interface]}")
23
+ vm.channel.sudo("sed -e '/^#VAGRANT-BEGIN/,/^#VAGRANT-END/ d' #{network_scripts_dir}/ifcfg-eth#{network[:interface]} > /tmp/vagrant-ifcfg-eth#{network[:interface]}")
24
+ vm.channel.sudo("cat /tmp/vagrant-ifcfg-eth#{network[:interface]} > #{network_scripts_dir}/ifcfg-eth#{network[:interface]}")
25
+
26
+ # Render and upload the network entry file to a deterministic
27
+ # temporary location.
28
+ entry = TemplateRenderer.render("guests/redhat/network_#{network[:type]}",
29
+ :options => network)
30
+
31
+ temp = Tempfile.new("vagrant")
32
+ temp.write(entry)
33
+ temp.close
34
+
35
+ vm.channel.upload(temp.path, "/tmp/vagrant-network-entry_#{network[:interface]}")
36
+ end
37
+
38
+ # Bring down all the interfaces we're reconfiguring. By bringing down
39
+ # each specifically, we avoid reconfiguring eth0 (the NAT interface) so
40
+ # SSH never dies.
41
+ interfaces.each do |interface|
42
+ vm.channel.sudo("/sbin/ifdown eth#{interface} 2> /dev/null")
43
+ vm.channel.sudo("cat /tmp/vagrant-network-entry_#{interface} >> #{network_scripts_dir}/ifcfg-eth#{interface}")
44
+ vm.channel.sudo("/sbin/ifup eth#{interface}")
45
+ end
46
+ end
47
+
48
+ # The path to the directory with the network configuration scripts.
49
+ # This is pulled out into its own directory since there are other
50
+ # operating systems (SuSE) which behave similarly but with a different
51
+ # path to the network scripts.
52
+ def network_scripts_dir
53
+ '/etc/sysconfig/network-scripts'
54
+ end
55
+
56
+ def change_host_name(name)
57
+ # Only do this if the hostname is not already set
58
+ if !vm.channel.test("sudo hostname | grep '#{name}'")
59
+ vm.channel.sudo("sed -i 's/\\(HOSTNAME=\\).*/\\1#{name}/' /etc/sysconfig/network")
60
+ vm.channel.sudo("hostname #{name}")
61
+ vm.channel.sudo("sed -i 's@^\\(127[.]0[.]0[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,114 @@
1
+ module Vagrant
2
+ module Guest
3
+ # A general Vagrant system implementation for "solaris".
4
+ #
5
+ # Contributed by Blake Irvin <b.irvin@modcloth.com>
6
+ class Solaris < Base
7
+ # A custom config class which will be made accessible via `config.solaris`
8
+ # This is not necessary for all system implementers, of course. However,
9
+ # generally, Vagrant tries to make almost every aspect of its execution
10
+ # configurable, and this assists that goal.
11
+ class SolarisConfig < Vagrant::Config::Base
12
+ attr_accessor :halt_timeout
13
+ attr_accessor :halt_check_interval
14
+ # This sets the command to use to execute items as a superuser. sudo is default
15
+ attr_accessor :suexec_cmd
16
+ attr_accessor :device
17
+
18
+ def initialize
19
+ @halt_timeout = 30
20
+ @halt_check_interval = 1
21
+ @suexec_cmd = 'sudo'
22
+ @device = "e1000g"
23
+ end
24
+ end
25
+
26
+ # Here for whenever it may be used.
27
+ class SolarisError < Errors::VagrantError
28
+ error_namespace("vagrant.guest.solaris")
29
+ end
30
+
31
+ def configure_networks(networks)
32
+ networks.each do |network|
33
+ device = "#{vm.config.solaris.device}#{network[:interface]}"
34
+ su_cmd = vm.config.solaris.suexec_cmd
35
+ ifconfig_cmd = "#{su_cmd} /sbin/ifconfig #{device}"
36
+
37
+ vm.channel.execute("#{ifconfig_cmd} plumb")
38
+
39
+ if network[:type].to_sym == :static
40
+ vm.channel.execute("#{ifconfig_cmd} inet #{network[:ip]} netmask #{network[:netmask]}")
41
+ vm.channel.execute("#{ifconfig_cmd} up")
42
+ vm.channel.execute("#{su_cmd} sh -c \"echo '#{network[:ip]}' > /etc/hostname.#{device}\"")
43
+ elsif network[:type].to_sym == :dhcp
44
+ vm.channel.execute("#{ifconfig_cmd} dhcp start")
45
+ end
46
+ end
47
+ end
48
+
49
+ def change_host_name(name)
50
+ su_cmd = vm.config.solaris.suexec_cmd
51
+
52
+ # Only do this if the hostname is not already set
53
+ if !vm.channel.test("#{su_cmd} hostname | grep '#{name}'")
54
+ vm.channel.execute("#{su_cmd} sh -c \"echo '#{name}' > /etc/nodename\"")
55
+ vm.channel.execute("#{su_cmd} uname -S #{name}")
56
+ end
57
+ end
58
+
59
+ # There should be an exception raised if the line
60
+ #
61
+ # vagrant::::profiles=Primary Administrator
62
+ #
63
+ # does not exist in /etc/user_attr. TODO
64
+ def halt
65
+ # Wait until the VM's state is actually powered off. If this doesn't
66
+ # occur within a reasonable amount of time (15 seconds by default),
67
+ # then simply return and allow Vagrant to kill the machine.
68
+ count = 0
69
+ last_error = nil
70
+ while vm.state != :poweroff
71
+ begin
72
+ vm.channel.execute("#{vm.config.solaris.suexec_cmd} /usr/sbin/poweroff")
73
+ rescue IOError => e
74
+ # Save the last error; if it's not shutdown in a reasonable amount
75
+ # of attempts we will re-raise the error so it's not hidden for
76
+ # all time
77
+ last_error = e
78
+ end
79
+
80
+ count += 1
81
+ if count >= vm.config.solaris.halt_timeout
82
+ # Check for last error and re-raise it
83
+ if last_error != nil
84
+ raise last_error
85
+ else
86
+ # Otherwise, just return
87
+ return
88
+ end
89
+ end
90
+
91
+ # Still opportunities remaining; sleep and loop
92
+ sleep vm.config.solaris.halt_check_interval
93
+ end # while
94
+ end
95
+
96
+ def mount_shared_folder(name, guestpath, options)
97
+ # These are just far easier to use than the full options syntax
98
+ owner = options[:owner]
99
+ group = options[:group]
100
+
101
+ # Create the shared folder
102
+ vm.channel.execute("#{vm.config.solaris.suexec_cmd} mkdir -p #{guestpath}")
103
+
104
+ # Mount the folder with the proper owner/group
105
+ mount_options = "-o uid=`id -u #{owner}`,gid=`id -g #{group}`"
106
+ mount_options += ",#{options[:extra]}" if options[:extra]
107
+ vm.channel.execute("#{vm.config.solaris.suexec_cmd} /sbin/mount -F vboxfs #{mount_options} #{name} #{guestpath}")
108
+
109
+ # chown the folder to the proper owner/group
110
+ vm.channel.execute("#{vm.config.solaris.suexec_cmd} chown `id -u #{owner}`:`id -g #{group}` #{guestpath}")
111
+ end
112
+ end
113
+ end
114
+ end
@@ -1,9 +1,9 @@
1
1
  module Vagrant
2
- module Systems
2
+ module Guest
3
3
  class Suse < Redhat
4
4
  def network_scripts_dir
5
5
  '/etc/sysconfig/network/'
6
- end
6
+ end
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,23 @@
1
+ require 'vagrant/guest/debian'
2
+
3
+ module Vagrant
4
+ module Guest
5
+ class Ubuntu < Debian
6
+ def mount_shared_folder(name, guestpath, options)
7
+ # Mount it like normal
8
+ super
9
+
10
+ # Emit an upstart event if upstart is available
11
+ @vm.channel.sudo("[ -x /sbin/initctl ] && /sbin/initctl emit vagrant-mounted MOUNTPOINT=#{guestpath}")
12
+ end
13
+
14
+ def change_host_name(name)
15
+ if !vm.channel.test("sudo hostname | grep '#{name}'")
16
+ vm.channel.sudo("sed -i 's/.*$/#{name}/' /etc/hostname")
17
+ vm.channel.sudo("sed -i 's@^\\(127[.]0[.]1[.]1[[:space:]]\\+\\)@\\1#{name} #{name.split('.')[0]} @' /etc/hosts")
18
+ vm.channel.sudo("service hostname start")
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,10 +1,27 @@
1
1
  module Vagrant
2
2
  module Hosts
3
- autoload :Base, 'vagrant/hosts/base'
4
- autoload :Arch, 'vagrant/hosts/arch'
5
- autoload :BSD, 'vagrant/hosts/bsd'
6
- autoload :FreeBSD,'vagrant/hosts/freebsd'
7
- autoload :Fedora, 'vagrant/hosts/fedora'
8
- autoload :Linux, 'vagrant/hosts/linux'
3
+ autoload :Base, 'vagrant/hosts/base'
4
+ autoload :Arch, 'vagrant/hosts/arch'
5
+ autoload :BSD, 'vagrant/hosts/bsd'
6
+ autoload :FreeBSD, 'vagrant/hosts/freebsd'
7
+ autoload :Fedora, 'vagrant/hosts/fedora'
8
+ autoload :Linux, 'vagrant/hosts/linux'
9
+ autoload :Windows, 'vagrant/hosts/windows'
10
+
11
+ # This method detects the correct host based on the `match?` methods
12
+ # implemented in the registered hosts.
13
+ def self.detect(registry)
14
+ # Sort the hosts by their precedence
15
+ host_klasses = registry.to_hash.values
16
+ host_klasses = host_klasses.sort_by { |a| a.precedence }.reverse
17
+
18
+ # Test for matches and return the host class that matches
19
+ host_klasses.each do |klass|
20
+ return klass if klass.match?
21
+ end
22
+
23
+ # No matches found...
24
+ return nil
25
+ end
9
26
  end
10
27
  end
@@ -1,13 +1,17 @@
1
1
  module Vagrant
2
2
  module Hosts
3
3
  class Arch < Linux
4
- def nfs_export(ip, folders)
4
+ def self.match?
5
+ File.exist?("/etc/rc.conf") && File.exist?("/etc/pacman.conf")
6
+ end
7
+
8
+ def nfs_export(id, ip, folders)
5
9
  output = TemplateRenderer.render('nfs/exports_linux',
6
- :uuid => env.vm.uuid,
10
+ :uuid => id,
7
11
  :ip => ip,
8
12
  :folders => folders)
9
13
 
10
- env.ui.info I18n.t("vagrant.hosts.arch.nfs_export.prepare")
14
+ @ui.info I18n.t("vagrant.hosts.arch.nfs_export.prepare")
11
15
  sleep 0.5
12
16
 
13
17
  output.split("\n").each do |line|
@@ -1,54 +1,39 @@
1
1
  module Vagrant
2
2
  module Hosts
3
- # Base class representing a host machine. These classes
4
- # define methods which may have host-specific (Mac OS X, Windows,
5
- # Linux, etc) behavior. The class is automatically determined by
6
- # default but may be explicitly set via `config.vagrant.host`.
3
+ # Interface for classes which house behavior that is specific
4
+ # to the host OS that is running Vagrant.
5
+ #
6
+ # By default, Vagrant will attempt to choose the best option
7
+ # for your machine, but the host may also be explicitly set
8
+ # via the `config.vagrant.host` parameter.
7
9
  class Base
8
- # The {Environment} which this host belongs to.
9
- attr_reader :env
10
-
11
- # Loads the proper host for the given value. If the value is nil
12
- # or is the symbol `:detect`, then the host class will be detected
13
- # using the `RUBY_PLATFORM` constant.
14
- #
15
- # @param [Environment] env
16
- # @param [String] klass
17
- # @return [Base]
18
- def self.load(env, klass)
19
- klass = detect if klass.nil? || klass == :detect
20
- return nil if !klass
21
- return klass.new(env)
22
- end
23
-
24
- # Detects the proper host class for current platform and returns
25
- # the class.
10
+ # This returns true/false depending on if the current running system
11
+ # matches the host class.
26
12
  #
27
- # @return [Class]
28
- def self.detect
29
- [BSD, Linux].each do |type|
30
- result = type.distro_dispatch
31
- return result if result
32
- end
33
-
34
- nil
35
- rescue Exception
13
+ # @return [Boolean]
14
+ def self.match?
36
15
  nil
37
16
  end
38
17
 
39
- # This must be implemented by subclasses to dispatch to the proper
40
- # distro-specific class for the host. If this returns nil then it is
41
- # an invalid host class.
42
- def self.distro_dispatch
43
- nil
18
+ # The precedence of the host when checking for matches. This is to
19
+ # allow certain host such as generic OS's ("Linux", "BSD", etc.)
20
+ # to be specified last.
21
+ #
22
+ # The hosts with the higher numbers will be checked first.
23
+ #
24
+ # If you're implementing a basic host, you can probably ignore this.
25
+ def self.precedence
26
+ 5
44
27
  end
45
28
 
46
- # Initialzes a new host. This method shouldn't be called directly,
47
- # typically, since it will be called by {Environment#load!}.
29
+ # Initializes a new host class.
30
+ #
31
+ # The only required parameter is a UI object so that the host
32
+ # objects have some way to communicate with the outside world.
48
33
  #
49
- # @param [Environment] env
50
- def initialize(env)
51
- @env = env
34
+ # @param [UI] ui UI for the hosts to output to.
35
+ def initialize(ui)
36
+ @ui = ui
52
37
  end
53
38
 
54
39
  # Returns true of false denoting whether or not this host supports
@@ -60,16 +45,21 @@ module Vagrant
60
45
  false
61
46
  end
62
47
 
63
- # Exports the given hash of folders via NFS. This method will raise
64
- # an {Vagrant::Action::ActionException} if anything goes wrong.
48
+ # Exports the given hash of folders via NFS.
65
49
  #
50
+ # @param [String] id A unique ID that is guaranteed to be unique to
51
+ # match these sets of folders.
66
52
  # @param [String] ip IP of the guest machine.
67
53
  # @param [Hash] folders Shared folders to sync.
68
- def nfs_export(ip, folders)
54
+ def nfs_export(id, ip, folders)
69
55
  end
70
56
 
71
- # Cleans up the exports for the current VM.
72
- def nfs_cleanup
57
+ # Prunes any NFS exports made by Vagrant which aren't in the set
58
+ # of valid ids given.
59
+ #
60
+ # @param [Array<String>] valid_ids Valid IDs that should not be
61
+ # pruned.
62
+ def nfs_prune(valid_ids)
73
63
  end
74
64
  end
75
65
  end