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
@@ -1,12 +1,12 @@
1
1
  require 'pathname'
2
2
 
3
+ require 'vagrant/provisioners/chef'
4
+
3
5
  module Vagrant
4
6
  module Provisioners
5
7
  # This class implements provisioning via chef-client, allowing provisioning
6
8
  # with a chef server.
7
9
  class ChefClient < Chef
8
- register :chef_client
9
-
10
10
  class Config < Chef::Config
11
11
  attr_accessor :chef_server_url
12
12
  attr_accessor :validation_key_path
@@ -25,11 +25,10 @@ module Vagrant
25
25
  @client_key_path = "/etc/chef/client.pem"
26
26
  @file_cache_path = "/srv/chef/file_store"
27
27
  @file_backup_path = "/srv/chef/cache"
28
- @encrypted_data_bag_secret_key_path = nil
29
28
  @encrypted_data_bag_secret = "/tmp/encrypted_data_bag_secret"
30
29
  end
31
30
 
32
- def validate(errors)
31
+ def validate(env, errors)
33
32
  super
34
33
 
35
34
  errors.add(I18n.t("vagrant.config.chef.server_url_empty")) if !chef_server_url || chef_server_url.strip == ""
@@ -38,6 +37,10 @@ module Vagrant
38
37
  end
39
38
  end
40
39
 
40
+ def self.config_class
41
+ Config
42
+ end
43
+
41
44
  def prepare
42
45
  raise ChefError, :server_validation_key_required if config.validation_key_path.nil?
43
46
  raise ChefError, :server_validation_key_doesnt_exist if !File.file?(validation_key_path)
@@ -56,26 +59,25 @@ module Vagrant
56
59
  end
57
60
 
58
61
  def create_client_key_folder
59
- env.ui.info I18n.t("vagrant.provisioners.chef.client_key_folder")
62
+ env[:ui].info I18n.t("vagrant.provisioners.chef.client_key_folder")
60
63
  path = Pathname.new(config.client_key_path)
61
64
 
62
- vm.ssh.execute do |ssh|
63
- ssh.sudo!("mkdir -p #{path.dirname}")
64
- end
65
+ env[:vm].channel.sudo("mkdir -p #{path.dirname}")
65
66
  end
66
67
 
67
68
  def upload_validation_key
68
- env.ui.info I18n.t("vagrant.provisioners.chef.upload_validation_key")
69
- vm.ssh.upload!(validation_key_path, guest_validation_key_path)
69
+ env[:ui].info I18n.t("vagrant.provisioners.chef.upload_validation_key")
70
+ env[:vm].channel.upload(validation_key_path, guest_validation_key_path)
70
71
  end
71
72
 
72
73
  def upload_encrypted_data_bag_secret
73
- env.ui.info I18n.t("vagrant.provisioners.chef.upload_encrypted_data_bag_secret_key")
74
- vm.ssh.upload!(encrypted_data_bag_secret_key_path, config.encrypted_data_bag_secret)
74
+ env[:ui].info I18n.t("vagrant.provisioners.chef.upload_encrypted_data_bag_secret_key")
75
+ env[:vm].channel.upload(encrypted_data_bag_secret_key_path,
76
+ config.encrypted_data_bag_secret)
75
77
  end
76
78
 
77
79
  def setup_server_config
78
- setup_config("chef_server_client", "client.rb", {
80
+ setup_config("provisioners/chef_client/client", "client.rb", {
79
81
  :node_name => config.node_name,
80
82
  :chef_server_url => config.chef_server_url,
81
83
  :validation_client_name => config.validation_client_name,
@@ -92,24 +94,36 @@ module Vagrant
92
94
  command_env = config.binary_env ? "#{config.binary_env} " : ""
93
95
  command = "#{command_env}#{chef_binary_path("chef-client")} -c #{config.provisioning_path}/client.rb -j #{config.provisioning_path}/dna.json"
94
96
 
95
- env.ui.info I18n.t("vagrant.provisioners.chef.running_client")
96
- vm.ssh.execute do |ssh|
97
- ssh.sudo!(command) do |channel, type, data|
98
- if type == :exit_status
99
- ssh.check_exit_status(data, command)
100
- else
101
- env.ui.info("#{data}: #{type}")
102
- end
97
+ config.attempts.times do |attempt|
98
+ if attempt == 0
99
+ env[:ui].info I18n.t("vagrant.provisioners.chef.running_client")
100
+ else
101
+ env[:ui].info I18n.t("vagrant.provisioners.chef.running_client_again")
103
102
  end
103
+
104
+ exit_status = env[:vm].channel.sudo(command) do |type, data|
105
+ # Output the data with the proper color based on the stream.
106
+ color = type == :stdout ? :green : :red
107
+
108
+ # Note: Be sure to chomp the data to avoid the newlines that the
109
+ # Chef outputs.
110
+ env[:ui].info(data.chomp, :color => color, :prefix => false)
111
+ end
112
+
113
+ # There is no need to run Chef again if it converges
114
+ return if exit_status == 0
104
115
  end
116
+
117
+ # If we reached this point then Chef never converged! Error.
118
+ raise ChefError, :no_convergence
105
119
  end
106
120
 
107
121
  def validation_key_path
108
- File.expand_path(config.validation_key_path, env.root_path)
122
+ File.expand_path(config.validation_key_path, env[:root_path])
109
123
  end
110
124
 
111
125
  def encrypted_data_bag_secret_key_path
112
- File.expand_path(config.encrypted_data_bag_secret_key_path, env.root_path)
126
+ File.expand_path(config.encrypted_data_bag_secret_key_path, env[:root_path])
113
127
  end
114
128
 
115
129
  def guest_validation_key_path
@@ -1,9 +1,11 @@
1
+ require "log4r"
2
+
3
+ require 'vagrant/provisioners/chef'
4
+
1
5
  module Vagrant
2
6
  module Provisioners
3
7
  # This class implements provisioning via chef-solo.
4
8
  class ChefSolo < Chef
5
- register :chef_solo
6
-
7
9
  extend Util::Counter
8
10
  include Util::Counter
9
11
 
@@ -18,12 +20,10 @@ module Vagrant
18
20
  super
19
21
 
20
22
  @cookbooks_path = ["cookbooks", [:vm, "cookbooks"]]
21
- @roles_path = nil
22
- @data_bags_path = nil
23
23
  @nfs = false
24
24
  end
25
25
 
26
- def validate(errors)
26
+ def validate(env, errors)
27
27
  super
28
28
 
29
29
  errors.add(I18n.t("vagrant.config.chef.cookbooks_path_empty")) if !cookbooks_path || [cookbooks_path].flatten.empty?
@@ -35,6 +35,15 @@ module Vagrant
35
35
  attr_reader :role_folders
36
36
  attr_reader :data_bags_folders
37
37
 
38
+ def self.config_class
39
+ Config
40
+ end
41
+
42
+ def initialize(env, config)
43
+ super
44
+ @logger = Log4r::Logger.new("vagrant::provisioners::chef_solo")
45
+ end
46
+
38
47
  def prepare
39
48
  @cookbook_folders = expanded_folders(config.cookbooks_path, "cookbooks")
40
49
  @role_folders = expanded_folders(config.roles_path, "roles")
@@ -46,6 +55,19 @@ module Vagrant
46
55
  end
47
56
 
48
57
  def provision!
58
+ # Verify that the proper shared folders exist.
59
+ check = []
60
+ [@cookbook_folders, @role_folders, @data_bags_folders].each do |folders|
61
+ folders.each do |type, local_path, remote_path|
62
+ # We only care about checking folders that have a local path, meaning
63
+ # they were shared from the local machine, rather than assumed to
64
+ # exist on the VM.
65
+ check << remote_path if local_path
66
+ end
67
+ end
68
+
69
+ verify_shared_folders(check)
70
+
49
71
  verify_binary(chef_binary_path("chef-solo"))
50
72
  chown_provisioning_folder
51
73
  setup_json
@@ -68,7 +90,7 @@ module Vagrant
68
90
  # Create the local/remote path based on whether this is a host
69
91
  # or VM path.
70
92
  local_path = nil
71
- local_path = File.expand_path(path, env.root_path) if type == :host
93
+ local_path = File.expand_path(path, env[:root_path]) if type == :host
72
94
  remote_path = nil
73
95
  if type == :host
74
96
  # Path exists on the host, setup the remote path
@@ -98,7 +120,7 @@ module Vagrant
98
120
  def share_folders(prefix, folders)
99
121
  folders.each do |type, local_path, remote_path|
100
122
  if type == :host
101
- env.config.vm.share_folder("v-#{prefix}-#{self.class.get_and_update_counter(:shared_folder)}",
123
+ env[:vm].config.vm.share_folder("v-#{prefix}-#{self.class.get_and_update_counter(:shared_folder)}",
102
124
  remote_path, local_path, :nfs => config.nfs)
103
125
  end
104
126
  end
@@ -109,7 +131,7 @@ module Vagrant
109
131
  roles_path = guest_paths(@role_folders).first
110
132
  data_bags_path = guest_paths(@data_bags_folders).first
111
133
 
112
- setup_config("chef_solo_solo", "solo.rb", {
134
+ setup_config("provisioners/chef_solo/solo", "solo.rb", {
113
135
  :node_name => config.node_name,
114
136
  :provisioning_path => config.provisioning_path,
115
137
  :cookbooks_path => cookbooks_path,
@@ -123,18 +145,41 @@ module Vagrant
123
145
  command_env = config.binary_env ? "#{config.binary_env} " : ""
124
146
  command = "#{command_env}#{chef_binary_path("chef-solo")} -c #{config.provisioning_path}/solo.rb -j #{config.provisioning_path}/dna.json"
125
147
 
126
- env.ui.info I18n.t("vagrant.provisioners.chef.running_solo")
127
- vm.ssh.execute do |ssh|
128
- ssh.sudo!(command) do |channel, type, data|
129
- if type == :exit_status
130
- ssh.check_exit_status(data, command)
131
- else
132
- env.ui.info("#{data}: #{type}")
133
- end
148
+ config.attempts.times do |attempt|
149
+ if attempt == 0
150
+ env[:ui].info I18n.t("vagrant.provisioners.chef.running_solo")
151
+ else
152
+ env[:ui].info I18n.t("vagrant.provisioners.chef.running_solo_again")
153
+ end
154
+
155
+ exit_status = env[:vm].channel.sudo(command, :error_check => false) do |type, data|
156
+ # Output the data with the proper color based on the stream.
157
+ color = type == :stdout ? :green : :red
158
+
159
+ # Note: Be sure to chomp the data to avoid the newlines that the
160
+ # Chef outputs.
161
+ env[:ui].info(data.chomp, :color => color, :prefix => false)
134
162
  end
163
+
164
+ # There is no need to run Chef again if it converges
165
+ return if exit_status == 0
135
166
  end
167
+
168
+ # If we reached this point then Chef never converged! Error.
169
+ raise ChefError, :no_convergence
136
170
  end
137
171
 
172
+ def verify_shared_folders(folders)
173
+ folders.each do |folder|
174
+ @logger.debug("Checking for shared folder: #{folder}")
175
+ if !env[:vm].channel.test("test -d #{folder}")
176
+ raise ChefError, :missing_shared_folders
177
+ end
178
+ end
179
+ end
180
+
181
+ protected
182
+
138
183
  # Extracts only the remote paths from a list of folders
139
184
  def guest_paths(folders)
140
185
  folders.map { |parts| parts[2] }
@@ -1,3 +1,5 @@
1
+ require "log4r"
2
+
1
3
  module Vagrant
2
4
  module Provisioners
3
5
  class PuppetError < Vagrant::Errors::VagrantError
@@ -5,8 +7,6 @@ module Vagrant
5
7
  end
6
8
 
7
9
  class Puppet < Base
8
- register :puppet
9
-
10
10
  class Config < Vagrant::Config::Base
11
11
  attr_accessor :manifest_file
12
12
  attr_accessor :manifests_path
@@ -15,28 +15,21 @@ module Vagrant
15
15
  attr_accessor :options
16
16
 
17
17
  def initialize
18
- @manifest_file = nil
18
+ @manifest_file = "default.pp"
19
19
  @manifests_path = "manifests"
20
- @module_path = nil
21
20
  @pp_path = "/tmp/vagrant-puppet"
22
21
  @options = []
23
22
  end
24
23
 
25
24
  # Returns the manifests path expanded relative to the root path of the
26
25
  # environment.
27
- def expanded_manifests_path
28
- Pathname.new(manifests_path).expand_path(env.root_path)
29
- end
30
-
31
- # Returns the manifest file if set otherwise returns the box name pp file
32
- # which may or may not exist.
33
- def computed_manifest_file
34
- manifest_file || "#{top.vm.box}.pp"
26
+ def expanded_manifests_path(root_path)
27
+ Pathname.new(manifests_path).expand_path(root_path)
35
28
  end
36
29
 
37
30
  # Returns the module paths as an array of paths expanded relative to the
38
31
  # root path.
39
- def expanded_module_paths
32
+ def expanded_module_paths(root_path)
40
33
  return [] if !module_path
41
34
 
42
35
  # Get all the paths and expand them relative to the root path, returning
@@ -44,24 +37,29 @@ module Vagrant
44
37
  paths = module_path
45
38
  paths = [paths] if !paths.is_a?(Array)
46
39
  paths.map do |path|
47
- Pathname.new(path).expand_path(env.root_path)
40
+ Pathname.new(path).expand_path(root_path)
48
41
  end
49
42
  end
50
43
 
51
- def validate(errors)
52
- super
44
+ def validate(env, errors)
45
+ # Calculate the manifests and module paths based on env
46
+ this_expanded_manifests_path = expanded_manifests_path(env.root_path)
47
+ this_expanded_module_paths = expanded_module_paths(env.root_path)
53
48
 
54
49
  # Manifests path/file validation
55
- if !expanded_manifests_path.directory?
56
- errors.add(I18n.t("vagrant.provisioners.puppet.manifests_path_missing", :path => expanded_manifests_path))
50
+ if !this_expanded_manifests_path.directory?
51
+ errors.add(I18n.t("vagrant.provisioners.puppet.manifests_path_missing",
52
+ :path => this_expanded_manifests_path))
57
53
  else
58
- if !expanded_manifests_path.join(computed_manifest_file).file?
59
- errors.add(I18n.t("vagrant.provisioners.puppet.manifest_missing", :manifest => computed_manifest_file))
54
+ expanded_manifest_file = this_expanded_manifests_path.join(manifest_file)
55
+ if !expanded_manifest_file.file?
56
+ errors.add(I18n.t("vagrant.provisioners.puppet.manifest_missing",
57
+ :manifest => expanded_manifest_file.to_s))
60
58
  end
61
59
  end
62
60
 
63
61
  # Module paths validation
64
- expanded_module_paths.each do |path|
62
+ this_expanded_module_paths.each do |path|
65
63
  if !path.directory?
66
64
  errors.add(I18n.t("vagrant.provisioners.puppet.module_path_missing", :path => path))
67
65
  end
@@ -69,19 +67,43 @@ module Vagrant
69
67
  end
70
68
  end
71
69
 
70
+ def self.config_class
71
+ Config
72
+ end
73
+
74
+ def initialize(env, config)
75
+ super
76
+
77
+ @logger = Log4r::Logger.new("vagrant::provisioners::puppet")
78
+ end
79
+
72
80
  def prepare
81
+ # Calculate the paths we're going to use based on the environment
82
+ @expanded_manifests_path = config.expanded_manifests_path(env[:root_path])
83
+ @expanded_module_paths = config.expanded_module_paths(env[:root_path])
84
+ @manifest_file = File.join(manifests_guest_path, config.manifest_file)
85
+
73
86
  set_module_paths
74
87
  share_manifests
75
88
  share_module_paths
76
89
  end
77
90
 
78
91
  def provision!
92
+ # Check that the shared folders are properly shared
93
+ check = [manifests_guest_path]
94
+ @module_paths.each do |host_path, guest_path|
95
+ check << guest_path
96
+ end
97
+
98
+ verify_shared_folders(check)
99
+
100
+ # Verify Puppet is installed and run it
79
101
  verify_binary("puppet")
80
102
  run_puppet_client
81
103
  end
82
104
 
83
105
  def share_manifests
84
- env.config.vm.share_folder("manifests", manifests_guest_path, config.expanded_manifests_path)
106
+ env[:vm].config.vm.share_folder("manifests", manifests_guest_path, @expanded_manifests_path)
85
107
  end
86
108
 
87
109
  def share_module_paths
@@ -89,14 +111,14 @@ module Vagrant
89
111
  @module_paths.each do |from, to|
90
112
  # Sorry for the cryptic key here, but VirtualBox has a strange limit on
91
113
  # maximum size for it and its something small (around 10)
92
- env.config.vm.share_folder("v-pp-m#{count}", to, from)
114
+ env[:vm].config.vm.share_folder("v-pp-m#{count}", to, from)
93
115
  count += 1
94
116
  end
95
117
  end
96
118
 
97
119
  def set_module_paths
98
120
  @module_paths = {}
99
- config.expanded_module_paths.each_with_index do |path, i|
121
+ @expanded_module_paths.each_with_index do |path, i|
100
122
  @module_paths[path] = File.join(config.pp_path, "modules-#{i}")
101
123
  end
102
124
  end
@@ -106,32 +128,42 @@ module Vagrant
106
128
  end
107
129
 
108
130
  def verify_binary(binary)
109
- vm.ssh.execute do |ssh|
110
- ssh.sudo!("which #{binary}", :error_class => PuppetError, :_key => :puppet_not_detected, :binary => binary)
111
- end
131
+ env[:vm].channel.sudo("which #{binary}",
132
+ :error_class => PuppetError,
133
+ :error_key => :puppet_not_detected,
134
+ :binary => binary)
112
135
  end
113
136
 
114
137
  def run_puppet_client
115
138
  options = [config.options].flatten
116
139
  options << "--modulepath '#{@module_paths.values.join(':')}'" if !@module_paths.empty?
117
- options << config.computed_manifest_file
140
+ options << @manifest_file
118
141
  options = options.join(" ")
119
142
 
120
- commands = ["cd #{manifests_guest_path}",
121
- "puppet apply #{options}"]
143
+ command = "cd #{manifests_guest_path} && puppet apply #{options}"
122
144
 
123
- env.ui.info I18n.t("vagrant.provisioners.puppet.running_puppet", :manifest => config.computed_manifest_file)
145
+ env[:ui].info I18n.t("vagrant.provisioners.puppet.running_puppet",
146
+ :manifest => @manifest_file)
124
147
 
125
- vm.ssh.execute do |ssh|
126
- ssh.sudo! commands do |ch, type, data|
127
- if type == :exit_status
128
- ssh.check_exit_status(data, commands)
129
- else
130
- env.ui.info(data)
131
- end
148
+ env[:vm].channel.sudo(command) do |type, data|
149
+ # Output the data with the proper color based on the stream.
150
+ color = type == :stdout ? :green : :red
151
+
152
+ # Note: Be sure to chomp the data to avoid the newlines that the
153
+ # Chef outputs.
154
+ env[:ui].info(data.chomp, :color => color, :prefix => false)
155
+ end
156
+ end
157
+
158
+ def verify_shared_folders(folders)
159
+ folders.each do |folder|
160
+ @logger.debug("Checking for shared folder: #{folder}")
161
+ if !env[:vm].channel.test("test -d #{folder}")
162
+ raise PuppetError, :missing_shared_folders
132
163
  end
133
164
  end
134
165
  end
135
166
  end
136
167
  end
137
168
  end
169
+