tnargav 1.2.2

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 (452) hide show
  1. data/.gitignore +31 -0
  2. data/.gitsetup.yml +5 -0
  3. data/.travis.yml +7 -0
  4. data/.yardopts +1 -0
  5. data/CHANGELOG.md +1067 -0
  6. data/Gemfile +3 -0
  7. data/LICENSE +21 -0
  8. data/README.md +89 -0
  9. data/Rakefile +18 -0
  10. data/bin/vagrant +106 -0
  11. data/config/default.rb +36 -0
  12. data/contrib/README.md +12 -0
  13. data/contrib/bash/completion.sh +3 -0
  14. data/contrib/emacs/vagrant.el +8 -0
  15. data/contrib/vim/vagrantfile.vim +9 -0
  16. data/keys/README.md +17 -0
  17. data/keys/vagrant +27 -0
  18. data/keys/vagrant.pub +1 -0
  19. data/lib/vagrant/action/builder.rb +174 -0
  20. data/lib/vagrant/action/builtin/box_add.rb +81 -0
  21. data/lib/vagrant/action/builtin/call.rb +67 -0
  22. data/lib/vagrant/action/builtin/config_validate.rb +30 -0
  23. data/lib/vagrant/action/builtin/confirm.rb +38 -0
  24. data/lib/vagrant/action/builtin/destroy_confirm.rb +21 -0
  25. data/lib/vagrant/action/builtin/env_set.rb +24 -0
  26. data/lib/vagrant/action/builtin/graceful_halt.rb +73 -0
  27. data/lib/vagrant/action/builtin/handle_box_url.rb +77 -0
  28. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +134 -0
  29. data/lib/vagrant/action/builtin/lock.rb +57 -0
  30. data/lib/vagrant/action/builtin/nfs.rb +118 -0
  31. data/lib/vagrant/action/builtin/provision.rb +70 -0
  32. data/lib/vagrant/action/builtin/set_hostname.rb +27 -0
  33. data/lib/vagrant/action/builtin/ssh_exec.rb +42 -0
  34. data/lib/vagrant/action/builtin/ssh_run.rb +43 -0
  35. data/lib/vagrant/action/general/package.rb +103 -0
  36. data/lib/vagrant/action/hook.rb +107 -0
  37. data/lib/vagrant/action/runner.rb +69 -0
  38. data/lib/vagrant/action/warden.rb +103 -0
  39. data/lib/vagrant/action.rb +43 -0
  40. data/lib/vagrant/batch_action.rb +113 -0
  41. data/lib/vagrant/box.rb +97 -0
  42. data/lib/vagrant/box_collection.rb +375 -0
  43. data/lib/vagrant/cli.rb +82 -0
  44. data/lib/vagrant/config/loader.rb +222 -0
  45. data/lib/vagrant/config/v1/dummy_config.rb +13 -0
  46. data/lib/vagrant/config/v1/loader.rb +105 -0
  47. data/lib/vagrant/config/v1/root.rb +60 -0
  48. data/lib/vagrant/config/v1.rb +9 -0
  49. data/lib/vagrant/config/v2/dummy_config.rb +13 -0
  50. data/lib/vagrant/config/v2/loader.rb +141 -0
  51. data/lib/vagrant/config/v2/root.rb +105 -0
  52. data/lib/vagrant/config/v2/util.rb +21 -0
  53. data/lib/vagrant/config/v2.rb +9 -0
  54. data/lib/vagrant/config/version_base.rb +80 -0
  55. data/lib/vagrant/config.rb +61 -0
  56. data/lib/vagrant/environment.rb +843 -0
  57. data/lib/vagrant/errors.rb +570 -0
  58. data/lib/vagrant/guest.rb +163 -0
  59. data/lib/vagrant/hosts.rb +28 -0
  60. data/lib/vagrant/machine.rb +325 -0
  61. data/lib/vagrant/machine_state.rb +45 -0
  62. data/lib/vagrant/plugin/v1/command.rb +169 -0
  63. data/lib/vagrant/plugin/v1/communicator.rb +98 -0
  64. data/lib/vagrant/plugin/v1/config.rb +112 -0
  65. data/lib/vagrant/plugin/v1/errors.rb +15 -0
  66. data/lib/vagrant/plugin/v1/guest.rb +92 -0
  67. data/lib/vagrant/plugin/v1/host.rb +66 -0
  68. data/lib/vagrant/plugin/v1/manager.rb +131 -0
  69. data/lib/vagrant/plugin/v1/plugin.rb +229 -0
  70. data/lib/vagrant/plugin/v1/provider.rb +68 -0
  71. data/lib/vagrant/plugin/v1/provisioner.rb +50 -0
  72. data/lib/vagrant/plugin/v1.rb +19 -0
  73. data/lib/vagrant/plugin/v2/command.rb +234 -0
  74. data/lib/vagrant/plugin/v2/communicator.rb +98 -0
  75. data/lib/vagrant/plugin/v2/components.rb +47 -0
  76. data/lib/vagrant/plugin/v2/config.rb +136 -0
  77. data/lib/vagrant/plugin/v2/errors.rb +15 -0
  78. data/lib/vagrant/plugin/v2/guest.rb +78 -0
  79. data/lib/vagrant/plugin/v2/host.rb +66 -0
  80. data/lib/vagrant/plugin/v2/manager.rb +173 -0
  81. data/lib/vagrant/plugin/v2/plugin.rb +226 -0
  82. data/lib/vagrant/plugin/v2/provider.rb +69 -0
  83. data/lib/vagrant/plugin/v2/provisioner.rb +47 -0
  84. data/lib/vagrant/plugin/v2.rb +22 -0
  85. data/lib/vagrant/plugin.rb +6 -0
  86. data/lib/vagrant/registry.rb +78 -0
  87. data/lib/vagrant/ui.rb +215 -0
  88. data/lib/vagrant/util/ansi_escape_code_remover.rb +34 -0
  89. data/lib/vagrant/util/busy.rb +59 -0
  90. data/lib/vagrant/util/counter.rb +24 -0
  91. data/lib/vagrant/util/downloader.rb +146 -0
  92. data/lib/vagrant/util/file_checksum.rb +38 -0
  93. data/lib/vagrant/util/file_mode.rb +12 -0
  94. data/lib/vagrant/util/hash_with_indifferent_access.rb +63 -0
  95. data/lib/vagrant/util/is_port_open.rb +38 -0
  96. data/lib/vagrant/util/line_ending_helpers.rb +14 -0
  97. data/lib/vagrant/util/network_ip.rb +28 -0
  98. data/lib/vagrant/util/platform.rb +58 -0
  99. data/lib/vagrant/util/retryable.rb +31 -0
  100. data/lib/vagrant/util/safe_chdir.rb +33 -0
  101. data/lib/vagrant/util/safe_exec.rb +36 -0
  102. data/lib/vagrant/util/safe_puts.rb +31 -0
  103. data/lib/vagrant/util/scoped_hash_override.rb +45 -0
  104. data/lib/vagrant/util/ssh.rb +150 -0
  105. data/lib/vagrant/util/stacked_proc_runner.rb +35 -0
  106. data/lib/vagrant/util/string_block_editor.rb +77 -0
  107. data/lib/vagrant/util/subprocess.rb +273 -0
  108. data/lib/vagrant/util/template_renderer.rb +83 -0
  109. data/lib/vagrant/util/which.rb +43 -0
  110. data/lib/vagrant/util.rb +12 -0
  111. data/lib/vagrant/version.rb +6 -0
  112. data/lib/vagrant.rb +258 -0
  113. data/plugins/README.md +5 -0
  114. data/plugins/commands/box/command/add.rb +51 -0
  115. data/plugins/commands/box/command/list.rb +41 -0
  116. data/plugins/commands/box/command/remove.rb +37 -0
  117. data/plugins/commands/box/command/repackage.rb +43 -0
  118. data/plugins/commands/box/command/root.rb +75 -0
  119. data/plugins/commands/box/plugin.rb +15 -0
  120. data/plugins/commands/destroy/command.rb +31 -0
  121. data/plugins/commands/destroy/plugin.rb +18 -0
  122. data/plugins/commands/halt/command.rb +33 -0
  123. data/plugins/commands/halt/plugin.rb +18 -0
  124. data/plugins/commands/init/command.rb +40 -0
  125. data/plugins/commands/init/plugin.rb +18 -0
  126. data/plugins/commands/package/command.rb +83 -0
  127. data/plugins/commands/package/plugin.rb +18 -0
  128. data/plugins/commands/plugin/action/bundler_check.rb +25 -0
  129. data/plugins/commands/plugin/action/install_gem.rb +81 -0
  130. data/plugins/commands/plugin/action/license_plugin.rb +54 -0
  131. data/plugins/commands/plugin/action/list_plugins.rb +54 -0
  132. data/plugins/commands/plugin/action/prune_gems.rb +149 -0
  133. data/plugins/commands/plugin/action/uninstall_plugin.rb +23 -0
  134. data/plugins/commands/plugin/action.rb +52 -0
  135. data/plugins/commands/plugin/command/base.rb +22 -0
  136. data/plugins/commands/plugin/command/install.rb +58 -0
  137. data/plugins/commands/plugin/command/license.rb +31 -0
  138. data/plugins/commands/plugin/command/list.rb +28 -0
  139. data/plugins/commands/plugin/command/root.rb +75 -0
  140. data/plugins/commands/plugin/command/uninstall.rb +28 -0
  141. data/plugins/commands/plugin/gem_helper.rb +74 -0
  142. data/plugins/commands/plugin/plugin.rb +22 -0
  143. data/plugins/commands/plugin/state_file.rb +57 -0
  144. data/plugins/commands/provision/command.rb +34 -0
  145. data/plugins/commands/provision/plugin.rb +18 -0
  146. data/plugins/commands/reload/command.rb +37 -0
  147. data/plugins/commands/reload/plugin.rb +18 -0
  148. data/plugins/commands/resume/command.rb +25 -0
  149. data/plugins/commands/resume/plugin.rb +17 -0
  150. data/plugins/commands/ssh/command.rb +63 -0
  151. data/plugins/commands/ssh/plugin.rb +17 -0
  152. data/plugins/commands/ssh_config/command.rb +49 -0
  153. data/plugins/commands/ssh_config/plugin.rb +18 -0
  154. data/plugins/commands/status/command.rb +39 -0
  155. data/plugins/commands/status/plugin.rb +18 -0
  156. data/plugins/commands/suspend/command.rb +25 -0
  157. data/plugins/commands/suspend/plugin.rb +18 -0
  158. data/plugins/commands/up/command.rb +57 -0
  159. data/plugins/commands/up/plugin.rb +17 -0
  160. data/plugins/commands/up/start_mixins.rb +26 -0
  161. data/plugins/communicators/ssh/communicator.rb +342 -0
  162. data/plugins/communicators/ssh/plugin.rb +19 -0
  163. data/plugins/guests/arch/cap/change_host_name.rb +18 -0
  164. data/plugins/guests/arch/cap/configure_networks.rb +23 -0
  165. data/plugins/guests/arch/guest.rb +11 -0
  166. data/plugins/guests/arch/plugin.rb +25 -0
  167. data/plugins/guests/debian/cap/change_host_name.rb +18 -0
  168. data/plugins/guests/debian/cap/configure_networks.rb +61 -0
  169. data/plugins/guests/debian/guest.rb +9 -0
  170. data/plugins/guests/debian/plugin.rb +25 -0
  171. data/plugins/guests/fedora/cap/configure_networks.rb +59 -0
  172. data/plugins/guests/fedora/cap/network_scripts_dir.rb +15 -0
  173. data/plugins/guests/fedora/guest.rb +11 -0
  174. data/plugins/guests/fedora/plugin.rb +25 -0
  175. data/plugins/guests/freebsd/cap/change_host_name.rb +14 -0
  176. data/plugins/guests/freebsd/cap/configure_networks.rb +39 -0
  177. data/plugins/guests/freebsd/cap/halt.rb +16 -0
  178. data/plugins/guests/freebsd/cap/mount_nfs_folder.rb +14 -0
  179. data/plugins/guests/freebsd/guest.rb +14 -0
  180. data/plugins/guests/freebsd/plugin.rb +35 -0
  181. data/plugins/guests/gentoo/cap/change_host_name.rb +17 -0
  182. data/plugins/guests/gentoo/cap/configure_networks.rb +43 -0
  183. data/plugins/guests/gentoo/guest.rb +9 -0
  184. data/plugins/guests/gentoo/plugin.rb +25 -0
  185. data/plugins/guests/linux/cap/halt.rb +16 -0
  186. data/plugins/guests/linux/cap/mount_nfs.rb +30 -0
  187. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +40 -0
  188. data/plugins/guests/linux/cap/read_ip_address.rb +17 -0
  189. data/plugins/guests/linux/cap/shell_expand_guest_path.rb +26 -0
  190. data/plugins/guests/linux/guest.rb +11 -0
  191. data/plugins/guests/linux/plugin.rb +40 -0
  192. data/plugins/guests/openbsd/cap/halt.rb +16 -0
  193. data/plugins/guests/openbsd/guest.rb +11 -0
  194. data/plugins/guests/openbsd/plugin.rb +20 -0
  195. data/plugins/guests/pld/cap/network_scripts_dir.rb +11 -0
  196. data/plugins/guests/pld/guest.rb +11 -0
  197. data/plugins/guests/pld/plugin.rb +20 -0
  198. data/plugins/guests/redhat/cap/change_host_name.rb +18 -0
  199. data/plugins/guests/redhat/cap/configure_networks.rb +60 -0
  200. data/plugins/guests/redhat/cap/network_scripts_dir.rb +11 -0
  201. data/plugins/guests/redhat/guest.rb +11 -0
  202. data/plugins/guests/redhat/plugin.rb +30 -0
  203. data/plugins/guests/solaris/cap/change_host_name.rb +17 -0
  204. data/plugins/guests/solaris/cap/configure_networks.rb +25 -0
  205. data/plugins/guests/solaris/cap/halt.rb +21 -0
  206. data/plugins/guests/solaris/cap/mount_virtualbox_shared_folder.rb +28 -0
  207. data/plugins/guests/solaris/config.rb +18 -0
  208. data/plugins/guests/solaris/guest.rb +14 -0
  209. data/plugins/guests/solaris/plugin.rb +40 -0
  210. data/plugins/guests/suse/cap/change_host_name.rb +18 -0
  211. data/plugins/guests/suse/cap/network_scripts_dir.rb +11 -0
  212. data/plugins/guests/suse/guest.rb +11 -0
  213. data/plugins/guests/suse/plugin.rb +25 -0
  214. data/plugins/guests/ubuntu/cap/change_host_name.rb +23 -0
  215. data/plugins/guests/ubuntu/guest.rb +32 -0
  216. data/plugins/guests/ubuntu/plugin.rb +20 -0
  217. data/plugins/hosts/arch/host.rb +68 -0
  218. data/plugins/hosts/arch/plugin.rb +15 -0
  219. data/plugins/hosts/bsd/host.rb +102 -0
  220. data/plugins/hosts/bsd/plugin.rb +15 -0
  221. data/plugins/hosts/fedora/host.rb +51 -0
  222. data/plugins/hosts/fedora/plugin.rb +15 -0
  223. data/plugins/hosts/freebsd/host.rb +43 -0
  224. data/plugins/hosts/freebsd/plugin.rb +15 -0
  225. data/plugins/hosts/gentoo/host.rb +24 -0
  226. data/plugins/hosts/gentoo/plugin.rb +15 -0
  227. data/plugins/hosts/linux/host.rb +95 -0
  228. data/plugins/hosts/linux/plugin.rb +15 -0
  229. data/plugins/hosts/opensuse/host.rb +34 -0
  230. data/plugins/hosts/opensuse/plugin.rb +15 -0
  231. data/plugins/hosts/windows/host.rb +17 -0
  232. data/plugins/hosts/windows/plugin.rb +15 -0
  233. data/plugins/kernel_v1/config/nfs.rb +20 -0
  234. data/plugins/kernel_v1/config/package.rb +17 -0
  235. data/plugins/kernel_v1/config/ssh.rb +46 -0
  236. data/plugins/kernel_v1/config/vagrant.rb +31 -0
  237. data/plugins/kernel_v1/config/vm.rb +184 -0
  238. data/plugins/kernel_v1/plugin.rb +44 -0
  239. data/plugins/kernel_v2/config/nfs.rb +14 -0
  240. data/plugins/kernel_v2/config/package.rb +13 -0
  241. data/plugins/kernel_v2/config/ssh.rb +76 -0
  242. data/plugins/kernel_v2/config/ssh_connect.rb +40 -0
  243. data/plugins/kernel_v2/config/vagrant.rb +13 -0
  244. data/plugins/kernel_v2/config/vm.rb +416 -0
  245. data/plugins/kernel_v2/config/vm_provisioner.rb +55 -0
  246. data/plugins/kernel_v2/config/vm_subvm.rb +30 -0
  247. data/plugins/kernel_v2/plugin.rb +44 -0
  248. data/plugins/providers/virtualbox/action/boot.rb +49 -0
  249. data/plugins/providers/virtualbox/action/check_accessible.rb +23 -0
  250. data/plugins/providers/virtualbox/action/check_created.rb +21 -0
  251. data/plugins/providers/virtualbox/action/check_guest_additions.rb +45 -0
  252. data/plugins/providers/virtualbox/action/check_running.rb +21 -0
  253. data/plugins/providers/virtualbox/action/check_virtualbox.rb +22 -0
  254. data/plugins/providers/virtualbox/action/clean_machine_folder.rb +43 -0
  255. data/plugins/providers/virtualbox/action/clear_forwarded_ports.rb +18 -0
  256. data/plugins/providers/virtualbox/action/clear_network_interfaces.rb +31 -0
  257. data/plugins/providers/virtualbox/action/clear_shared_folders.rb +17 -0
  258. data/plugins/providers/virtualbox/action/created.rb +20 -0
  259. data/plugins/providers/virtualbox/action/customize.rb +36 -0
  260. data/plugins/providers/virtualbox/action/destroy.rb +19 -0
  261. data/plugins/providers/virtualbox/action/destroy_unused_network_interfaces.rb +16 -0
  262. data/plugins/providers/virtualbox/action/discard_state.rb +20 -0
  263. data/plugins/providers/virtualbox/action/export.rb +57 -0
  264. data/plugins/providers/virtualbox/action/forced_halt.rb +25 -0
  265. data/plugins/providers/virtualbox/action/forward_ports.rb +87 -0
  266. data/plugins/providers/virtualbox/action/import.rb +51 -0
  267. data/plugins/providers/virtualbox/action/is_paused.rb +20 -0
  268. data/plugins/providers/virtualbox/action/is_running.rb +20 -0
  269. data/plugins/providers/virtualbox/action/is_saved.rb +20 -0
  270. data/plugins/providers/virtualbox/action/match_mac_address.rb +21 -0
  271. data/plugins/providers/virtualbox/action/message_already_running.rb +16 -0
  272. data/plugins/providers/virtualbox/action/message_not_created.rb +16 -0
  273. data/plugins/providers/virtualbox/action/message_not_running.rb +16 -0
  274. data/plugins/providers/virtualbox/action/message_will_not_destroy.rb +17 -0
  275. data/plugins/providers/virtualbox/action/network.rb +410 -0
  276. data/plugins/providers/virtualbox/action/package.rb +20 -0
  277. data/plugins/providers/virtualbox/action/package_vagrantfile.rb +33 -0
  278. data/plugins/providers/virtualbox/action/prepare_forwarded_port_collision_params.rb +35 -0
  279. data/plugins/providers/virtualbox/action/prepare_nfs_settings.rb +64 -0
  280. data/plugins/providers/virtualbox/action/prune_nfs_exports.rb +20 -0
  281. data/plugins/providers/virtualbox/action/resume.rb +25 -0
  282. data/plugins/providers/virtualbox/action/sane_defaults.rb +91 -0
  283. data/plugins/providers/virtualbox/action/set_name.rb +40 -0
  284. data/plugins/providers/virtualbox/action/setup_package_files.rb +51 -0
  285. data/plugins/providers/virtualbox/action/share_folders.rb +128 -0
  286. data/plugins/providers/virtualbox/action/suspend.rb +20 -0
  287. data/plugins/providers/virtualbox/action.rb +311 -0
  288. data/plugins/providers/virtualbox/config.rb +86 -0
  289. data/plugins/providers/virtualbox/driver/base.rb +360 -0
  290. data/plugins/providers/virtualbox/driver/meta.rb +142 -0
  291. data/plugins/providers/virtualbox/driver/version_4_0.rb +485 -0
  292. data/plugins/providers/virtualbox/driver/version_4_1.rb +485 -0
  293. data/plugins/providers/virtualbox/driver/version_4_2.rb +482 -0
  294. data/plugins/providers/virtualbox/model/forwarded_port.rb +58 -0
  295. data/plugins/providers/virtualbox/plugin.rb +42 -0
  296. data/plugins/providers/virtualbox/provider.rb +92 -0
  297. data/plugins/providers/virtualbox/util/compile_forwarded_ports.rb +31 -0
  298. data/plugins/provisioners/ansible/config.rb +72 -0
  299. data/plugins/provisioners/ansible/plugin.rb +23 -0
  300. data/plugins/provisioners/ansible/provisioner.rb +45 -0
  301. data/plugins/provisioners/cfengine/cap/debian/cfengine_install.rb +19 -0
  302. data/plugins/provisioners/cfengine/cap/linux/cfengine_installed.rb +14 -0
  303. data/plugins/provisioners/cfengine/cap/linux/cfengine_needs_bootstrap.rb +34 -0
  304. data/plugins/provisioners/cfengine/cap/redhat/cfengine_install.rb +24 -0
  305. data/plugins/provisioners/cfengine/config.rb +120 -0
  306. data/plugins/provisioners/cfengine/plugin.rb +42 -0
  307. data/plugins/provisioners/cfengine/provisioner.rb +136 -0
  308. data/plugins/provisioners/chef/config/base.rb +85 -0
  309. data/plugins/provisioners/chef/config/chef_client.rb +57 -0
  310. data/plugins/provisioners/chef/config/chef_solo.rb +87 -0
  311. data/plugins/provisioners/chef/plugin.rb +33 -0
  312. data/plugins/provisioners/chef/provisioner/base.rb +93 -0
  313. data/plugins/provisioners/chef/provisioner/chef_client.rb +107 -0
  314. data/plugins/provisioners/chef/provisioner/chef_solo.rb +192 -0
  315. data/plugins/provisioners/puppet/config/puppet.rb +70 -0
  316. data/plugins/provisioners/puppet/config/puppet_server.rb +16 -0
  317. data/plugins/provisioners/puppet/plugin.rb +33 -0
  318. data/plugins/provisioners/puppet/provisioner/puppet.rb +117 -0
  319. data/plugins/provisioners/puppet/provisioner/puppet_server.rb +67 -0
  320. data/plugins/provisioners/shell/config.rb +56 -0
  321. data/plugins/provisioners/shell/plugin.rb +23 -0
  322. data/plugins/provisioners/shell/provisioner.rb +86 -0
  323. data/tasks/acceptance.rake +113 -0
  324. data/tasks/bundler.rake +3 -0
  325. data/tasks/test.rake +20 -0
  326. data/templates/commands/init/Vagrantfile.erb +111 -0
  327. data/templates/commands/ssh_config/config.erb +16 -0
  328. data/templates/config/messages.erb +14 -0
  329. data/templates/config/validation_failed.erb +7 -0
  330. data/templates/guests/arch/network_dhcp.erb +4 -0
  331. data/templates/guests/arch/network_static.erb +6 -0
  332. data/templates/guests/debian/network_dhcp.erb +11 -0
  333. data/templates/guests/debian/network_static.erb +7 -0
  334. data/templates/guests/fedora/network_dhcp.erb +6 -0
  335. data/templates/guests/fedora/network_static.erb +13 -0
  336. data/templates/guests/freebsd/network_dhcp.erb +3 -0
  337. data/templates/guests/freebsd/network_static.erb +3 -0
  338. data/templates/guests/gentoo/network_dhcp.erb +4 -0
  339. data/templates/guests/gentoo/network_static.erb +4 -0
  340. data/templates/guests/redhat/network_dhcp.erb +6 -0
  341. data/templates/guests/redhat/network_static.erb +8 -0
  342. data/templates/locales/en.yml +1126 -0
  343. data/templates/nfs/exports.erb +5 -0
  344. data/templates/nfs/exports_freebsd.erb +5 -0
  345. data/templates/nfs/exports_linux.erb +5 -0
  346. data/templates/package_Vagrantfile.erb +11 -0
  347. data/templates/provisioners/chef_client/client.erb +32 -0
  348. data/templates/provisioners/chef_solo/solo.erb +25 -0
  349. data/templates/rgloader.rb +9 -0
  350. data/test/acceptance/base.rb +48 -0
  351. data/test/acceptance/box_test.rb +99 -0
  352. data/test/acceptance/destroy_test.rb +37 -0
  353. data/test/acceptance/halt_test.rb +72 -0
  354. data/test/acceptance/init_test.rb +33 -0
  355. data/test/acceptance/networking/host_only_test.rb +37 -0
  356. data/test/acceptance/networking/port_forward_test.rb +125 -0
  357. data/test/acceptance/package_test.rb +46 -0
  358. data/test/acceptance/provisioning/basic_test.rb +61 -0
  359. data/test/acceptance/provisioning/chef_solo_test.rb +37 -0
  360. data/test/acceptance/provisioning/shell_test.rb +53 -0
  361. data/test/acceptance/resume_test.rb +17 -0
  362. data/test/acceptance/shared_folders_test.rb +84 -0
  363. data/test/acceptance/skeletons/chef_solo_basic/README.md +3 -0
  364. data/test/acceptance/skeletons/chef_solo_basic/cookbooks/basic/recipes/default.rb +5 -0
  365. data/test/acceptance/skeletons/chef_solo_json/README.md +3 -0
  366. data/test/acceptance/skeletons/chef_solo_json/cookbooks/basic/recipes/default.rb +6 -0
  367. data/test/acceptance/skeletons/provisioner_multi/README.md +3 -0
  368. data/test/acceptance/skeletons/provisioner_multi/cookbooks/basic/recipes/default.rb +5 -0
  369. data/test/acceptance/ssh_test.rb +46 -0
  370. data/test/acceptance/support/config.rb +42 -0
  371. data/test/acceptance/support/isolated_environment.rb +118 -0
  372. data/test/acceptance/support/matchers/have_color.rb +9 -0
  373. data/test/acceptance/support/matchers/match_output.rb +14 -0
  374. data/test/acceptance/support/matchers/succeed.rb +14 -0
  375. data/test/acceptance/support/network_tests.rb +29 -0
  376. data/test/acceptance/support/output.rb +95 -0
  377. data/test/acceptance/support/shared/base_context.rb +72 -0
  378. data/test/acceptance/support/shared/command_examples.rb +33 -0
  379. data/test/acceptance/support/virtualbox.rb +36 -0
  380. data/test/acceptance/suspend_test.rb +56 -0
  381. data/test/acceptance/up_basic_test.rb +33 -0
  382. data/test/acceptance/up_with_box_url.rb +40 -0
  383. data/test/acceptance/vagrant_test.rb +47 -0
  384. data/test/acceptance/version_test.rb +15 -0
  385. data/test/config/acceptance_boxes.yml +7 -0
  386. data/test/support/isolated_environment.rb +46 -0
  387. data/test/support/tempdir.rb +43 -0
  388. data/test/unit/base.rb +27 -0
  389. data/test/unit/support/dummy_provider.rb +16 -0
  390. data/test/unit/support/isolated_environment.rb +179 -0
  391. data/test/unit/support/shared/base_context.rb +104 -0
  392. data/test/unit/vagrant/action/builder_test.rb +242 -0
  393. data/test/unit/vagrant/action/builtin/call_test.rb +145 -0
  394. data/test/unit/vagrant/action/builtin/confirm_test.rb +36 -0
  395. data/test/unit/vagrant/action/builtin/env_set_test.rb +20 -0
  396. data/test/unit/vagrant/action/builtin/graceful_halt_test.rb +61 -0
  397. data/test/unit/vagrant/action/builtin/lock_test.rb +98 -0
  398. data/test/unit/vagrant/action/builtin/ssh_exec_test.rb +57 -0
  399. data/test/unit/vagrant/action/hook_test.rb +120 -0
  400. data/test/unit/vagrant/action/runner_test.rb +71 -0
  401. data/test/unit/vagrant/action/warden_test.rb +92 -0
  402. data/test/unit/vagrant/batch_action_test.rb +36 -0
  403. data/test/unit/vagrant/box_collection_test.rb +237 -0
  404. data/test/unit/vagrant/box_test.rb +122 -0
  405. data/test/unit/vagrant/cli_test.rb +27 -0
  406. data/test/unit/vagrant/config/loader_test.rb +184 -0
  407. data/test/unit/vagrant/config/v1/dummy_config_test.rb +24 -0
  408. data/test/unit/vagrant/config/v1/loader_test.rb +145 -0
  409. data/test/unit/vagrant/config/v1/root_test.rb +40 -0
  410. data/test/unit/vagrant/config/v2/dummy_config_test.rb +24 -0
  411. data/test/unit/vagrant/config/v2/loader_test.rb +151 -0
  412. data/test/unit/vagrant/config/v2/root_test.rb +97 -0
  413. data/test/unit/vagrant/config/v2/util_test.rb +21 -0
  414. data/test/unit/vagrant/config_test.rb +66 -0
  415. data/test/unit/vagrant/environment_test.rb +721 -0
  416. data/test/unit/vagrant/guest_test.rb +166 -0
  417. data/test/unit/vagrant/hosts_test.rb +37 -0
  418. data/test/unit/vagrant/machine_state_test.rb +26 -0
  419. data/test/unit/vagrant/machine_test.rb +384 -0
  420. data/test/unit/vagrant/plugin/v1/command_test.rb +143 -0
  421. data/test/unit/vagrant/plugin/v1/communicator_test.rb +9 -0
  422. data/test/unit/vagrant/plugin/v1/config_test.rb +50 -0
  423. data/test/unit/vagrant/plugin/v1/host_test.rb +5 -0
  424. data/test/unit/vagrant/plugin/v1/manager_test.rb +114 -0
  425. data/test/unit/vagrant/plugin/v1/plugin_test.rb +267 -0
  426. data/test/unit/vagrant/plugin/v1/provider_test.rb +18 -0
  427. data/test/unit/vagrant/plugin/v2/command_test.rb +238 -0
  428. data/test/unit/vagrant/plugin/v2/communicator_test.rb +9 -0
  429. data/test/unit/vagrant/plugin/v2/components_test.rb +17 -0
  430. data/test/unit/vagrant/plugin/v2/config_test.rb +60 -0
  431. data/test/unit/vagrant/plugin/v2/host_test.rb +5 -0
  432. data/test/unit/vagrant/plugin/v2/manager_test.rb +174 -0
  433. data/test/unit/vagrant/plugin/v2/plugin_test.rb +305 -0
  434. data/test/unit/vagrant/plugin/v2/provider_test.rb +18 -0
  435. data/test/unit/vagrant/registry_test.rb +128 -0
  436. data/test/unit/vagrant/util/ansi_escape_code_remover_test.rb +16 -0
  437. data/test/unit/vagrant/util/downloader_test.rb +57 -0
  438. data/test/unit/vagrant/util/file_checksum_test.rb +23 -0
  439. data/test/unit/vagrant/util/hash_with_indifferent_access_test.rb +38 -0
  440. data/test/unit/vagrant/util/is_port_open_test.rb +53 -0
  441. data/test/unit/vagrant/util/line_endings_helper_test.rb +16 -0
  442. data/test/unit/vagrant/util/network_ip_test.rb +17 -0
  443. data/test/unit/vagrant/util/retryable_test.rb +106 -0
  444. data/test/unit/vagrant/util/safe_chdir_test.rb +43 -0
  445. data/test/unit/vagrant/util/scoped_hash_override_test.rb +48 -0
  446. data/test/unit/vagrant/util/ssh_test.rb +30 -0
  447. data/test/unit/vagrant/util/string_block_editor_test.rb +106 -0
  448. data/test/unit/vagrant/util/which_test.rb +43 -0
  449. data/test/unit/vagrant_test.rb +56 -0
  450. data/tnargav.gemspec +69 -0
  451. data/vagrant.gemspec +69 -0
  452. metadata +730 -0
@@ -0,0 +1,51 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Action
4
+ class Import
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.actions.vm.import.importing",
11
+ :name => env[:machine].box.name)
12
+
13
+ # Import the virtual machine
14
+ ovf_file = env[:machine].box.directory.join("box.ovf").to_s
15
+ env[:machine].id = env[:machine].provider.driver.import(ovf_file) do |progress|
16
+ env[:ui].clear_line
17
+ env[:ui].report_progress(progress, 100, false)
18
+ end
19
+
20
+ # Clear the line one last time since the progress meter doesn't disappear
21
+ # immediately.
22
+ env[:ui].clear_line
23
+
24
+ # If we got interrupted, then the import could have been
25
+ # interrupted and its not a big deal. Just return out.
26
+ return if env[:interrupted]
27
+
28
+ # Flag as erroneous and return if import failed
29
+ raise Vagrant::Errors::VMImportFailure if !env[:machine].id
30
+
31
+ # Import completed successfully. Continue the chain
32
+ @app.call(env)
33
+ end
34
+
35
+ def recover(env)
36
+ if env[:machine].provider.state.id != :not_created
37
+ return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)
38
+
39
+ # Interrupted, destroy the VM. We note that we don't want to
40
+ # validate the configuration here, and we don't want to confirm
41
+ # we want to destroy.
42
+ destroy_env = env.clone
43
+ destroy_env[:config_validate] = false
44
+ destroy_env[:force_confirm_destroy] = true
45
+ env[:action_runner].run(Action.action_destroy, destroy_env)
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Action
4
+ class IsPaused
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ # Set the result to be true if the machine is paused.
11
+ env[:result] = env[:machine].state.id == :paused
12
+
13
+ # Call the next if we have one (but we shouldn't, since this
14
+ # middleware is built to run with the Call-type middlewares)
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Action
4
+ class IsRunning
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ # Set the result to be true if the machine is running.
11
+ env[:result] = env[:machine].state.id == :running
12
+
13
+ # Call the next if we have one (but we shouldn't, since this
14
+ # middleware is built to run with the Call-type middlewares)
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Action
4
+ class IsSaved
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ # Set the result to be true if the machine is saved.
11
+ env[:result] = env[:machine].state.id == :saved
12
+
13
+ # Call the next if we have one (but we shouldn't, since this
14
+ # middleware is built to run with the Call-type middlewares)
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Action
4
+ class MatchMACAddress
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ raise Vagrant::Errors::VMBaseMacNotSpecified if !env[:machine].config.vm.base_mac
11
+
12
+ # Create the proc which we want to use to modify the virtual machine
13
+ env[:ui].info I18n.t("vagrant.actions.vm.match_mac.matching")
14
+ env[:machine].provider.driver.set_mac_address(env[:machine].config.vm.base_mac)
15
+
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Action
4
+ class MessageAlreadyRunning
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.commands.common.vm_already_running")
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Action
4
+ class MessageNotCreated
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.commands.common.vm_not_created")
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Action
4
+ class MessageNotRunning
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.commands.common.vm_not_running")
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ module VagrantPlugins
2
+ module ProviderVirtualBox
3
+ module Action
4
+ class MessageWillNotDestroy
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.commands.destroy.will_not_destroy",
11
+ :name => env[:machine].name)
12
+ @app.call(env)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,410 @@
1
+ require "set"
2
+
3
+ require "log4r"
4
+
5
+ require "vagrant/util/network_ip"
6
+ require "vagrant/util/scoped_hash_override"
7
+
8
+ module VagrantPlugins
9
+ module ProviderVirtualBox
10
+ module Action
11
+ # This middleware class sets up all networking for the VirtualBox
12
+ # instance. This includes host only networks, bridged networking,
13
+ # forwarded ports, etc.
14
+ #
15
+ # This handles all the `config.vm.network` configurations.
16
+ class Network
17
+ include Vagrant::Util::NetworkIP
18
+ include Vagrant::Util::ScopedHashOverride
19
+
20
+ def initialize(app, env)
21
+ @logger = Log4r::Logger.new("vagrant::plugins::virtualbox::network")
22
+ @app = app
23
+ end
24
+
25
+ def call(env)
26
+ # TODO: Validate network configuration prior to anything below
27
+ @env = env
28
+
29
+ # Get the list of network adapters from the configuration
30
+ network_adapters_config = env[:machine].provider_config.network_adapters.dup
31
+
32
+ # Assign the adapter slot for each high-level network
33
+ available_slots = Set.new(1..8)
34
+ network_adapters_config.each do |slot, _data|
35
+ available_slots.delete(slot)
36
+ end
37
+
38
+ @logger.debug("Available slots for high-level adapters: #{available_slots.inspect}")
39
+ @logger.info("Determining network adapters required for high-level configuration...")
40
+ available_slots = available_slots.to_a.sort
41
+ env[:machine].config.vm.networks.each do |type, options|
42
+ # We only handle private and public networks
43
+ next if type != :private_network && type != :public_network
44
+
45
+ options = scoped_hash_override(options, :virtualbox)
46
+
47
+ # Figure out the slot that this adapter will go into
48
+ slot = options[:adapter]
49
+ if !slot
50
+ if available_slots.empty?
51
+ raise Vagrant::Errors::VirtualBoxNoRoomForHighLevelNetwork
52
+ end
53
+
54
+ slot = available_slots.shift
55
+ end
56
+
57
+ # Configure it
58
+ data = nil
59
+ if type == :private_network
60
+ # private_network = hostonly
61
+ data = [:hostonly, options]
62
+ elsif type == :public_network
63
+ # public_network = bridged
64
+ data = [:bridged, options]
65
+ end
66
+
67
+ # Store it!
68
+ @logger.info(" -- Slot #{slot}: #{data[0]}")
69
+ network_adapters_config[slot] = data
70
+ end
71
+
72
+ @logger.info("Determining adapters and compiling network configuration...")
73
+ adapters = []
74
+ networks = []
75
+ network_adapters_config.each do |slot, data|
76
+ type = data[0]
77
+ options = data[1]
78
+
79
+ @logger.info("Network slot #{slot}. Type: #{type}.")
80
+
81
+ # Get the normalized configuration for this type
82
+ config = send("#{type}_config", options)
83
+ config[:adapter] = slot
84
+ @logger.debug("Normalized configuration: #{config.inspect}")
85
+
86
+ # Get the VirtualBox adapter configuration
87
+ adapter = send("#{type}_adapter", config)
88
+ adapters << adapter
89
+ @logger.debug("Adapter configuration: #{adapter.inspect}")
90
+
91
+ # Get the network configuration
92
+ network = send("#{type}_network_config", config)
93
+ network[:auto_config] = config[:auto_config]
94
+ networks << network
95
+ end
96
+
97
+ if !adapters.empty?
98
+ # Enable the adapters
99
+ @logger.info("Enabling adapters...")
100
+ env[:ui].info I18n.t("vagrant.actions.vm.network.preparing")
101
+ env[:machine].provider.driver.enable_adapters(adapters)
102
+ end
103
+
104
+ # Continue the middleware chain.
105
+ @app.call(env)
106
+
107
+ # If we have networks to configure, then we configure it now, since
108
+ # that requires the machine to be up and running.
109
+ if !adapters.empty? && !networks.empty?
110
+ assign_interface_numbers(networks, adapters)
111
+
112
+ # Only configure the networks the user requested us to configure
113
+ networks_to_configure = networks.select { |n| n[:auto_config] }
114
+ env[:ui].info I18n.t("vagrant.actions.vm.network.configuring")
115
+ env[:machine].guest.capability(:configure_networks, networks_to_configure)
116
+ end
117
+ end
118
+
119
+ def bridged_config(options)
120
+ return {
121
+ :auto_config => true,
122
+ :bridge => nil,
123
+ :mac => nil,
124
+ :nic_type => nil,
125
+ :use_dhcp_assigned_default_route => false
126
+ }.merge(options || {})
127
+ end
128
+
129
+ def bridged_adapter(config)
130
+ # Find the bridged interfaces that are available
131
+ bridgedifs = @env[:machine].provider.driver.read_bridged_interfaces
132
+ bridgedifs.delete_if { |interface| interface[:status] == "Down" }
133
+
134
+ # The name of the chosen bridge interface will be assigned to this
135
+ # variable.
136
+ chosen_bridge = nil
137
+
138
+ if config[:bridge]
139
+ @logger.debug("Bridge was directly specified in config, searching for: #{config[:bridge]}")
140
+
141
+ # Search for a matching bridged interface
142
+ bridgedifs.each do |interface|
143
+ if interface[:name].downcase == config[:bridge].downcase
144
+ @logger.debug("Specific bridge found as configured in the Vagrantfile. Using it.")
145
+ chosen_bridge = interface[:name]
146
+ break
147
+ end
148
+ end
149
+
150
+ # If one wasn't found, then we notify the user here.
151
+ if !chosen_bridge
152
+ @env[:ui].info I18n.t("vagrant.actions.vm.bridged_networking.specific_not_found",
153
+ :bridge => config[:bridge])
154
+ end
155
+ end
156
+
157
+ # If we still don't have a bridge chosen (this means that one wasn't
158
+ # specified in the Vagrantfile, or the bridge specified in the Vagrantfile
159
+ # wasn't found), then we fall back to the normal means of searchign for a
160
+ # bridged network.
161
+ if !chosen_bridge
162
+ if bridgedifs.length == 1
163
+ # One bridgable interface? Just use it.
164
+ chosen_bridge = bridgedifs[0][:name]
165
+ @logger.debug("Only one bridged interface available. Using it by default.")
166
+ else
167
+ # More than one bridgable interface requires a user decision, so
168
+ # show options to choose from.
169
+ @env[:ui].info I18n.t("vagrant.actions.vm.bridged_networking.available",
170
+ :prefix => false)
171
+ bridgedifs.each_index do |index|
172
+ interface = bridgedifs[index]
173
+ @env[:ui].info("#{index + 1}) #{interface[:name]}", :prefix => false)
174
+ end
175
+
176
+ # The range of valid choices
177
+ valid = Range.new(1, bridgedifs.length)
178
+
179
+ # The choice that the user has chosen as the bridging interface
180
+ choice = nil
181
+ while !valid.include?(choice)
182
+ choice = @env[:ui].ask("What interface should the network bridge to? ")
183
+ choice = choice.to_i
184
+ end
185
+
186
+ chosen_bridge = bridgedifs[choice - 1][:name]
187
+ end
188
+ end
189
+
190
+ @logger.info("Bridging adapter #{config[:adapter]} to #{chosen_bridge}")
191
+
192
+ # Given the choice we can now define the adapter we're using
193
+ return {
194
+ :adapter => config[:adapter],
195
+ :type => :bridged,
196
+ :bridge => chosen_bridge,
197
+ :mac_address => config[:mac],
198
+ :nic_type => config[:nic_type]
199
+ }
200
+ end
201
+
202
+ def bridged_network_config(config)
203
+ return {
204
+ :type => :dhcp,
205
+ :use_dhcp_assigned_default_route => config[:use_dhcp_assigned_default_route]
206
+ }
207
+ end
208
+
209
+ def hostonly_config(options)
210
+ options = {
211
+ :auto_config => true,
212
+ :mac => nil,
213
+ :netmask => "255.255.255.0",
214
+ :type => :static
215
+ }.merge(options)
216
+
217
+ # Make sure the type is a symbol
218
+ options[:type] = options[:type].to_sym
219
+
220
+ # Default IP is in the 20-bit private network block for DHCP based networks
221
+ options[:ip] = "172.28.128.1" if options[:type] == :dhcp
222
+
223
+ # Calculate our network address for the given IP/netmask
224
+ netaddr = network_address(options[:ip], options[:netmask])
225
+
226
+ # Verify that a host-only network subnet would not collide
227
+ # with a bridged networking interface.
228
+ #
229
+ # If the subnets overlap in any way then the host only network
230
+ # will not work because the routing tables will force the
231
+ # traffic onto the real interface rather than the VirtualBox
232
+ # interface.
233
+ @env[:machine].provider.driver.read_bridged_interfaces.each do |interface|
234
+ that_netaddr = network_address(interface[:ip], interface[:netmask])
235
+ raise Vagrant::Errors::NetworkCollision if \
236
+ netaddr == that_netaddr && interface[:status] != "Down"
237
+ end
238
+
239
+ # Split the IP address into its components
240
+ ip_parts = netaddr.split(".").map { |i| i.to_i }
241
+
242
+ # Calculate the adapter IP, which we assume is the IP ".1" at
243
+ # the end usually.
244
+ adapter_ip = ip_parts.dup
245
+ adapter_ip[3] += 1
246
+ options[:adapter_ip] ||= adapter_ip.join(".")
247
+
248
+ dhcp_options = {}
249
+ if options[:type] == :dhcp
250
+ # Calculate the DHCP server IP, which is the network address
251
+ # with the final octet + 2. So "172.28.0.0" turns into "172.28.0.2"
252
+ dhcp_ip = ip_parts.dup
253
+ dhcp_ip[3] += 2
254
+ dhcp_options[:dhcp_ip] ||= dhcp_ip.join(".")
255
+
256
+ # Calculate the lower and upper bound for the DHCP server
257
+ dhcp_lower = ip_parts.dup
258
+ dhcp_lower[3] += 3
259
+ dhcp_options[:dhcp_lower] ||= dhcp_lower.join(".")
260
+
261
+ dhcp_upper = ip_parts.dup
262
+ dhcp_upper[3] = 254
263
+ dhcp_options[:dhcp_upper] ||= dhcp_upper.join(".")
264
+ end
265
+
266
+ return {
267
+ :adapter_ip => options[:adapter_ip],
268
+ :auto_config => options[:auto_config],
269
+ :ip => options[:ip],
270
+ :mac => options[:mac],
271
+ :netmask => options[:netmask],
272
+ :nic_type => nil,
273
+ :type => options[:type]
274
+ }.merge(dhcp_options)
275
+ end
276
+
277
+ def hostonly_adapter(config)
278
+ @logger.info("Searching for matching hostonly network: #{config[:ip]}")
279
+ interface = hostonly_find_matching_network(config)
280
+
281
+ if !interface
282
+ @logger.info("Network not found. Creating if we can.")
283
+
284
+ # It is an error if a specific host only network name was specified
285
+ # but the network wasn't found.
286
+ if config[:name]
287
+ raise Vagrant::Errors::NetworkNotFound, :name => config[:name]
288
+ end
289
+
290
+ # Create a new network
291
+ interface = hostonly_create_network(config)
292
+ @logger.info("Created network: #{interface[:name]}")
293
+ end
294
+
295
+ if config[:type] == :dhcp
296
+ # Check that if there is a DHCP server attached on our interface,
297
+ # then it is identical. Otherwise, we can't set it.
298
+ if interface[:dhcp]
299
+ valid = interface[:dhcp][:ip] == config[:dhcp_ip] &&
300
+ interface[:dhcp][:lower] == config[:dhcp_lower] &&
301
+ interface[:dhcp][:upper] == config[:dhcp_upper]
302
+
303
+ raise Errors::NetworkDHCPAlreadyAttached if !valid
304
+
305
+ @logger.debug("DHCP server already properly configured")
306
+ else
307
+ # Configure the DHCP server for the network.
308
+ @logger.debug("Creating a DHCP server...")
309
+ @env[:machine].provider.driver.create_dhcp_server(interface[:name], config)
310
+ end
311
+ end
312
+
313
+ return {
314
+ :adapter => config[:adapter],
315
+ :hostonly => interface[:name],
316
+ :mac => config[:mac],
317
+ :nic_type => config[:nic_type],
318
+ :type => :hostonly
319
+ }
320
+ end
321
+
322
+ def hostonly_network_config(config)
323
+ return {
324
+ :type => config[:type],
325
+ :adapter_ip => config[:adapter_ip],
326
+ :ip => config[:ip],
327
+ :netmask => config[:netmask]
328
+ }
329
+ end
330
+
331
+ def nat_config(options)
332
+ return {
333
+ :auto_config => false
334
+ }
335
+ end
336
+
337
+ def nat_adapter(config)
338
+ return {
339
+ :adapter => config[:adapter],
340
+ :type => :nat,
341
+ }
342
+ end
343
+
344
+ def nat_network_config(config)
345
+ return {}
346
+ end
347
+
348
+ #-----------------------------------------------------------------
349
+ # Misc. helpers
350
+ #-----------------------------------------------------------------
351
+ # Assigns the actual interface number of a network based on the
352
+ # enabled NICs on the virtual machine.
353
+ #
354
+ # This interface number is used by the guest to configure the
355
+ # NIC on the guest VM.
356
+ #
357
+ # The networks are modified in place by adding an ":interface"
358
+ # field to each.
359
+ def assign_interface_numbers(networks, adapters)
360
+ current = 0
361
+ adapter_to_interface = {}
362
+
363
+ # Make a first pass to assign interface numbers by adapter location
364
+ vm_adapters = @env[:machine].provider.driver.read_network_interfaces
365
+ vm_adapters.sort.each do |number, adapter|
366
+ if adapter[:type] != :none
367
+ # Not used, so assign the interface number and increment
368
+ adapter_to_interface[number] = current
369
+ current += 1
370
+ end
371
+ end
372
+
373
+ # Make a pass through the adapters to assign the :interface
374
+ # key to each network configuration.
375
+ adapters.each_index do |i|
376
+ adapter = adapters[i]
377
+ network = networks[i]
378
+
379
+ # Figure out the interface number by simple lookup
380
+ network[:interface] = adapter_to_interface[adapter[:adapter]]
381
+ end
382
+ end
383
+
384
+ #-----------------------------------------------------------------
385
+ # Hostonly Helper Functions
386
+ #-----------------------------------------------------------------
387
+ # This creates a host only network for the given configuration.
388
+ def hostonly_create_network(config)
389
+ @env[:machine].provider.driver.create_host_only_network(
390
+ :adapter_ip => config[:adapter_ip],
391
+ :netmask => config[:netmask]
392
+ )
393
+ end
394
+
395
+ # This finds a matching host only network for the given configuration.
396
+ def hostonly_find_matching_network(config)
397
+ this_netaddr = network_address(config[:ip], config[:netmask])
398
+
399
+ @env[:machine].provider.driver.read_host_only_interfaces.each do |interface|
400
+ return interface if config[:name] && config[:name] == interface[:name]
401
+ return interface if this_netaddr == \
402
+ network_address(interface[:ip], interface[:netmask])
403
+ end
404
+
405
+ nil
406
+ end
407
+ end
408
+ end
409
+ end
410
+ end
@@ -0,0 +1,20 @@
1
+ require 'vagrant/action/general/package'
2
+
3
+ module VagrantPlugins
4
+ module ProviderVirtualBox
5
+ module Action
6
+ class Package < Vagrant::Action::General::Package
7
+ # Doing this so that we can test that the parent is properly
8
+ # called in the unit tests.
9
+ alias_method :general_call, :call
10
+ def call(env)
11
+ # Just match up a couple environmental variables so that
12
+ # the superclass will do the right thing. Then, call the
13
+ # superclass
14
+ env["package.directory"] = env["export.temp_dir"]
15
+ general_call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ require 'vagrant/util/template_renderer'
2
+
3
+ module VagrantPlugins
4
+ module ProviderVirtualBox
5
+ module Action
6
+ class PackageVagrantfile
7
+ # For TemplateRenderer
8
+ include Vagrant::Util
9
+
10
+ def initialize(app, env)
11
+ @app = app
12
+ end
13
+
14
+ def call(env)
15
+ @env = env
16
+ create_vagrantfile
17
+ @app.call(env)
18
+ end
19
+
20
+ # This method creates the auto-generated Vagrantfile at the root of the
21
+ # box. This Vagrantfile contains the MAC address so that the user doesn't
22
+ # have to worry about it.
23
+ def create_vagrantfile
24
+ File.open(File.join(@env["export.temp_dir"], "Vagrantfile"), "w") do |f|
25
+ f.write(TemplateRenderer.render("package_Vagrantfile", {
26
+ :base_mac => @env[:machine].provider.driver.read_mac_address
27
+ }))
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end