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,5 +1,5 @@
1
1
  module Vagrant
2
- class Config
2
+ module Config
3
3
  # This class is the "top" configure class, which handles registering
4
4
  # other configuration classes as well as validation of all configured
5
5
  # classes. This is the object which is returned by {Environment#config}
@@ -7,34 +7,45 @@ module Vagrant
7
7
  #
8
8
  # If you're looking to create your own configuration class, see {Base}.
9
9
  class Top < Base
10
- @@configures = {} if !defined?(@@configures)
10
+ attr_reader :keys
11
11
 
12
- # The environment that this configuration is for.
13
- attr_reader :env
12
+ def initialize(registry=nil)
13
+ @keys = {}
14
+ @registry = registry || Vagrant.config_keys
15
+ end
14
16
 
15
- class << self
16
- # The list of registered configuration classes as well as the key
17
- # they're registered under.
18
- def configures_list
19
- @@configures ||= {}
20
- end
17
+ # We use method_missing as a way to get the configuration that is used
18
+ # for Vagrant and load the proper configuration classes for each.
19
+ def method_missing(name, *args)
20
+ return @keys[name] if @keys.has_key?(name)
21
21
 
22
- # Registers a configuration class with the given key. This method shouldn't
23
- # be called. Instead, inherit from {Base} and call {Base.configures}.
24
- def configures(key, klass)
25
- configures_list[key] = klass
26
- attr_reader key.to_sym
22
+ config_klass = @registry.get(name.to_sym)
23
+ if config_klass
24
+ # Instantiate the class and return the instance
25
+ @keys[name] = config_klass.new
26
+ return @keys[name]
27
+ else
28
+ # Super it up to probably raise a NoMethodError
29
+ super
27
30
  end
28
31
  end
29
32
 
30
- def initialize(env=nil)
31
- self.class.configures_list.each do |key, klass|
32
- config = klass.new
33
- config.top = self
34
- instance_variable_set("@#{key}".to_sym, config)
33
+ # Custom implementation to merge each key separately.
34
+ def merge(other)
35
+ result = self.class.new
36
+ @keys.each do |key, value|
37
+ result.keys[key] = value.merge(other.send(key))
38
+ end
39
+
40
+ other.keys.each do |key, value|
41
+ if !@keys.has_key?(key)
42
+ # This is a key that the other configuration class has
43
+ # that we don't, so just copy it in.
44
+ result.keys[key] = value.dup
45
+ end
35
46
  end
36
47
 
37
- @env = env
48
+ result
38
49
  end
39
50
 
40
51
  # Validates the configuration classes of this instance and raises an
@@ -42,13 +53,13 @@ module Vagrant
42
53
  # class, the method you want to implement is {Base#validate}. This is
43
54
  # the method that checks all the validation, not one which defines
44
55
  # validation rules.
45
- def validate!
56
+ def validate!(env)
46
57
  # Validate each of the configured classes and store the results into
47
58
  # a hash.
48
- errors = self.class.configures_list.inject({}) do |container, data|
49
- key, _ = data
59
+ errors = @keys.inject({}) do |container, data|
60
+ key, instance = data
50
61
  recorder = ErrorRecorder.new
51
- send(key.to_sym).validate(recorder)
62
+ instance.validate(env, recorder)
52
63
  container[key.to_sym] = recorder if !recorder.errors.empty?
53
64
  container
54
65
  end
@@ -1,13 +1,10 @@
1
1
  module Vagrant
2
- class Config
2
+ module Config
3
3
  class VagrantConfig < Base
4
- configures :vagrant
5
-
6
4
  attr_accessor :dotfile_name
7
5
  attr_accessor :host
8
- attr_accessor :ssh_session_cache
9
6
 
10
- def validate(errors)
7
+ def validate(env, errors)
11
8
  [:dotfile_name, :host].each do |field|
12
9
  errors.add(I18n.t("vagrant.config.common.error_empty", :field => field)) if !instance_variable_get("@#{field}".to_sym)
13
10
  end
@@ -1,77 +1,120 @@
1
+ require 'pathname'
2
+
1
3
  require 'vagrant/config/vm/sub_vm'
2
4
  require 'vagrant/config/vm/provisioner'
3
5
 
4
6
  module Vagrant
5
- class Config
7
+ module Config
6
8
  class VMConfig < Base
7
- configures :vm
8
-
9
- include Util::StackedProcRunner
10
-
9
+ attr_accessor :name
11
10
  attr_accessor :auto_port_range
12
11
  attr_accessor :box
13
12
  attr_accessor :box_url
14
- attr_accessor :box_ovf
15
13
  attr_accessor :base_mac
16
14
  attr_accessor :boot_mode
17
15
  attr_accessor :host_name
18
16
  attr_reader :forwarded_ports
19
17
  attr_reader :shared_folders
20
- attr_reader :network_options
18
+ attr_reader :networks
21
19
  attr_reader :provisioners
22
- attr_accessor :system
20
+ attr_reader :customizations
21
+ attr_accessor :guest
23
22
 
24
23
  def initialize
25
- @forwarded_ports = {}
24
+ @forwarded_ports = []
26
25
  @shared_folders = {}
27
- @network_options = []
26
+ @networks = []
28
27
  @provisioners = []
28
+ @customizations = []
29
29
  end
30
30
 
31
- def forward_port(name, guestport, hostport, options=nil)
32
- options = {
31
+ # Custom merge method since some keys here are merged differently.
32
+ def merge(other)
33
+ result = super
34
+ result.instance_variable_set(:@forwarded_ports, @forwarded_ports + other.forwarded_ports)
35
+ result.instance_variable_set(:@shared_folders, @shared_folders.merge(other.shared_folders))
36
+ result.instance_variable_set(:@networks, @networks + other.networks)
37
+ result.instance_variable_set(:@provisioners, @provisioners + other.provisioners)
38
+ result.instance_variable_set(:@customizations, @customizations + other.customizations)
39
+ result
40
+ end
41
+
42
+ def forward_port(guestport, hostport, options=nil)
43
+ if !guestport.kind_of?(Integer)
44
+ raise Errors::DeprecationError, :message => <<-MESSAGE
45
+ `config.vm.forward_port` changed in 0.9.0 where the required name
46
+ argument is now removed. Vagrant will now automatically generate
47
+ a unique name for your forwarded port. For example, to forward
48
+ port 80 to port 8080 you now do the following:
49
+
50
+ config.vm.forward_port 80, 8080
51
+
52
+ Please change your configurations to match this new syntax.
53
+ MESSAGE
54
+ end
55
+
56
+ @forwarded_ports << {
57
+ :name => "#{guestport.to_s(32)}-#{hostport.to_s(32)}",
33
58
  :guestport => guestport,
34
59
  :hostport => hostport,
35
60
  :protocol => :tcp,
36
- :adapter => 0,
61
+ :adapter => 1,
37
62
  :auto => false
38
63
  }.merge(options || {})
39
-
40
- forwarded_ports[name] = options
41
64
  end
42
65
 
43
66
  def share_folder(name, guestpath, hostpath, opts=nil)
44
67
  @shared_folders[name] = {
45
- :guestpath => guestpath,
46
- :hostpath => hostpath,
68
+ :guestpath => guestpath.to_s,
69
+ :hostpath => hostpath.to_s,
70
+ :create => false,
47
71
  :owner => nil,
48
72
  :group => nil,
49
- :nfs => false
73
+ :nfs => false,
74
+ :extra => nil
50
75
  }.merge(opts || {})
51
76
  end
52
77
 
53
- def network(ip, options=nil)
54
- options = {
55
- :ip => ip,
56
- :netmask => "255.255.255.0",
57
- :adapter => 1,
58
- :mac => nil,
59
- :name => nil
60
- }.merge(options || {})
78
+ def network(type, *args)
79
+ if !type.kind_of?(Symbol)
80
+ raise Errors::DeprecationError, :message => <<-MESSAGE
81
+ `config.vm.network` changed in 0.9.0 where the first argument is
82
+ now the type of network and the remaining arguments are options for
83
+ that type. For example, host only networks are now configured like
84
+ so:
61
85
 
62
- @network_options[options[:adapter]] = options
86
+ config.vm.network :hostonly, "172.24.24.24"
87
+
88
+ Please change your configurations to match this new syntax.
89
+ MESSAGE
90
+ end
91
+
92
+ @networks << [type, args]
63
93
  end
64
94
 
65
95
  def provision(name, options=nil, &block)
66
- @provisioners << Provisioner.new(top, name, options, &block)
96
+ @provisioners << Provisioner.new(name, options, &block)
67
97
  end
68
98
 
69
- def customize(&block)
70
- push_proc(&block)
71
- end
99
+ # TODO: This argument should not be `nil` in the future.
100
+ # It is only defaulted to nil so that the deprecation error
101
+ # can be properly shown.
102
+ def customize(command=nil)
103
+ if block_given?
104
+ raise Errors::DeprecationError, :message => <<-MESSAGE
105
+ `config.vm.customize` now takes an array of arguments to send to
106
+ `VBoxManage` instead of having a block which gets a virtual machine
107
+ object. Example of the new usage:
108
+
109
+ config.vm.customize ["modifyvm", :id, "--memory", "1024"]
110
+
111
+ The above will run `VBoxManage modifyvm 1234 --memory 1024` where
112
+ "1234" is the ID of your current virtual machine. Anything you could
113
+ do before is certainly still possible with `VBoxManage` as well.
114
+ MESSAGE
115
+ end
72
116
 
73
- def has_multi_vms?
74
- !defined_vms.empty?
117
+ @customizations << command if command
75
118
  end
76
119
 
77
120
  def defined_vms
@@ -95,17 +138,19 @@ module Vagrant
95
138
  # Add the SubVM to the hash of defined VMs
96
139
  defined_vms[name] ||= SubVM.new
97
140
  defined_vms[name].options.merge!(options)
98
- defined_vms[name].push_proc(&block)
141
+ defined_vms[name].push_proc(&block) if block
99
142
  end
100
143
 
101
- def validate(errors)
144
+ def validate(env, errors)
102
145
  errors.add(I18n.t("vagrant.config.vm.box_missing")) if !box
103
- errors.add(I18n.t("vagrant.config.vm.box_not_found", :name => box)) if box && !box_url && !env.box
104
- errors.add(I18n.t("vagrant.config.vm.boot_mode_invalid")) if ![:vrdp, :gui].include?(boot_mode.to_sym)
105
- errors.add(I18n.t("vagrant.config.vm.base_mac_invalid")) if env.box && !base_mac
146
+ errors.add(I18n.t("vagrant.config.vm.box_not_found", :name => box)) if box && !box_url && !env.boxes.find(box)
147
+ errors.add(I18n.t("vagrant.config.vm.boot_mode_invalid")) if ![:headless, :gui].include?(boot_mode.to_sym)
148
+ errors.add(I18n.t("vagrant.config.vm.base_mac_invalid")) if env.boxes.find(box) && !base_mac
106
149
 
107
150
  shared_folders.each do |name, options|
108
- if !File.directory?(File.expand_path(options[:hostpath].to_s, env.root_path))
151
+ hostpath = Pathname.new(options[:hostpath]).expand_path(env.root_path)
152
+
153
+ if !hostpath.directory? && !options[:create]
109
154
  errors.add(I18n.t("vagrant.config.vm.shared_folder_hostpath_missing",
110
155
  :name => name,
111
156
  :path => options[:hostpath]))
@@ -119,28 +164,42 @@ module Vagrant
119
164
  end
120
165
 
121
166
  # Validate some basic networking
122
- network_options.each do |options|
123
- next if !options
124
-
125
- ip = options[:ip].split(".")
126
-
127
- if ip.length != 4
128
- errors.add(I18n.t("vagrant.config.vm.network_ip_invalid",
129
- :ip => options[:ip]))
130
- elsif ip.last == "1"
131
- errors.add(I18n.t("vagrant.config.vm.network_ip_ends_one",
132
- :ip => options[:ip]))
167
+ #
168
+ # TODO: One day we need to abstract this out, since in the future
169
+ # providers other than VirtualBox will not be able to satisfy
170
+ # all types of networks.
171
+ networks.each do |type, args|
172
+ if type == :hostonly && args[0] == :dhcp
173
+ # Valid. There is no real way this can be invalid at the moment.
174
+ elsif type == :hostonly
175
+ # Validate the host-only network
176
+ ip = args[0]
177
+ options = args[1] || {}
178
+
179
+ if !ip
180
+ errors.add(I18n.t("vagrant.config.vm.network_ip_required"))
181
+ else
182
+ ip_parts = ip.split(".")
183
+
184
+ if ip_parts.length != 4
185
+ errors.add(I18n.t("vagrant.config.vm.network_ip_invalid",
186
+ :ip => ip))
187
+ elsif ip_parts.last == "1"
188
+ errors.add(I18n.t("vagrant.config.vm.network_ip_ends_one",
189
+ :ip => ip))
190
+ end
191
+ end
192
+ elsif type == :bridged
193
+ else
194
+ # Invalid network type
195
+ errors.add(I18n.t("vagrant.config.vm.network_invalid",
196
+ :type => type.to_s))
133
197
  end
134
198
  end
135
199
 
136
200
  # Each provisioner can validate itself
137
201
  provisioners.each do |prov|
138
- # TODO: Remove at some point
139
- if prov.shortcut == :chef_server
140
- errors.add(I18n.t("vagrant.config.vm.provisioner_chef_server_changed"))
141
- else
142
- prov.validate(errors)
143
- end
202
+ prov.validate(env, errors)
144
203
  end
145
204
  end
146
205
  end
@@ -1,42 +1,38 @@
1
+ require 'log4r'
2
+
1
3
  module Vagrant
2
- class Config
4
+ module Config
3
5
  class VMConfig < Base
4
6
  # Represents a single configured provisioner for a VM.
5
7
  class Provisioner
6
- attr_reader :top
7
8
  attr_reader :shortcut
8
9
  attr_reader :provisioner
9
10
  attr_reader :config
10
11
 
11
- def initialize(top, shortcut, options=nil, &block)
12
- @top = top
12
+ def initialize(shortcut, options=nil, &block)
13
+ @logger = Log4r::Logger.new("vagrant::config::vm::provisioner")
14
+ @logger.debug("Provisioner config: #{shortcut}")
13
15
  @shortcut = shortcut
14
16
  @provisioner = shortcut
15
- @provisioner = Provisioners::Base.registered[shortcut] if shortcut.is_a?(Symbol)
17
+ @provisioner = Vagrant.provisioners.get(shortcut) if shortcut.is_a?(Symbol)
16
18
  @config = nil
17
19
 
18
- configure(options, &block)
20
+ @logger.info("Provisioner class: #{provisioner}")
21
+ configure(options, &block) if @provisioner
19
22
  end
20
23
 
21
24
  # Configures the provisioner if it can (if it is valid).
22
25
  def configure(options=nil, &block)
23
- # We don't want ancestors to be searched. This is the default in 1.8,
24
- # but not in 1.9, hence this hackery.
25
- const_args = ["Config"]
26
- const_args << false if RUBY_VERSION >= "1.9"
27
-
28
- # We assume that every provisioner has a `Config` class beneath
29
- # it for configuring.
30
- return if !@provisioner || !@provisioner.const_defined?(*const_args)
31
-
32
- # Instantiate the config class and configure it
33
- @config = @provisioner.const_get(*const_args).new
34
- @config.top = top
26
+ config_class = @provisioner.config_class
27
+ return if !config_class
28
+
29
+ @logger.debug("Configuring provisioner with: #{config_class}")
30
+ @config = config_class.new
35
31
  @config.set_options(options) if options
36
32
  block.call(@config) if block
37
33
  end
38
34
 
39
- def validate(errors)
35
+ def validate(env, errors)
40
36
  if !provisioner
41
37
  # If we don't have a provisioner then the whole thing is invalid.
42
38
  errors.add(I18n.t("vagrant.config.vm.provisioner_not_found", :shortcut => shortcut))
@@ -48,7 +44,7 @@ module Vagrant
48
44
  end
49
45
 
50
46
  # Pass on validation to the provisioner config
51
- config.validate(errors) if config
47
+ config.validate(env, errors) if config
52
48
  end
53
49
  end
54
50
  end
@@ -1,5 +1,5 @@
1
1
  module Vagrant
2
- class Config
2
+ module Config
3
3
  class VMConfig < Base
4
4
  # Represents a single sub-VM in a multi-VM environment.
5
5
  class SubVM
@@ -1,3 +1,7 @@
1
+ require 'pathname'
2
+
3
+ require 'log4r'
4
+
1
5
  module Vagrant
2
6
  # The Vagrant data store is a key-value store which is persisted
3
7
  # as JSON in a local file which is specified in the initializer.
@@ -16,19 +20,19 @@ module Vagrant
16
20
  attr_reader :file_path
17
21
 
18
22
  def initialize(file_path)
19
- @file_path = file_path
20
- return if !file_path
23
+ @logger = Log4r::Logger.new("vagrant::datastore")
24
+ @logger.info("Created: #{file_path}")
25
+
26
+ @file_path = Pathname.new(file_path)
21
27
 
22
- raise Errors::DotfileIsDirectory if File.directory?(file_path)
28
+ if @file_path.exist?
29
+ raise Errors::DotfileIsDirectory if @file_path.directory?
23
30
 
24
- if File.exist?(file_path)
25
- File.open(file_path, "r") do |f|
26
- begin
27
- merge!(JSON.parse(f.read))
28
- rescue JSON::ParserError
29
- # Ignore if the data is invalid in the file.
30
- # TODO: Log here.
31
- end
31
+ begin
32
+ merge!(JSON.parse(@file_path.read))
33
+ rescue JSON::ParserError
34
+ # Ignore if the data is invalid in the file.
35
+ @logger.error("Data store contained invalid JSON. Ignoring.")
32
36
  end
33
37
  end
34
38
  end
@@ -36,15 +40,19 @@ module Vagrant
36
40
  # Commits any changes to the data to disk. Even if the data
37
41
  # hasn't changed, it will be reserialized and written to disk.
38
42
  def commit
39
- return if !file_path
40
-
41
43
  clean_nil_and_empties
42
44
 
43
45
  if empty?
44
46
  # Delete the file since an empty data store is not useful
45
- File.delete(file_path) if File.file?(file_path)
47
+ @logger.info("Deleting data store since we're empty: #{@file_path}")
48
+ @file_path.delete if @file_path.exist?
46
49
  else
47
- File.open(file_path, "w") { |f| f.write(to_json) }
50
+ @logger.info("Committing data to data store: #{@file_path}")
51
+
52
+ @file_path.open("w") do |f|
53
+ f.write(to_json)
54
+ f.fsync
55
+ end
48
56
  end
49
57
  end
50
58