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
@@ -5,13 +5,15 @@ module Vagrant
5
5
  class Base
6
6
  include Vagrant::Util
7
7
 
8
- # The environment which this downloader is operating.
9
- attr_reader :env
10
-
11
- def initialize(env)
12
- @env = env
8
+ def initialize(ui)
9
+ @ui = ui
13
10
  end
14
11
 
12
+ # Tests whether a URL matches this download. Subclasses must
13
+ # override this and return `true` for any URLs they wish to
14
+ # handle.
15
+ def self.match?(url); false; end
16
+
15
17
  # Called prior to execution so any error checks can be done
16
18
  def prepare(source_url); end
17
19
 
@@ -6,16 +6,16 @@ module Vagrant
6
6
  # simply does a file copy.
7
7
  class File < Base
8
8
  def self.match?(uri)
9
- ::File.exists?(uri)
9
+ ::File.file?(::File.expand_path(uri))
10
10
  end
11
11
 
12
12
  def prepare(source_url)
13
- raise Errors::DownloaderFileDoesntExist if !::File.file?(source_url)
13
+ raise Errors::DownloaderFileDoesntExist if !::File.file?(::File.expand_path(source_url))
14
14
  end
15
15
 
16
16
  def download!(source_url, destination_file)
17
- env.ui.info I18n.t("vagrant.downloaders.file.download")
18
- FileUtils.cp(source_url, destination_file.path)
17
+ @ui.info I18n.t("vagrant.downloaders.file.download")
18
+ FileUtils.cp(::File.expand_path(source_url), destination_file.path)
19
19
  end
20
20
  end
21
21
  end
@@ -1,6 +1,5 @@
1
1
  require 'net/http'
2
2
  require 'net/https'
3
- require 'open-uri'
4
3
  require 'uri'
5
4
  require 'base64'
6
5
 
@@ -27,7 +26,7 @@ module Vagrant
27
26
  end
28
27
 
29
28
  http.start do |h|
30
- env.ui.info I18n.t("vagrant.downloaders.http.download", :url => source_url)
29
+ @ui.info I18n.t("vagrant.downloaders.http.download", :url => source_url)
31
30
 
32
31
  headers = nil
33
32
  if uri.user && uri.password
@@ -56,8 +55,8 @@ module Vagrant
56
55
  # Progress reporting is limited to every 25 segments just so
57
56
  # we're not constantly updating
58
57
  if segment_count % 25 == 0
59
- env.ui.clear_line
60
- env.ui.report_progress(progress, total)
58
+ @ui.clear_line
59
+ @ui.report_progress(progress, total)
61
60
  segment_count = 0
62
61
  end
63
62
 
@@ -66,7 +65,7 @@ module Vagrant
66
65
  end
67
66
 
68
67
  # Clear the line one last time so that the progress meter disappears
69
- env.ui.clear_line
68
+ @ui.clear_line
70
69
  end
71
70
  end
72
71
  rescue SocketError
@@ -0,0 +1,7 @@
1
+ module Vagrant
2
+ module Driver
3
+ autoload :VirtualBox, 'vagrant/driver/virtualbox'
4
+ autoload :VirtualBox_4_0, 'vagrant/driver/virtualbox_4_0'
5
+ autoload :VirtualBox_4_1, 'vagrant/driver/virtualbox_4_1'
6
+ end
7
+ end
@@ -0,0 +1,121 @@
1
+ require 'forwardable'
2
+
3
+ require 'log4r'
4
+
5
+ require 'vagrant/driver/virtualbox_base'
6
+
7
+ module Vagrant
8
+ module Driver
9
+ # This class contains the logic to drive VirtualBox.
10
+ #
11
+ # Read the VirtualBoxBase source for documentation on each method.
12
+ class VirtualBox < VirtualBoxBase
13
+ # This is raised if the VM is not found when initializing a driver
14
+ # with a UUID.
15
+ class VMNotFound < StandardError; end
16
+
17
+ # We use forwardable to do all our driver forwarding
18
+ extend Forwardable
19
+
20
+ # The UUID of the virtual machine we represent
21
+ attr_reader :uuid
22
+
23
+ # The version of virtualbox that is running.
24
+ attr_reader :version
25
+
26
+ def initialize(uuid)
27
+ # Setup the base
28
+ super()
29
+
30
+ @logger = Log4r::Logger.new("vagrant::driver::virtualbox")
31
+ @uuid = uuid
32
+
33
+ # Read and assign the version of VirtualBox we know which
34
+ # specific driver to instantiate.
35
+ begin
36
+ @version = read_version
37
+ rescue Subprocess::LaunchError
38
+ # This means that VirtualBox was not found, so we raise this
39
+ # error here.
40
+ raise Errors::VirtualBoxNotDetected
41
+ end
42
+
43
+ # Instantiate the proper version driver for VirtualBox
44
+ @logger.debug("Finding driver for VirtualBox version: #{@version}")
45
+ driver_map = {
46
+ "4.0" => VirtualBox_4_0,
47
+ "4.1" => VirtualBox_4_1
48
+ }
49
+
50
+ driver_klass = nil
51
+ driver_map.each do |key, klass|
52
+ if @version.start_with?(key)
53
+ driver_klass = klass
54
+ break
55
+ end
56
+ end
57
+
58
+ if !driver_klass
59
+ supported_versions = driver_map.keys.sort.join(", ")
60
+ raise Errors::VirtualBoxInvalidVersion, :supported_versions => supported_versions
61
+ end
62
+
63
+ @logger.info("Using VirtualBox driver: #{driver_klass}")
64
+ @driver = driver_klass.new(@uuid)
65
+
66
+ if @uuid
67
+ # Verify the VM exists, and if it doesn't, then don't worry
68
+ # about it (mark the UUID as nil)
69
+ raise VMNotFound if !@driver.vm_exists?(@uuid)
70
+ end
71
+ end
72
+
73
+ def_delegators :@driver, :clear_forwarded_ports,
74
+ :clear_shared_folders,
75
+ :create_dhcp_server,
76
+ :create_host_only_network,
77
+ :delete,
78
+ :delete_unused_host_only_networks,
79
+ :discard_saved_state,
80
+ :enable_adapters,
81
+ :execute_command,
82
+ :export,
83
+ :forward_ports,
84
+ :halt,
85
+ :import,
86
+ :read_forwarded_ports,
87
+ :read_bridged_interfaces,
88
+ :read_guest_additions_version,
89
+ :read_host_only_interfaces,
90
+ :read_mac_address,
91
+ :read_machine_folder,
92
+ :read_network_interfaces,
93
+ :read_state,
94
+ :read_used_ports,
95
+ :read_vms,
96
+ :set_mac_address,
97
+ :share_folders,
98
+ :ssh_port,
99
+ :start,
100
+ :suspend,
101
+ :verify_image,
102
+ :vm_exists?
103
+
104
+ protected
105
+
106
+ # This returns the version of VirtualBox that is running.
107
+ #
108
+ # @return [String]
109
+ def read_version
110
+ # The version string is usually in one of the following formats:
111
+ #
112
+ # * 4.1.8r1234
113
+ # * 4.1.8r1234_OSE
114
+ # * 4.1.8_MacPortsr1234
115
+ #
116
+ # Below accounts for all of these:
117
+ execute("--version").split("_")[0].split("r")[0]
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,411 @@
1
+ require 'log4r'
2
+
3
+ require 'vagrant/driver/virtualbox_base'
4
+
5
+ module Vagrant
6
+ module Driver
7
+ # Driver for VirtualBox 4.0.x
8
+ class VirtualBox_4_0 < VirtualBoxBase
9
+ def initialize(uuid)
10
+ super()
11
+
12
+ @logger = Log4r::Logger.new("vagrant::driver::virtualbox_4_1")
13
+ @uuid = uuid
14
+ end
15
+
16
+ def clear_forwarded_ports
17
+ args = []
18
+ read_forwarded_ports(@uuid).each do |nic, name, _, _|
19
+ args.concat(["--natpf#{nic}", "delete", name])
20
+ end
21
+
22
+ execute("modifyvm", @uuid, *args) if !args.empty?
23
+ end
24
+
25
+ def clear_shared_folders
26
+ execute("showvminfo", @uuid, "--machinereadable").split("\n").each do |line|
27
+ if line =~ /^SharedFolderNameMachineMapping\d+="(.+?)"$/
28
+ execute("sharedfolder", "remove", @uuid, "--name", $1.to_s)
29
+ end
30
+ end
31
+ end
32
+
33
+ def create_dhcp_server(network, options)
34
+ execute("dhcpserver", "add", "--ifname", network,
35
+ "--ip", options[:dhcp_ip],
36
+ "--netmask", options[:netmask],
37
+ "--lowerip", options[:dhcp_lower],
38
+ "--upperip", options[:dhcp_upper],
39
+ "--enable")
40
+ end
41
+
42
+ def create_host_only_network(options)
43
+ # Create the interface
44
+ execute("hostonlyif", "create") =~ /^Interface '(.+?)' was successfully created$/
45
+ name = $1.to_s
46
+
47
+ # Configure it
48
+ execute("hostonlyif", "ipconfig", name,
49
+ "--ip", options[:adapter_ip],
50
+ "--netmask", options[:netmask])
51
+
52
+ # Return the details
53
+ return {
54
+ :name => name,
55
+ :ip => options[:adapter_ip],
56
+ :netmask => options[:netmask],
57
+ :dhcp => nil
58
+ }
59
+ end
60
+
61
+ def delete
62
+ execute("unregistervm", @uuid, "--delete")
63
+ end
64
+
65
+ def delete_unused_host_only_networks
66
+ networks = []
67
+ execute("list", "hostonlyifs").split("\n").each do |line|
68
+ networks << $1.to_s if line =~ /^Name:\s+(.+?)$/
69
+ end
70
+
71
+ execute("list", "vms").split("\n").each do |line|
72
+ if line =~ /^".+?"\s+\{(.+?)\}$/
73
+ execute("showvminfo", $1.to_s, "--machinereadable").split("\n").each do |info|
74
+ if info =~ /^hostonlyadapter\d+="(.+?)"$/
75
+ networks.delete($1.to_s)
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ networks.each do |name|
82
+ # First try to remove any DHCP servers attached. We use `raw` because
83
+ # it is okay if this fails. It usually means that a DHCP server was
84
+ # never attached.
85
+ raw("dhcpserver", "remove", "--ifname", name)
86
+
87
+ # Delete the actual host only network interface.
88
+ execute("hostonlyif", "remove", name)
89
+ end
90
+ end
91
+
92
+ def discard_saved_state
93
+ execute("discardstate", @uuid)
94
+ end
95
+
96
+ def enable_adapters(adapters)
97
+ args = []
98
+ adapters.each do |adapter|
99
+ args.concat(["--nic#{adapter[:adapter]}", adapter[:type].to_s])
100
+
101
+ if adapter[:bridge]
102
+ args.concat(["--bridgeadapter#{adapter[:adapter]}",
103
+ adapter[:bridge]])
104
+ end
105
+
106
+ if adapter[:hostonly]
107
+ args.concat(["--hostonlyadapter#{adapter[:adapter]}",
108
+ adapter[:hostonly]])
109
+ end
110
+
111
+ if adapter[:mac_address]
112
+ args.concat(["--macaddress#{adapter[:adapter]}",
113
+ adapter[:mac_address]])
114
+ end
115
+ end
116
+
117
+ execute("modifyvm", @uuid, *args)
118
+ end
119
+
120
+ def execute_command(command)
121
+ raw(*command)
122
+ end
123
+
124
+ def export(path)
125
+ # TODO: Progress
126
+ execute("export", @uuid, "--output", path.to_s)
127
+ end
128
+
129
+ def forward_ports(ports)
130
+ args = []
131
+ ports.each do |options|
132
+ pf_builder = [options[:name],
133
+ options[:protocol] || "tcp",
134
+ "",
135
+ options[:hostport],
136
+ "",
137
+ options[:guestport]]
138
+
139
+ args.concat(["--natpf#{options[:adapter] || 1}",
140
+ pf_builder.join(",")])
141
+ end
142
+
143
+ execute("modifyvm", @uuid, *args)
144
+ end
145
+
146
+ def halt
147
+ execute("controlvm", @uuid, "poweroff")
148
+ end
149
+
150
+ def import(ovf, name)
151
+ total = ""
152
+ last = 0
153
+ execute("import", ovf, "--vsys", "0", "--vmname", name) do |type, data|
154
+ if type == :stderr
155
+ # Append the data so we can see the full view
156
+ total << data
157
+
158
+ # Break up the lines. We can't get the progress until we see an "OK"
159
+ lines = total.split("\n")
160
+ if lines.include?("OK.")
161
+ # The progress of the import will be in the last line. Do a greedy
162
+ # regular expression to find what we're looking for.
163
+ if lines.last =~ /.+(\d{2})%/
164
+ current = $1.to_i
165
+ if current > last
166
+ last = current
167
+ yield current if block_given?
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
173
+
174
+ output = execute("list", "vms")
175
+ if output =~ /^"#{name}" \{(.+?)\}$/
176
+ return $1.to_s
177
+ end
178
+
179
+ nil
180
+ end
181
+
182
+ def read_forwarded_ports(uuid=nil, active_only=false)
183
+ uuid ||= @uuid
184
+
185
+ @logger.debug("read_forward_ports: uuid=#{uuid} active_only=#{active_only}")
186
+
187
+ results = []
188
+ current_nic = nil
189
+ execute("showvminfo", uuid, "--machinereadable").split("\n").each do |line|
190
+ # This is how we find the nic that a FP is attached to,
191
+ # since this comes first.
192
+ current_nic = $1.to_i if line =~ /^nic(\d+)=".+?"$/
193
+
194
+ # If we care about active VMs only, then we check the state
195
+ # to verify the VM is running.
196
+ if active_only && line =~ /^VMState="(.+?)"$/ && $1.to_s != "running"
197
+ return []
198
+ end
199
+
200
+ # Parse out the forwarded port information
201
+ if line =~ /^Forwarding.+?="(.+?),.+?,.*?,(.+?),.*?,(.+?)"$/
202
+ result = [current_nic, $1.to_s, $2.to_i, $3.to_i]
203
+ @logger.debug(" - #{result.inspect}")
204
+ results << result
205
+ end
206
+ end
207
+
208
+ results
209
+ end
210
+
211
+ def read_bridged_interfaces
212
+ execute("list", "bridgedifs").split("\n\n").collect do |block|
213
+ info = {}
214
+
215
+ block.split("\n").each do |line|
216
+ if line =~ /^Name:\s+(.+?)$/
217
+ info[:name] = $1.to_s
218
+ elsif line =~ /^IPAddress:\s+(.+?)$/
219
+ info[:ip] = $1.to_s
220
+ elsif line =~ /^NetworkMask:\s+(.+?)$/
221
+ info[:netmask] = $1.to_s
222
+ elsif line =~ /^Status:\s+(.+?)$/
223
+ info[:status] = $1.to_s
224
+ end
225
+ end
226
+
227
+ # Return the info to build up the results
228
+ info
229
+ end
230
+ end
231
+
232
+ def read_guest_additions_version
233
+ output = execute("guestproperty", "get", @uuid, "/VirtualBox/GuestAdd/Version")
234
+ if output =~ /^Value: (.+?)$/
235
+ # Split the version by _ since some distro versions modify it
236
+ # to look like this: 4.1.2_ubuntu, and the distro part isn't
237
+ # too important.
238
+ value = $1.to_s
239
+ return value.split("_").first
240
+ end
241
+
242
+ return nil
243
+ end
244
+
245
+ def read_host_only_interfaces
246
+ dhcp = {}
247
+ execute("list", "dhcpservers").split("\n\n").each do |block|
248
+ info = {}
249
+
250
+ block.split("\n").each do |line|
251
+ if line =~ /^NetworkName:\s+HostInterfaceNetworking-(.+?)$/
252
+ info[:network] = $1.to_s
253
+ elsif line =~ /^IP:\s+(.+?)$/
254
+ info[:ip] = $1.to_s
255
+ elsif line =~ /^lowerIPAddress:\s+(.+?)$/
256
+ info[:lower] = $1.to_s
257
+ elsif line =~ /^upperIPAddress:\s+(.+?)$/
258
+ info[:upper] = $1.to_s
259
+ end
260
+ end
261
+
262
+ # Set the DHCP info
263
+ dhcp[info[:network]] = info
264
+ end
265
+
266
+ execute("list", "hostonlyifs").split("\n\n").collect do |block|
267
+ info = {}
268
+
269
+ block.split("\n").each do |line|
270
+ if line =~ /^Name:\s+(.+?)$/
271
+ info[:name] = $1.to_s
272
+ elsif line =~ /^IPAddress:\s+(.+?)$/
273
+ info[:ip] = $1.to_s
274
+ elsif line =~ /^NetworkMask:\s+(.+?)$/
275
+ info[:netmask] = $1.to_s
276
+ end
277
+ end
278
+
279
+ # Set the DHCP info if it exists
280
+ info[:dhcp] = dhcp[info[:name]] if dhcp[info[:name]]
281
+
282
+ info
283
+ end
284
+ end
285
+
286
+ def read_mac_address
287
+ execute("showvminfo", @uuid, "--machinereadable").split("\n").each do |line|
288
+ return $1.to_s if line =~ /^macaddress1="(.+?)"$/
289
+ end
290
+
291
+ nil
292
+ end
293
+
294
+ def read_machine_folder
295
+ execute("list", "systemproperties").split("\n").each do |line|
296
+ if line =~ /^Default machine folder:\s+(.+?)$/i
297
+ return $1.to_s
298
+ end
299
+ end
300
+
301
+ nil
302
+ end
303
+
304
+ def read_network_interfaces
305
+ nics = {}
306
+ execute("showvminfo", @uuid, "--machinereadable").split("\n").each do |line|
307
+ if line =~ /^nic(\d+)="(.+?)"$/
308
+ adapter = $1.to_i
309
+ type = $2.to_sym
310
+
311
+ nics[adapter] ||= {}
312
+ nics[adapter][:type] = type
313
+ elsif line =~ /^hostonlyadapter(\d+)="(.+?)"$/
314
+ adapter = $1.to_i
315
+ network = $2.to_s
316
+
317
+ nics[adapter] ||= {}
318
+ nics[adapter][:hostonly] = network
319
+ elsif line =~ /^bridgeadapter(\d+)="(.+?)"$/
320
+ adapter = $1.to_i
321
+ network = $2.to_s
322
+
323
+ nics[adapter] ||= {}
324
+ nics[adapter][:bridge] = network
325
+ end
326
+ end
327
+
328
+ nics
329
+ end
330
+
331
+ def read_state
332
+ output = execute("showvminfo", @uuid, "--machinereadable")
333
+ if output =~ /^name="<inaccessible>"$/
334
+ return :inaccessible
335
+ elsif output =~ /^VMState="(.+?)"$/
336
+ return $1.to_sym
337
+ end
338
+
339
+ nil
340
+ end
341
+
342
+ def read_used_ports
343
+ ports = []
344
+ execute("list", "vms").split("\n").each do |line|
345
+ if line =~ /^".+?" \{(.+?)\}$/
346
+ uuid = $1.to_s
347
+
348
+ # Ignore our own used ports
349
+ next if uuid == @uuid
350
+
351
+ read_forwarded_ports(uuid, true).each do |_, _, hostport, _|
352
+ ports << hostport
353
+ end
354
+ end
355
+ end
356
+
357
+ ports
358
+ end
359
+
360
+ def read_vms
361
+ results = []
362
+ execute("list", "vms").split("\n").each do |line|
363
+ if line =~ /^".+?" \{(.+?)\}$/
364
+ results << $1.to_s
365
+ end
366
+ end
367
+
368
+ results
369
+ end
370
+
371
+ def set_mac_address(mac)
372
+ execute("modifyvm", @uuid, "--macaddress1", mac)
373
+ end
374
+
375
+ def share_folders(folders)
376
+ folders.each do |folder|
377
+ execute("sharedfolder", "add", @uuid, "--name",
378
+ folder[:name], "--hostpath", folder[:hostpath])
379
+ end
380
+ end
381
+
382
+ def ssh_port(expected_port)
383
+ @logger.debug("Searching for SSH port: #{expected_port.inspect}")
384
+
385
+ # Look for the forwarded port only by comparing the guest port
386
+ read_forwarded_ports.each do |_, _, hostport, guestport|
387
+ return hostport if guestport == expected_port
388
+ end
389
+
390
+ nil
391
+ end
392
+
393
+ def start(mode)
394
+ execute("startvm", @uuid, "--type", mode.to_s)
395
+ end
396
+
397
+ def suspend
398
+ execute("controlvm", @uuid, "savestate")
399
+ end
400
+
401
+ def verify_image(path)
402
+ r = raw("import", path.to_s, "--dry-run")
403
+ return r.exit_code == 0
404
+ end
405
+
406
+ def vm_exists?(uuid)
407
+ raw("showvminfo", uuid).exit_code == 0
408
+ end
409
+ end
410
+ end
411
+ end