vagrant 0.8.10 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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
+