vagrantup 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 (325) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +77 -1
  3. data/Gemfile +0 -14
  4. data/LICENSE +1 -1
  5. data/bin/vagrant +47 -20
  6. data/config/default.rb +6 -14
  7. data/lib/vagrant/action/box/destroy.rb +7 -3
  8. data/lib/vagrant/action/box/download.rb +8 -8
  9. data/lib/vagrant/action/box/package.rb +2 -2
  10. data/lib/vagrant/action/box/unpackage.rb +13 -7
  11. data/lib/vagrant/action/box/verify.rb +5 -5
  12. data/lib/vagrant/action/builder.rb +23 -19
  13. data/lib/vagrant/action/builtin.rb +117 -79
  14. data/lib/vagrant/action/env/set.rb +7 -4
  15. data/lib/vagrant/action/environment.rb +3 -41
  16. data/lib/vagrant/action/general/package.rb +14 -29
  17. data/lib/vagrant/action/general/validate.rb +2 -2
  18. data/lib/vagrant/action/runner.rb +53 -0
  19. data/lib/vagrant/action/vm/boot.rb +9 -9
  20. data/lib/vagrant/action/vm/check_accessible.rb +2 -2
  21. data/lib/vagrant/action/vm/check_box.rb +10 -12
  22. data/lib/vagrant/action/vm/check_guest_additions.rb +8 -8
  23. data/lib/vagrant/action/vm/check_port_collisions.rb +85 -0
  24. data/lib/vagrant/action/vm/clean_machine_folder.rb +4 -4
  25. data/lib/vagrant/action/vm/clear_forwarded_ports.rb +3 -11
  26. data/lib/vagrant/action/vm/clear_network_interfaces.rb +31 -0
  27. data/lib/vagrant/action/vm/clear_shared_folders.rb +2 -11
  28. data/lib/vagrant/action/vm/customize.rb +19 -9
  29. data/lib/vagrant/action/vm/destroy.rb +4 -4
  30. data/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb +2 -12
  31. data/lib/vagrant/action/vm/discard_state.rb +4 -4
  32. data/lib/vagrant/action/vm/export.rb +13 -8
  33. data/lib/vagrant/action/vm/forward_ports.rb +55 -102
  34. data/lib/vagrant/action/vm/halt.rb +9 -6
  35. data/lib/vagrant/action/vm/host_name.rb +4 -4
  36. data/lib/vagrant/action/vm/import.rb +19 -10
  37. data/lib/vagrant/action/vm/match_mac_address.rb +4 -9
  38. data/lib/vagrant/action/vm/network.rb +300 -94
  39. data/lib/vagrant/action/vm/nfs.rb +41 -26
  40. data/lib/vagrant/action/vm/package.rb +1 -1
  41. data/lib/vagrant/action/vm/package_vagrantfile.rb +5 -2
  42. data/lib/vagrant/action/vm/provision.rb +42 -13
  43. data/lib/vagrant/action/vm/provisioner_cleanup.rb +2 -2
  44. data/lib/vagrant/action/vm/{clear_nfs_exports.rb → prune_nfs_exports.rb} +7 -7
  45. data/lib/vagrant/action/vm/resume.rb +4 -4
  46. data/lib/vagrant/action/vm/setup_package_files.rb +54 -0
  47. data/lib/vagrant/action/vm/share_folders.rb +63 -39
  48. data/lib/vagrant/action/vm/suspend.rb +4 -4
  49. data/lib/vagrant/action/warden.rb +13 -6
  50. data/lib/vagrant/action.rb +45 -123
  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/base.rb +135 -90
  55. data/lib/vagrant/command/box.rb +46 -21
  56. data/lib/vagrant/command/box_add.rb +33 -0
  57. data/lib/vagrant/command/box_list.rb +25 -0
  58. data/lib/vagrant/command/box_remove.rb +23 -0
  59. data/lib/vagrant/command/box_repackage.rb +23 -0
  60. data/lib/vagrant/command/destroy.rb +16 -5
  61. data/lib/vagrant/command/halt.rb +25 -7
  62. data/lib/vagrant/command/init.rb +30 -7
  63. data/lib/vagrant/command/package.rb +49 -18
  64. data/lib/vagrant/command/provision.rb +22 -9
  65. data/lib/vagrant/command/reload.rb +18 -5
  66. data/lib/vagrant/command/resume.rb +18 -5
  67. data/lib/vagrant/command/ssh.rb +69 -31
  68. data/lib/vagrant/command/ssh_config.rb +37 -22
  69. data/lib/vagrant/command/status.rb +22 -20
  70. data/lib/vagrant/command/suspend.rb +18 -5
  71. data/lib/vagrant/command/up.rb +41 -8
  72. data/lib/vagrant/command.rb +18 -20
  73. data/lib/vagrant/communication/base.rb +56 -0
  74. data/lib/vagrant/communication/ssh.rb +200 -0
  75. data/lib/vagrant/communication.rb +7 -0
  76. data/lib/vagrant/config/base.rb +18 -26
  77. data/lib/vagrant/config/container.rb +37 -0
  78. data/lib/vagrant/config/error_recorder.rb +1 -1
  79. data/lib/vagrant/config/loader.rb +125 -0
  80. data/lib/vagrant/config/nfs.rb +1 -3
  81. data/lib/vagrant/config/package.rb +1 -3
  82. data/lib/vagrant/config/ssh.rb +31 -16
  83. data/lib/vagrant/config/top.rb +36 -25
  84. data/lib/vagrant/config/vagrant.rb +2 -5
  85. data/lib/vagrant/config/vm/provisioner.rb +16 -20
  86. data/lib/vagrant/config/vm/sub_vm.rb +1 -1
  87. data/lib/vagrant/config/vm.rb +115 -56
  88. data/lib/vagrant/config.rb +29 -103
  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/virtualbox.rb +121 -0
  94. data/lib/vagrant/driver/virtualbox_4_0.rb +411 -0
  95. data/lib/vagrant/driver/virtualbox_4_1.rb +411 -0
  96. data/lib/vagrant/driver/virtualbox_base.rb +284 -0
  97. data/lib/vagrant/driver.rb +7 -0
  98. data/lib/vagrant/environment.rb +221 -240
  99. data/lib/vagrant/errors.rb +74 -25
  100. data/lib/vagrant/guest/arch.rb +48 -0
  101. data/lib/vagrant/{systems → guest}/base.rb +30 -18
  102. data/lib/vagrant/guest/debian.rb +61 -0
  103. data/lib/vagrant/{systems → guest}/freebsd.rb +11 -18
  104. data/lib/vagrant/guest/gentoo.rb +32 -0
  105. data/lib/vagrant/{systems → guest}/linux/config.rb +2 -4
  106. data/lib/vagrant/guest/linux/error.rb +9 -0
  107. data/lib/vagrant/guest/linux.rb +78 -0
  108. data/lib/vagrant/guest/redhat.rb +66 -0
  109. data/lib/vagrant/guest/solaris.rb +114 -0
  110. data/lib/vagrant/{systems → guest}/suse.rb +2 -2
  111. data/lib/vagrant/guest/ubuntu.rb +23 -0
  112. data/lib/vagrant/guest.rb +16 -0
  113. data/lib/vagrant/hosts/arch.rb +7 -3
  114. data/lib/vagrant/hosts/base.rb +36 -46
  115. data/lib/vagrant/hosts/bsd.rb +53 -16
  116. data/lib/vagrant/hosts/fedora.rb +14 -0
  117. data/lib/vagrant/hosts/freebsd.rb +6 -36
  118. data/lib/vagrant/hosts/linux.rb +45 -20
  119. data/lib/vagrant/hosts/windows.rb +16 -0
  120. data/lib/vagrant/hosts.rb +23 -6
  121. data/lib/vagrant/provisioners/base.rb +11 -34
  122. data/lib/vagrant/provisioners/chef.rb +30 -26
  123. data/lib/vagrant/provisioners/chef_client.rb +37 -23
  124. data/lib/vagrant/provisioners/chef_solo.rb +61 -16
  125. data/lib/vagrant/provisioners/puppet.rb +70 -38
  126. data/lib/vagrant/provisioners/puppet_server.rb +12 -13
  127. data/lib/vagrant/provisioners/shell.rb +24 -24
  128. data/lib/vagrant/provisioners.rb +10 -7
  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/lib/vagrant.rb +132 -5
  140. data/tasks/acceptance.rake +3 -3
  141. data/tasks/test.rake +7 -2
  142. data/templates/commands/init/Vagrantfile.erb +11 -4
  143. data/templates/{ssh_config.erb → commands/ssh_config/config.erb} +0 -0
  144. data/templates/guests/arch/network_dhcp.erb +7 -0
  145. data/templates/guests/arch/network_static.erb +7 -0
  146. data/templates/guests/debian/network_dhcp.erb +6 -0
  147. data/templates/guests/debian/network_static.erb +7 -0
  148. data/templates/guests/gentoo/network_dhcp.erb +4 -0
  149. data/templates/guests/gentoo/network_static.erb +4 -0
  150. data/templates/guests/redhat/network_dhcp.erb +6 -0
  151. data/templates/guests/redhat/network_static.erb +7 -0
  152. data/templates/locales/en.yml +241 -122
  153. data/templates/{chef_server_client.erb → provisioners/chef_client/client.erb} +0 -0
  154. data/templates/{chef_solo_solo.erb → provisioners/chef_solo/solo.erb} +0 -0
  155. data/test/acceptance/base.rb +10 -10
  156. data/test/acceptance/box_test.rb +28 -6
  157. data/test/acceptance/destroy_test.rb +1 -1
  158. data/test/acceptance/halt_test.rb +4 -4
  159. data/test/acceptance/init_test.rb +3 -3
  160. data/test/acceptance/networking/host_only_test.rb +37 -0
  161. data/test/acceptance/networking/port_forward_test.rb +125 -0
  162. data/test/acceptance/package_test.rb +46 -0
  163. data/test/acceptance/provisioning/basic_test.rb +61 -0
  164. data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
  165. data/test/acceptance/provisioning/shell_test.rb +53 -0
  166. data/test/acceptance/resume_test.rb +1 -1
  167. data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
  168. data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
  169. data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
  170. data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
  171. data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
  172. data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
  173. data/test/acceptance/ssh_test.rb +7 -2
  174. data/test/acceptance/support/config.rb +1 -1
  175. data/test/acceptance/support/isolated_environment.rb +41 -150
  176. data/test/acceptance/support/matchers/match_output.rb +1 -1
  177. data/test/acceptance/support/matchers/succeed.rb +14 -0
  178. data/test/acceptance/support/network_tests.rb +29 -0
  179. data/test/acceptance/support/output.rb +9 -1
  180. data/test/acceptance/support/shared/base_context.rb +16 -9
  181. data/test/acceptance/support/shared/command_examples.rb +4 -4
  182. data/test/acceptance/suspend_test.rb +1 -1
  183. data/test/acceptance/up_basic_test.rb +26 -7
  184. data/test/acceptance/up_with_box_url.rb +1 -1
  185. data/test/acceptance/vagrant_test.rb +1 -1
  186. data/test/acceptance/version_test.rb +0 -5
  187. data/test/support/isolated_environment.rb +46 -0
  188. data/test/{acceptance/support → support}/tempdir.rb +0 -0
  189. data/test/unit/base.rb +21 -0
  190. data/test/unit/support/isolated_environment.rb +39 -0
  191. data/test/unit/support/shared/base_context.rb +30 -0
  192. data/test/unit/vagrant/action/builder_test.rb +126 -177
  193. data/test/unit/vagrant/action/environment_test.rb +10 -21
  194. data/test/unit/vagrant/action/runner_test.rb +65 -0
  195. data/test/unit/vagrant/action/warden_test.rb +64 -97
  196. data/test/unit/vagrant/box_collection_test.rb +44 -33
  197. data/test/unit/vagrant/box_test.rb +25 -65
  198. data/test/unit/vagrant/command/base_test.rb +141 -14
  199. data/test/unit/vagrant/config/base_test.rb +16 -43
  200. data/test/unit/vagrant/config/loader_test.rb +79 -0
  201. data/test/unit/vagrant/config/top_test.rb +69 -0
  202. data/test/unit/vagrant/config/vm_test.rb +62 -47
  203. data/test/unit/vagrant/config_test.rb +16 -151
  204. data/test/unit/vagrant/data_store_test.rb +43 -61
  205. data/test/unit/vagrant/downloaders/base_test.rb +12 -22
  206. data/test/unit/vagrant/downloaders/file_test.rb +58 -31
  207. data/test/unit/vagrant/downloaders/http_test.rb +12 -86
  208. data/test/unit/vagrant/environment_test.rb +107 -536
  209. data/test/unit/vagrant/hosts_test.rb +36 -0
  210. data/test/unit/vagrant/registry_test.rb +56 -0
  211. data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
  212. data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +23 -24
  213. data/test/unit/vagrant/util/network_ip_test.rb +17 -0
  214. data/test/unit/vagrant/util/retryable_test.rb +90 -34
  215. data/test/unit/vagrant_test.rb +27 -0
  216. data/test/{unit → unit_legacy}/locales/en.yml +0 -0
  217. data/test/{unit → unit_legacy}/test_helper.rb +0 -0
  218. data/test/{unit → unit_legacy}/vagrant/action/box/destroy_test.rb +0 -0
  219. data/test/{unit → unit_legacy}/vagrant/action/box/download_test.rb +0 -0
  220. data/test/{unit → unit_legacy}/vagrant/action/box/package_test.rb +0 -0
  221. data/test/{unit → unit_legacy}/vagrant/action/box/unpackage_test.rb +0 -0
  222. data/test/{unit → unit_legacy}/vagrant/action/box/verify_test.rb +0 -0
  223. data/test/{unit → unit_legacy}/vagrant/action/env/set_test.rb +0 -0
  224. data/test/{unit → unit_legacy}/vagrant/action/general/package_test.rb +0 -0
  225. data/test/{unit → unit_legacy}/vagrant/action/general/validate_test.rb +0 -0
  226. data/test/{unit → unit_legacy}/vagrant/action/vm/boot_test.rb +0 -0
  227. data/test/{unit → unit_legacy}/vagrant/action/vm/check_accessible_test.rb +0 -0
  228. data/test/{unit → unit_legacy}/vagrant/action/vm/check_box_test.rb +0 -0
  229. data/test/{unit → unit_legacy}/vagrant/action/vm/check_guest_additions_test.rb +0 -0
  230. data/test/{unit → unit_legacy}/vagrant/action/vm/clean_machine_folder_test.rb +0 -0
  231. data/test/{unit → unit_legacy}/vagrant/action/vm/clear_forwarded_ports_test.rb +0 -0
  232. data/test/{unit → unit_legacy}/vagrant/action/vm/clear_nfs_exports_test.rb +0 -0
  233. data/test/{unit → unit_legacy}/vagrant/action/vm/clear_shared_folders_test.rb +0 -0
  234. data/test/{unit → unit_legacy}/vagrant/action/vm/customize_test.rb +0 -0
  235. data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_test.rb +0 -0
  236. data/test/{unit → unit_legacy}/vagrant/action/vm/destroy_unused_network_interfaces_test.rb +0 -0
  237. data/test/{unit → unit_legacy}/vagrant/action/vm/discard_state_test.rb +0 -0
  238. data/test/{unit → unit_legacy}/vagrant/action/vm/export_test.rb +0 -0
  239. data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_helpers_test.rb +0 -0
  240. data/test/{unit → unit_legacy}/vagrant/action/vm/forward_ports_test.rb +0 -0
  241. data/test/{unit → unit_legacy}/vagrant/action/vm/halt_test.rb +0 -0
  242. data/test/{unit → unit_legacy}/vagrant/action/vm/host_name_test.rb +0 -0
  243. data/test/{unit → unit_legacy}/vagrant/action/vm/import_test.rb +0 -0
  244. data/test/{unit → unit_legacy}/vagrant/action/vm/match_mac_address_test.rb +0 -0
  245. data/test/{unit → unit_legacy}/vagrant/action/vm/modify_test.rb +0 -0
  246. data/test/{unit → unit_legacy}/vagrant/action/vm/network_test.rb +0 -0
  247. data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_helpers_test.rb +0 -0
  248. data/test/{unit → unit_legacy}/vagrant/action/vm/nfs_test.rb +0 -0
  249. data/test/{unit → unit_legacy}/vagrant/action/vm/package_test.rb +0 -0
  250. data/test/{unit → unit_legacy}/vagrant/action/vm/package_vagrantfile_test.rb +0 -0
  251. data/test/{unit → unit_legacy}/vagrant/action/vm/provision_test.rb +0 -0
  252. data/test/{unit → unit_legacy}/vagrant/action/vm/provisioner_cleanup_test.rb +0 -0
  253. data/test/{unit → unit_legacy}/vagrant/action/vm/resume_test.rb +0 -0
  254. data/test/{unit → unit_legacy}/vagrant/action/vm/share_folders_test.rb +0 -0
  255. data/test/{unit → unit_legacy}/vagrant/action/vm/suspend_test.rb +0 -0
  256. data/test/{unit → unit_legacy}/vagrant/action_test.rb +0 -0
  257. data/test/unit_legacy/vagrant/box_collection_test.rb +45 -0
  258. data/test/unit_legacy/vagrant/box_test.rb +74 -0
  259. data/test/{unit → unit_legacy}/vagrant/cli_test.rb +0 -0
  260. data/test/unit_legacy/vagrant/command/base_test.rb +23 -0
  261. data/test/{unit → unit_legacy}/vagrant/command/group_base_test.rb +0 -0
  262. data/test/{unit → unit_legacy}/vagrant/command/helpers_test.rb +0 -0
  263. data/test/{unit → unit_legacy}/vagrant/command/init_test.rb +0 -0
  264. data/test/{unit → unit_legacy}/vagrant/command/package_test.rb +0 -0
  265. data/test/unit_legacy/vagrant/config/base_test.rb +52 -0
  266. data/test/{unit → unit_legacy}/vagrant/config/error_recorder_test.rb +0 -0
  267. data/test/{unit → unit_legacy}/vagrant/config/ssh_test.rb +0 -0
  268. data/test/{unit → unit_legacy}/vagrant/config/vagrant_test.rb +0 -0
  269. data/test/{unit → unit_legacy}/vagrant/config/vm/provisioner_test.rb +0 -0
  270. data/test/unit_legacy/vagrant/config/vm_test.rb +47 -0
  271. data/test/unit_legacy/vagrant/config_test.rb +148 -0
  272. data/test/unit_legacy/vagrant/downloaders/http_test.rb +93 -0
  273. data/test/unit_legacy/vagrant/environment_test.rb +539 -0
  274. data/test/{unit → unit_legacy}/vagrant/errors_test.rb +0 -0
  275. data/test/{unit → unit_legacy}/vagrant/hosts/base_test.rb +0 -0
  276. data/test/{unit → unit_legacy}/vagrant/hosts/bsd_test.rb +0 -0
  277. data/test/{unit → unit_legacy}/vagrant/hosts/linux_test.rb +0 -0
  278. data/test/{unit → unit_legacy}/vagrant/plugin_test.rb +0 -0
  279. data/test/{unit → unit_legacy}/vagrant/provisioners/base_test.rb +0 -0
  280. data/test/{unit → unit_legacy}/vagrant/provisioners/chef_client_test.rb +0 -0
  281. data/test/{unit → unit_legacy}/vagrant/provisioners/chef_solo_test.rb +0 -0
  282. data/test/{unit → unit_legacy}/vagrant/provisioners/chef_test.rb +0 -0
  283. data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_server_test.rb +0 -0
  284. data/test/{unit → unit_legacy}/vagrant/provisioners/puppet_test.rb +0 -0
  285. data/test/{unit → unit_legacy}/vagrant/provisioners/shell_test.rb +0 -0
  286. data/test/{unit → unit_legacy}/vagrant/ssh/session_test.rb +0 -0
  287. data/test/{unit → unit_legacy}/vagrant/ssh_test.rb +0 -0
  288. data/test/{unit → unit_legacy}/vagrant/systems/base_test.rb +0 -0
  289. data/test/{unit → unit_legacy}/vagrant/systems/linux_test.rb +0 -0
  290. data/test/{unit → unit_legacy}/vagrant/util/busy_test.rb +0 -0
  291. data/test/{unit → unit_legacy}/vagrant/util/counter_test.rb +0 -0
  292. data/test/{unit → unit_legacy}/vagrant/util/platform_test.rb +0 -0
  293. data/test/{unit → unit_legacy}/vagrant/util/stacked_proc_runner_test.rb +0 -0
  294. data/test/{unit → unit_legacy}/vagrant/util/template_renderer_test.rb +0 -0
  295. data/test/{unit → unit_legacy}/vagrant/vm_test.rb +0 -0
  296. data/vagrant.gemspec +7 -9
  297. metadata +183 -179
  298. data/keys/vagrant.ppk +0 -26
  299. data/lib/vagrant/action/box.rb +0 -11
  300. data/lib/vagrant/action/env.rb +0 -7
  301. data/lib/vagrant/action/general.rb +0 -8
  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/action/vm.rb +0 -34
  306. data/lib/vagrant/command/group_base.rb +0 -107
  307. data/lib/vagrant/command/helpers.rb +0 -33
  308. data/lib/vagrant/command/named_base.rb +0 -14
  309. data/lib/vagrant/command/upgrade_to_060.rb +0 -45
  310. data/lib/vagrant/command/version.rb +0 -13
  311. data/lib/vagrant/ssh/session.rb +0 -136
  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/error.rb +0 -9
  316. data/lib/vagrant/systems/linux.rb +0 -82
  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/lib/vagrant/systems.rb +0 -13
  321. data/templates/network_entry_arch.erb +0 -9
  322. data/templates/network_entry_debian.erb +0 -8
  323. data/templates/network_entry_gentoo.erb +0 -5
  324. data/templates/network_entry_redhat.erb +0 -9
  325. data/test/unit/vagrant/ui_test.rb +0 -29
@@ -1,16 +1,49 @@
1
+ require 'optparse'
2
+
1
3
  module Vagrant
2
4
  module Command
3
- class UpCommand < NamedBase
4
- class_option :provision, :type => :boolean, :default => true
5
- register "up", "Creates the Vagrant environment"
6
-
5
+ class Up < Base
7
6
  def execute
8
- target_vms.each do |vm|
7
+ options = {
8
+ :provision => true,
9
+ :provisioners => nil
10
+ }
11
+
12
+ opts = OptionParser.new do |opts|
13
+ opts.banner = "Usage: vagrant up [vm-name] [--[no-]provision] [-h]"
14
+
15
+ opts.separator ""
16
+
17
+ opts.on("--[no-]provision", "Enable or disable provisioning") do |p|
18
+ options[:provision] = p
19
+ end
20
+
21
+ opts.on("--provision-with x,y,z", Array,
22
+ "Enable only certain provisioners, by type.") do |list|
23
+ options[:provisioners] = list
24
+ end
25
+ end
26
+
27
+ # Parse the options
28
+ argv = parse_options(opts)
29
+ return if !argv
30
+
31
+ # Parameters to send to actions
32
+ action_params = {
33
+ "provision.enabled" => options[:provision],
34
+ "provision.types" => options[:provisioners]
35
+ }
36
+
37
+ # Go over each VM and bring it up
38
+ @logger.debug("'Up' each target VM...")
39
+ with_target_vms(argv[0]) do |vm|
9
40
  if vm.created?
10
- vm.env.ui.info I18n.t("vagrant.commands.up.vm_created")
11
- vm.start("provision.enabled" => options[:provision])
41
+ @logger.info("Booting: #{vm.name}")
42
+ vm.ui.info I18n.t("vagrant.commands.up.vm_created")
43
+ vm.start(action_params)
12
44
  else
13
- vm.up("provision.enabled" => options[:provision])
45
+ @logger.info("Creating: #{vm.name}")
46
+ vm.up(action_params)
14
47
  end
15
48
  end
16
49
  end
@@ -1,25 +1,23 @@
1
1
  module Vagrant
2
2
  module Command
3
3
  autoload :Base, 'vagrant/command/base'
4
- autoload :GroupBase, 'vagrant/command/group_base'
5
- autoload :Helpers, 'vagrant/command/helpers'
6
- autoload :NamedBase, 'vagrant/command/named_base'
4
+
5
+ autoload :Box, 'vagrant/command/box'
6
+ autoload :BoxAdd, 'vagrant/command/box_add'
7
+ autoload :BoxRemove, 'vagrant/command/box_remove'
8
+ autoload :BoxRepackage, 'vagrant/command/box_repackage'
9
+ autoload :BoxList, 'vagrant/command/box_list'
10
+ autoload :Destroy, 'vagrant/command/destroy'
11
+ autoload :Halt, 'vagrant/command/halt'
12
+ autoload :Init, 'vagrant/command/init'
13
+ autoload :Package, 'vagrant/command/package'
14
+ autoload :Provision, 'vagrant/command/provision'
15
+ autoload :Reload, 'vagrant/command/reload'
16
+ autoload :Resume, 'vagrant/command/resume'
17
+ autoload :SSH, 'vagrant/command/ssh'
18
+ autoload :SSHConfig, 'vagrant/command/ssh_config'
19
+ autoload :Status, 'vagrant/command/status'
20
+ autoload :Suspend, 'vagrant/command/suspend'
21
+ autoload :Up, 'vagrant/command/up'
7
22
  end
8
23
  end
9
-
10
- # The built-in commands must always be loaded
11
- require 'vagrant/command/box'
12
- require 'vagrant/command/destroy'
13
- require 'vagrant/command/halt'
14
- require 'vagrant/command/init'
15
- require 'vagrant/command/package'
16
- require 'vagrant/command/provision'
17
- require 'vagrant/command/reload'
18
- require 'vagrant/command/resume'
19
- require 'vagrant/command/ssh'
20
- require 'vagrant/command/ssh_config'
21
- require 'vagrant/command/status'
22
- require 'vagrant/command/suspend'
23
- require 'vagrant/command/up'
24
- require 'vagrant/command/upgrade_to_060'
25
- require 'vagrant/command/version'
@@ -0,0 +1,56 @@
1
+ module Vagrant
2
+ module Communication
3
+ # The base class for any classes that provide an API for communicating
4
+ # with the virtual machine.
5
+ #
6
+ # There are various stages that require Vagrant to copy files or
7
+ # run commands on the target system, and communication classes provide
8
+ # the abstraction necessary to perform these tasks, via SSH or some
9
+ # other mechanism.
10
+ #
11
+ # Any subclasses of this class **must** implement all of the methods
12
+ # below.
13
+ class Base
14
+ # Checks if the target machine is ready for communication.
15
+ #
16
+ # @return [Boolean]
17
+ def ready?
18
+ end
19
+
20
+ # Upload a file to the virtual machine.
21
+ #
22
+ # @param [String] from Path to a file to upload.
23
+ # @param [String] to Path to where to save this file.
24
+ def upload(from, to)
25
+ end
26
+
27
+ # Execute a command on the remote machine.
28
+ #
29
+ # @param [String] command Command to execute.
30
+ # @yield [type, data] Realtime output of the command being executed.
31
+ # @yieldparam [String] type Type of the output, `:stdout`, `:stderr`, etc.
32
+ # @yieldparam [String] data Data for the given output.
33
+ # @return [Integer] Exit code of the command.
34
+ def execute(command, opts=nil)
35
+ end
36
+
37
+ # Execute a comand with super user privileges.
38
+ #
39
+ # See #execute for parameter information.
40
+ def sudo(command, opts=nil)
41
+ end
42
+
43
+ # Executes a command and returns a boolean statement if it was successful
44
+ # or not.
45
+ #
46
+ # This is implemented by default as expecting `execute` to return 0.
47
+ def test(command, opts=nil)
48
+ # Disable error checking no matter what
49
+ opts = (opts || {}).merge(:error_check => false)
50
+
51
+ # Successful if the exit status is 0
52
+ execute(command, opts) == 0
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,200 @@
1
+ require 'timeout'
2
+
3
+ require 'log4r'
4
+ require 'net/ssh'
5
+ require 'net/scp'
6
+
7
+ require 'vagrant/util/file_mode'
8
+ require 'vagrant/util/platform'
9
+ require 'vagrant/util/retryable'
10
+
11
+ module Vagrant
12
+ module Communication
13
+ # Provides communication with the VM via SSH.
14
+ class SSH < Base
15
+ include Util::Retryable
16
+
17
+ def initialize(vm)
18
+ @vm = vm
19
+ @logger = Log4r::Logger.new("vagrant::communication::ssh")
20
+ @connection = nil
21
+ end
22
+
23
+ def ready?
24
+ @logger.debug("Checking whether SSH is ready...")
25
+
26
+ Timeout.timeout(@vm.config.ssh.timeout) do
27
+ connect
28
+ end
29
+
30
+ # If we reached this point then we successfully connected
31
+ @logger.info("SSH is ready!")
32
+ true
33
+ rescue Timeout::Error, Errors::SSHConnectionRefused, Net::SSH::Disconnect => e
34
+ # The above errors represent various reasons that SSH may not be
35
+ # ready yet. Return false.
36
+ @logger.info("SSH not up: #{e.inspect}")
37
+ return false
38
+ end
39
+
40
+ def execute(command, opts=nil, &block)
41
+ opts = {
42
+ :error_check => true,
43
+ :error_class => Errors::VagrantError,
44
+ :error_key => :ssh_bad_exit_status,
45
+ :command => command,
46
+ :sudo => false
47
+ }.merge(opts || {})
48
+
49
+ # Connect via SSH and execute the command in the shell.
50
+ exit_status = connect do |connection|
51
+ shell_execute(connection, command, opts[:sudo], &block)
52
+ end
53
+
54
+ # Check for any errors
55
+ if opts[:error_check] && exit_status != 0
56
+ # The error classes expect the translation key to be _key,
57
+ # but that makes for an ugly configuration parameter, so we
58
+ # set it here from `error_key`
59
+ error_opts = opts.merge(:_key => opts[:error_key])
60
+ raise opts[:error_class], error_opts
61
+ end
62
+
63
+ # Return the exit status
64
+ exit_status
65
+ end
66
+
67
+ def sudo(command, opts=nil, &block)
68
+ # Run `execute` but with the `sudo` option.
69
+ opts = { :sudo => true }.merge(opts || {})
70
+ execute(command, opts, &block)
71
+ end
72
+
73
+ def upload(from, to)
74
+ # Do an SCP-based upload...
75
+ connect do |connection|
76
+ scp = Net::SCP.new(connection)
77
+ scp.upload!(from, to)
78
+ end
79
+ rescue Net::SCP::Error => e
80
+ # If we get the exit code of 127, then this means SCP is unavailable.
81
+ raise Errors::SCPUnavailable if e.message =~ /\(127\)/
82
+
83
+ # Otherwise, just raise the error up
84
+ raise
85
+ end
86
+
87
+ protected
88
+
89
+ # Opens an SSH connection and yields it to a block.
90
+ def connect
91
+ if @connection && !@connection.closed?
92
+ # There is a chance that the socket is closed despite us checking
93
+ # 'closed?' above. To test this we need to send data through the
94
+ # socket.
95
+ begin
96
+ @connection.exec!("")
97
+ rescue IOError
98
+ @logger.info("Connection has been closed. Not re-using.")
99
+ @connection = nil
100
+ end
101
+
102
+ # If the @connection is still around, then it is valid,
103
+ # and we use it.
104
+ if @connection
105
+ @logger.info("Re-using SSH connection.")
106
+ return yield @connection if block_given?
107
+ return
108
+ end
109
+ end
110
+
111
+ ssh_info = @vm.ssh.info
112
+
113
+ # Build the options we'll use to initiate the connection via Net::SSH
114
+ opts = {
115
+ :port => ssh_info[:port],
116
+ :keys => [ssh_info[:private_key_path]],
117
+ :keys_only => true,
118
+ :user_known_hosts_file => [],
119
+ :paranoid => false,
120
+ :config => false,
121
+ :forward_agent => ssh_info[:forward_agent]
122
+ }
123
+
124
+ # Check that the private key permissions are valid
125
+ @vm.ssh.check_key_permissions(ssh_info[:private_key_path])
126
+
127
+ # Connect to SSH, giving it a few tries
128
+ @logger.info("Connecting to SSH: #{ssh_info[:host]}:#{ssh_info[:port]}")
129
+ exceptions = [Errno::ECONNREFUSED, Net::SSH::Disconnect]
130
+ connection = retryable(:tries => @vm.config.ssh.max_tries, :on => exceptions) do
131
+ Net::SSH.start(ssh_info[:host], ssh_info[:username], opts)
132
+ end
133
+
134
+ @connection = connection
135
+
136
+ # This is hacky but actually helps with some issues where
137
+ # Net::SSH is simply not robust enough to handle... see
138
+ # issue #391, #455, etc.
139
+ sleep 4
140
+
141
+ # Yield the connection that is ready to be used and
142
+ # return the value of the block
143
+ return yield connection if block_given?
144
+ rescue Net::SSH::AuthenticationFailed
145
+ # This happens if authentication failed. We wrap the error in our
146
+ # own exception.
147
+ raise Errors::SSHAuthenticationFailed
148
+ rescue Errno::ECONNREFUSED
149
+ # This is raised if we failed to connect the max amount of times
150
+ raise Errors::SSHConnectionRefused
151
+ ensure
152
+ # Be sure the connection is always closed
153
+ # connection.close if connection && !connection.closed?
154
+ end
155
+
156
+ # Executes the command on an SSH connection within a login shell.
157
+ def shell_execute(connection, command, sudo=false)
158
+ exit_status = nil
159
+
160
+ # Determine the shell to execute. If we are using `sudo` then we
161
+ # need to wrap the shell in a `sudo` call.
162
+ shell = "#{@vm.config.ssh.shell} -l"
163
+ shell = "sudo -H #{shell}" if sudo
164
+
165
+ # Open the channel so we can execute or command
166
+ channel = connection.open_channel do |ch|
167
+ ch.exec(shell) do |ch2, _|
168
+ # Setup the channel callbacks so we can get data and exit status
169
+ ch2.on_data do |ch3, data|
170
+ yield :stdout, data if block_given?
171
+ end
172
+
173
+ ch2.on_extended_data do |ch3, type, data|
174
+ yield :stderr, data if block_given?
175
+ end
176
+
177
+ ch2.on_request("exit-status") do |ch3, data|
178
+ exit_status = data.read_long
179
+ end
180
+
181
+ # Set the terminal
182
+ ch2.send_data "export TERM=vt100\n"
183
+
184
+ # Output the command
185
+ ch2.send_data "#{command}\n"
186
+
187
+ # Remember to exit or this channel will hang open
188
+ ch2.send_data "exit\n"
189
+ end
190
+ end
191
+
192
+ # Wait for the channel to complete
193
+ channel.wait
194
+
195
+ # Return the final exit status
196
+ return exit_status
197
+ end
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,7 @@
1
+ module Vagrant
2
+ module Communication
3
+ autoload :Base, 'vagrant/communication/base'
4
+
5
+ autoload :SSH, 'vagrant/communication/ssh'
6
+ end
7
+ end
@@ -1,22 +1,9 @@
1
1
  module Vagrant
2
- class Config
2
+ module Config
3
3
  # The base class for all configuration classes. This implements
4
4
  # basic things such as the environment instance variable which all
5
5
  # config classes need as well as a basic `to_json` implementation.
6
6
  class Base
7
- # {Top} of this configuration stack
8
- attr_accessor :top
9
-
10
- # Registers a subclass with the Vagrant configuration system so
11
- # that it can then be used in Vagrantfiles.
12
- #
13
- # @param [Symbol] accessor The accessor on the main config object
14
- # that is used to access the configuration class.
15
- #
16
- def self.configures(accessor, klass=self)
17
- Top.configures(accessor, klass)
18
- end
19
-
20
7
  # Loads configuration values from JSON back into the proper
21
8
  # configuration classes. By default, this is done by simply
22
9
  # iterating over all values in the JSON hash and assigning them
@@ -29,14 +16,6 @@ module Vagrant
29
16
  end
30
17
  end
31
18
 
32
- # A helper to access the environment that this configuration is for.
33
- # This is obtained by getting the env from the {Top}.
34
- #
35
- # @return [Vagrant::Envrionment]
36
- def env
37
- top.env
38
- end
39
-
40
19
  # Allows setting options from a hash. By default this simply calls
41
20
  # the `#{key}=` method on the config class with the value, which is
42
21
  # the expected behavior most of the time.
@@ -46,12 +25,26 @@ module Vagrant
46
25
  end
47
26
  end
48
27
 
28
+ # Merge another configuration object into this one.
29
+ #
30
+ # @param [Object] other The other configuration object to merge from,
31
+ # this must be the same type of object as this one.
32
+ # @return [Object] The merged object.
33
+ def merge(other)
34
+ result = self.class.new
35
+ instance_variables_hash.merge(other.instance_variables_hash).each do |key, value|
36
+ result.instance_variable_set("@#{key}".to_sym, value)
37
+ end
38
+
39
+ result
40
+ end
41
+
49
42
  # Called by {Top} after the configuration is loaded to validate
50
43
  # the configuaration objects. Subclasses should implement this
51
44
  # method and add any errors to the `errors` object given.
52
45
  #
53
46
  # @param [ErrorRecorder] errors
54
- def validate(errors); end
47
+ def validate(env, errors); end
55
48
 
56
49
  # Converts the configuration to a raw hash by calling `#to_hash`
57
50
  # on all instance variables (if it can) and putting them into
@@ -69,14 +62,13 @@ module Vagrant
69
62
  # the JSON is parsed back, it can be loaded back into the proper class.
70
63
  # See {json_create}.
71
64
  def to_json(*a)
72
- result = { 'json_class' => self.class.name }
73
- result.merge(instance_variables_hash).to_json(*a)
65
+ instance_variables_hash.to_json(*a)
74
66
  end
75
67
 
76
68
  # Returns the instance variables as a hash of key-value pairs.
77
69
  def instance_variables_hash
78
70
  instance_variables.inject({}) do |acc, iv|
79
- acc[iv.to_s[1..-1]] = instance_variable_get(iv) unless [:@env, :@top].include?(iv.to_sym)
71
+ acc[iv.to_s[1..-1]] = instance_variable_get(iv)
80
72
  acc
81
73
  end
82
74
  end
@@ -0,0 +1,37 @@
1
+ module Vagrant
2
+ module Config
3
+ # Contains loaded configuration values and provides access to those
4
+ # values.
5
+ #
6
+ # This is the class returned when loading configuration and stores
7
+ # the completely loaded configuration values. This class is meant to
8
+ # be immutable.
9
+ class Container
10
+ attr_reader :global
11
+ attr_reader :vms
12
+
13
+ # Initializes the configuration container.
14
+ #
15
+ # @param [Top] global Top-level configuration for the global
16
+ # applicatoin.
17
+ # @param [Array] vms Array of VM configurations.
18
+ def initialize(global, vms)
19
+ @global = global
20
+ @vms = []
21
+ @vm_configs = {}
22
+
23
+ vms.each do |vm_config|
24
+ @vms << vm_config.vm.name
25
+ @vm_configs[vm_config.vm.name] = vm_config
26
+ end
27
+ end
28
+
29
+ # This returns the configuration for a specific virtual machine.
30
+ # The values for this configuration are usually pertinent to a
31
+ # single virtual machine and do not affect the system globally.
32
+ def for_vm(name)
33
+ @vm_configs[name]
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,5 +1,5 @@
1
1
  module Vagrant
2
- class Config
2
+ module Config
3
3
  # A class which is passed into the various {Base#validate} methods and
4
4
  # can be used as a helper to add error messages about a single config
5
5
  # class.
@@ -0,0 +1,125 @@
1
+ require "pathname"
2
+
3
+ require "log4r"
4
+
5
+ module Vagrant
6
+ module Config
7
+ # This class is responsible for loading Vagrant configuration,
8
+ # usually in the form of Vagrantfiles.
9
+ #
10
+ # Loading works by specifying the sources for the configuration
11
+ # as well as the order the sources should be loaded. Configuration
12
+ # set later always overrides those set earlier; this is how
13
+ # configuration "scoping" is implemented.
14
+ class Loader
15
+ # This is an array of symbols specifying the order in which
16
+ # configuration is loaded. For examples, see the class documentation.
17
+ attr_accessor :load_order
18
+
19
+ def initialize
20
+ @logger = Log4r::Logger.new("vagrant::config::loader")
21
+ @sources = {}
22
+ @proc_cache = {}
23
+ @config_cache = {}
24
+ end
25
+
26
+ # Set the configuration data for the given name.
27
+ #
28
+ # The `name` should be a symbol and must uniquely identify the data
29
+ # being given.
30
+ #
31
+ # `data` can either be a path to a Ruby Vagrantfile or a `Proc` directly.
32
+ # `data` can also be an array of such values.
33
+ #
34
+ # At this point, no configuration is actually loaded. Note that calling
35
+ # `set` multiple times with the same name will override any previously
36
+ # set values. In this way, the last set data for a given name wins.
37
+ def set(name, sources)
38
+ @logger.debug("Set #{name.inspect} = #{sources.inspect}")
39
+
40
+ # Sources should be an array
41
+ sources = [sources] if !sources.kind_of?(Array)
42
+
43
+ # Gather the procs for every source, since that is what we care about.
44
+ procs = []
45
+ sources.each do |source|
46
+ if !@proc_cache.has_key?(source)
47
+ # Load the procs for this source and cache them. This caching
48
+ # avoids the issue where a file may have side effects when loading
49
+ # and loading it multiple times causes unexpected behavior.
50
+ @logger.debug("Populating proc cache for #{source.inspect}")
51
+ @proc_cache[source] = procs_for_source(source)
52
+ end
53
+
54
+ # Add on to the array of procs we're going to use
55
+ procs.concat(@proc_cache[source])
56
+ end
57
+
58
+ # Set this source by name.
59
+ @sources[name] = procs
60
+ end
61
+
62
+ # This loads the configured sources in the configured order and returns
63
+ # an actual configuration object that is ready to be used.
64
+ def load
65
+ @logger.debug("Loading configuration in order: #{@load_order.inspect}")
66
+
67
+ unknown_sources = @sources.keys - @load_order
68
+ if !unknown_sources.empty?
69
+ # TODO: Raise exception here perhaps.
70
+ @logger.error("Unknown config sources: #{unknown_sources.inspect}")
71
+ end
72
+
73
+ # Create the top-level configuration which will hold all the config.
74
+ result = Top.new
75
+
76
+ @load_order.each do |key|
77
+ next if !@sources.has_key?(key)
78
+
79
+ @sources[key].each do |proc|
80
+ if !@config_cache.has_key?(proc)
81
+ @logger.debug("Loading from: #{key} (evaluating)")
82
+ current = Top.new
83
+ proc.call(current)
84
+ @config_cache[proc] = current
85
+ end
86
+
87
+ # Merge in the results of this proc's configuration
88
+ result = result.merge(@config_cache[proc])
89
+ end
90
+ end
91
+
92
+ @logger.debug("Configuration loaded successfully")
93
+ result
94
+ end
95
+
96
+ protected
97
+
98
+ # This returns an array of `Proc` objects for the given source.
99
+ # The `Proc` objects returned will expect a single argument for
100
+ # the configuration object and are expected to mutate this
101
+ # configuration object.
102
+ def procs_for_source(source)
103
+ return [source] if source.is_a?(Proc)
104
+
105
+ # Assume all string sources are actually pathnames
106
+ source = Pathname.new(source) if source.is_a?(String)
107
+
108
+ if source.is_a?(Pathname)
109
+ @logger.debug("Load procs for pathname: #{source.inspect}")
110
+
111
+ begin
112
+ return Config.capture_configures do
113
+ Kernel.load source
114
+ end
115
+ rescue SyntaxError => e
116
+ # Report syntax errors in a nice way.
117
+ raise Errors::VagrantfileSyntaxError, :file => e.message
118
+ end
119
+ end
120
+
121
+ raise Exception, "Unknown configuration source: #{source.inspect}"
122
+ end
123
+ end
124
+ end
125
+ end
@@ -1,8 +1,6 @@
1
1
  module Vagrant
2
- class Config
2
+ module Config
3
3
  class NFSConfig < Base
4
- configures :nfs
5
-
6
4
  attr_accessor :map_uid
7
5
  attr_accessor :map_gid
8
6
  end
@@ -1,8 +1,6 @@
1
1
  module Vagrant
2
- class Config
2
+ module Config
3
3
  class PackageConfig < Base
4
- configures :package
5
-
6
4
  attr_accessor :name
7
5
  end
8
6
  end