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,33 @@
1
+ # This is a shared example that tests that a command requires a
2
+ # Vagrant environment to run properly. The exact command to run
3
+ # should be given as a parameter to the shared examples.
4
+ shared_examples "a command that requires a Vagrantfile" do |*args|
5
+ let(:command) do
6
+ raise ArgumentError, "A command must be set for the shared example." if args.empty?
7
+ args[0]
8
+ end
9
+
10
+ it "fails if no Vagrantfile is found" do
11
+ result = execute(*command)
12
+ result.should_not succeed
13
+ result.stderr.should match_output(:no_vagrantfile)
14
+ end
15
+ end
16
+
17
+ # This is a shared example that tests that the command requires a
18
+ # virtual machine to be created, and additionally to be in one of
19
+ # many states.
20
+ shared_examples "a command that requires a virtual machine" do |*args|
21
+ let(:command) do
22
+ raise ArgumentError, "A command must be set for the shared example." if args.empty?
23
+ args[0]
24
+ end
25
+
26
+ it "fails if the virtual machine is not created" do
27
+ assert_execute("vagrant", "init")
28
+
29
+ result = execute(*command)
30
+ result.should_not succeed
31
+ result.stderr.should match_output(:error_vm_must_be_created)
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ require 'sys/proctable'
2
+
3
+ module Acceptance
4
+ module VirtualBox
5
+ extend self
6
+
7
+ # This method will wait for the "VBoxSVC" process to end. This will
8
+ # block during that time period. The reason for this is because only
9
+ # one "VBoxSVC" can run per user and manages all state within VirtualBox.
10
+ # Before you can run VirtualBox with a custom home directory, you must
11
+ # wait for this VBoxSVC process to die.
12
+ def wait_for_vboxsvc
13
+ time_passed = 0
14
+ while find_vboxsvc
15
+ if time_passed > 5
16
+ raise Exception, "VBoxSVC process is not going away."
17
+ end
18
+
19
+ sleep 1
20
+ time_passed += 1
21
+ end
22
+ end
23
+
24
+ # This method finds the VBoxSVC process and returns information about it.
25
+ # This will return "nil" if VBoxSVC is not found.
26
+ def find_vboxsvc
27
+ Sys::ProcTable.ps do |process|
28
+ if process.comm == "VBoxSVC"
29
+ return process
30
+ end
31
+ end
32
+
33
+ nil
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,56 @@
1
+ require File.expand_path("../base", __FILE__)
2
+ require "acceptance/support/shared/command_examples"
3
+
4
+ describe "vagrant suspend" do
5
+ include_context "acceptance"
6
+ it_behaves_like "a command that requires a Vagrantfile", ["vagrant", "suspend"]
7
+
8
+ it "succeeds and ignores if the VM is not created" do
9
+ require_box("default")
10
+
11
+ assert_execute("vagrant", "box", "add", "base", box_path("default"))
12
+ assert_execute("vagrant", "init")
13
+
14
+ result = assert_execute("vagrant", "suspend")
15
+ result.stdout.should match_output(:vm_not_created_warning)
16
+ end
17
+
18
+ it "is able to suspend a running virtual machine" do
19
+ require_box("default")
20
+
21
+ assert_execute("vagrant", "box", "add", "base", box_path("default"))
22
+ assert_execute("vagrant", "init")
23
+ assert_execute("vagrant", "up")
24
+
25
+ # Suspend the VM and assert that it worked properly (seemingly)
26
+ result = assert_execute("vagrant", "suspend")
27
+ result.stdout.should match_output(:vm_suspending)
28
+
29
+ # Assert that the VM is no longer running
30
+ result = assert_execute("vagrant", "status")
31
+ result.stdout.should match_output(:status, "default", "saved")
32
+ end
33
+
34
+ # These tests are parameterized since both "vagrant resume" and
35
+ # "vagrant up" should achieve the same result.
36
+ ["resume", "up"].each do |command|
37
+ it "is able to resume after the machine has been suspended using #{command}" do
38
+ require_box("default")
39
+
40
+ assert_execute("vagrant", "box", "add", "base", box_path("default"))
41
+ assert_execute("vagrant", "init")
42
+ assert_execute("vagrant", "up")
43
+ assert_execute("vagrant", "suspend")
44
+
45
+ # Assert that the VM is no longer running
46
+ result = assert_execute("vagrant", "status")
47
+ result.stdout.should match_output(:status, "default", "saved")
48
+
49
+ assert_execute("vagrant", command)
50
+
51
+ # Assert that the VM is once again running
52
+ result = assert_execute("vagrant", "status")
53
+ result.stdout.should match_output(:status, "default", "running")
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,33 @@
1
+ require File.expand_path("../base", __FILE__)
2
+ require "acceptance/support/shared/command_examples"
3
+
4
+ describe "vagrant up", "basics" do
5
+ include_context "acceptance"
6
+ it_behaves_like "a command that requires a Vagrantfile", ["vagrant", "up"]
7
+
8
+ # This creates an initial environment that is ready for a "vagrant up"
9
+ def initialize_valid_environment
10
+ require_box("default")
11
+
12
+ assert_execute("vagrant", "box", "add", "base", box_path("default"))
13
+ assert_execute("vagrant", "init")
14
+ end
15
+
16
+ it "brings up a running virtual machine" do
17
+ initialize_valid_environment
18
+
19
+ assert_execute("vagrant", "up")
20
+ result = assert_execute("vagrant", "status")
21
+ result.stdout.should match_output(:status, "default", "running")
22
+ end
23
+
24
+ it "is able to run if Vagrantfile is in a parent directory" do
25
+ initialize_valid_environment
26
+
27
+ # Create a subdirectory in the working directory and use
28
+ # that as the CWD for `vagrant up` and verify it still works
29
+ foodir = environment.workdir.join("foo")
30
+ foodir.mkdir
31
+ assert_execute("vagrant", "up", :chdir => foodir.to_s)
32
+ end
33
+ end
@@ -0,0 +1,40 @@
1
+ require File.expand_path("../base", __FILE__)
2
+ require "acceptance/support/shared/command_examples"
3
+
4
+ describe "vagrant up", "with a box URL set" do
5
+ include_context "acceptance"
6
+
7
+ it "downloads and brings up the VM if the box doesn't exist" do
8
+ require_box("default")
9
+
10
+ assert_execute("vagrant", "init", "base", box_path("default"))
11
+ result = assert_execute("vagrant", "up")
12
+ result.stdout.should match_output(:up_fetching_box, "base")
13
+ end
14
+
15
+ it "downloads the file only once and works if shared by multiple VMs", :issue => "GH-564" do
16
+ require_box("default")
17
+
18
+ environment.workdir.join("Vagrantfile").open("w+") do |f|
19
+ f.puts(<<-VFILE)
20
+ Vagrant::Config.run do |config|
21
+ config.vm.define :machine1 do |vm_config|
22
+ vm_config.vm.box = "base"
23
+ vm_config.vm.box_url = "#{box_path("default")}"
24
+ end
25
+
26
+ config.vm.define :machine2 do |vm_config|
27
+ vm_config.vm.box = "base"
28
+ vm_config.vm.box_url = "#{box_path("default")}"
29
+ end
30
+ end
31
+ VFILE
32
+ end
33
+
34
+ # Bring up the environment, which should work. `machine1` should download
35
+ # the box while `machine2` doesn't.
36
+ result = assert_execute("vagrant", "up")
37
+ result.stdout.should match_output(:up_fetching_box, "base", "machine1")
38
+ result.stdout.should_not match_output(:up_fetching_box, "base", "machine2")
39
+ end
40
+ end
@@ -0,0 +1,47 @@
1
+ require File.expand_path("../base", __FILE__)
2
+ require "acceptance/support/matchers/have_color"
3
+
4
+ describe "vagrant and color output" do
5
+ include_context "acceptance"
6
+
7
+ # This is a check to see if the `expect` program is installed on this
8
+ # computer. Some tests require this and if this doesn't exist then the
9
+ # test itself will be skipped.
10
+ def self.has_expect?
11
+ `which expect`
12
+ $?.success?
13
+ end
14
+
15
+ it "outputs color if there is a TTY", :if => has_expect? do
16
+ environment.workdir.join("color.exp").open("w+") do |f|
17
+ f.puts(<<-SCRIPT)
18
+ spawn #{environment.replace_command("vagrant")} status
19
+ expect default {}
20
+ SCRIPT
21
+ end
22
+
23
+ result = execute("expect", "color.exp")
24
+ result.stdout.should have_color
25
+ end
26
+
27
+ it "doesn't output color if there is a TTY but --no-color is present", :if => has_expect? do
28
+ environment.workdir.join("color.exp").open("w+") do |f|
29
+ f.puts(<<-SCRIPT)
30
+ spawn #{environment.replace_command("vagrant")} status --no-color
31
+ expect default {}
32
+ SCRIPT
33
+ end
34
+
35
+ result = execute("expect", "color.exp")
36
+ result.stdout.should_not have_color
37
+ end
38
+
39
+ it "doesn't output color in the absense of a TTY" do
40
+ # This should always output an error, which on a TTY would
41
+ # output color. We check that this doesn't output color.
42
+ # If `vagrant status` itself is broken, another acceptance test
43
+ # should catch that. We just assume it works here.
44
+ result = execute("vagrant", "status")
45
+ result.stdout.should_not have_color
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path("../base", __FILE__)
2
+
3
+ describe "vagrant version" do
4
+ include_context "acceptance"
5
+
6
+ it "prints the version when called with '-v'" do
7
+ result = execute("vagrant", "-v")
8
+ result.stdout.should match_output(:version, config.vagrant_version)
9
+ end
10
+
11
+ it "prints the version when called with '--version'" do
12
+ result = execute("vagrant", "--version")
13
+ result.stdout.should match_output(:version, config.vagrant_version)
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ # This is the list of required boxes for acceptance tests, and
2
+ # their locations. The locations are used to download the boxes
3
+ # on the fly, if necessary. Additionally, a SHA1 checksum is
4
+ # given to determine if the box needs to be updated.
5
+ - name: default
6
+ url: http://files.vagrantup.com/test/boxes/default.box
7
+ checksum: 1b0a7eb6e152c5b43f45485654ff4965a7f9f604
@@ -0,0 +1,46 @@
1
+ require "fileutils"
2
+ require "pathname"
3
+
4
+ require "log4r"
5
+
6
+ require "support/tempdir"
7
+
8
+ # This class manages an isolated environment for Vagrant to
9
+ # run in. It creates a temporary directory to act as the
10
+ # working directory as well as sets a custom home directory.
11
+ #
12
+ # This class also provides various helpers to create Vagrantfiles,
13
+ # boxes, etc.
14
+ class IsolatedEnvironment
15
+ attr_reader :homedir
16
+ attr_reader :workdir
17
+
18
+ # Initializes an isolated environment. You can pass in some
19
+ # options here to configure runing custom applications in place
20
+ # of others as well as specifying environmental variables.
21
+ #
22
+ # @param [Hash] apps A mapping of application name (such as "vagrant")
23
+ # to an alternate full path to the binary to run.
24
+ # @param [Hash] env Additional environmental variables to inject
25
+ # into the execution environments.
26
+ def initialize
27
+ @logger = Log4r::Logger.new("test::isolated_environment")
28
+
29
+ # Create a temporary directory for our work
30
+ @tempdir = Tempdir.new("vagrant")
31
+ @logger.info("Initialize isolated environment: #{@tempdir.path}")
32
+
33
+ # Setup the home and working directories
34
+ @homedir = Pathname.new(File.join(@tempdir.path, "home"))
35
+ @workdir = Pathname.new(File.join(@tempdir.path, "work"))
36
+
37
+ @homedir.mkdir
38
+ @workdir.mkdir
39
+ end
40
+
41
+ # This closes the environment by cleaning it up.
42
+ def close
43
+ @logger.info("Removing isolated environment: #{@tempdir.path}")
44
+ FileUtils.rm_rf(@tempdir.path)
45
+ end
46
+ end
@@ -0,0 +1,43 @@
1
+ require 'fileutils'
2
+ require 'tempfile'
3
+
4
+ # This class provides an easy way of creating a temporary
5
+ # directory and having it removed when the application exits.
6
+ class Tempdir
7
+ attr_reader :path
8
+
9
+ def initialize(basename="vagrant")
10
+ @path = nil
11
+
12
+ # Loop and attempt to create a temporary directory until
13
+ # it succeeds.
14
+ while @path.nil?
15
+ file = Tempfile.new(basename)
16
+ @path = file.path
17
+ file.unlink
18
+
19
+ begin
20
+ Dir.mkdir(@path)
21
+ rescue
22
+ @path = nil
23
+ end
24
+ end
25
+
26
+ # Setup a finalizer to delete the directory. This is the same way
27
+ # that Tempfile and friends do this...
28
+ @cleanup_proc = lambda do
29
+ FileUtils.rm_rf(@path) if File.directory?(@path)
30
+ end
31
+
32
+ ObjectSpace.define_finalizer(self, @cleanup_proc)
33
+ end
34
+
35
+ # This deletes the temporary directory.
36
+ def unlink
37
+ # Delete the directory
38
+ @cleanup_proc.call
39
+
40
+ # Undefine the finalizer since we're all cleaned up
41
+ ObjectSpace.undefine_finalizer(self)
42
+ end
43
+ end
data/test/unit/base.rb ADDED
@@ -0,0 +1,27 @@
1
+ require "rubygems"
2
+ require "rspec/autorun"
3
+
4
+ # Require Vagrant itself so we can reference the proper
5
+ # classes to test.
6
+ require "vagrant"
7
+
8
+ # Add the test directory to the load path
9
+ $:.unshift File.expand_path("../../", __FILE__)
10
+
11
+ # Load in helpers
12
+ require "support/tempdir"
13
+ require "unit/support/dummy_provider"
14
+ require "unit/support/shared/base_context"
15
+
16
+ # Do not buffer output
17
+ $stdout.sync = true
18
+ $stderr.sync = true
19
+
20
+ # Configure RSpec
21
+ RSpec.configure do |c|
22
+ c.expect_with :rspec, :stdlib
23
+ end
24
+
25
+ # Configure VAGRANT_CWD so that the tests never find an actual
26
+ # Vagrantfile anywhere, or at least this minimizes those chances.
27
+ ENV["VAGRANT_CWD"] = Tempdir.new.path
@@ -0,0 +1,16 @@
1
+ module VagrantTests
2
+ class DummyProviderPlugin < Vagrant.plugin("2")
3
+ name "Dummy Provider"
4
+ description <<-EOF
5
+ This creates a provider named "dummy" which does nothing, so that
6
+ the unit tests aren't reliant on VirtualBox (or any other real
7
+ provider for that matter).
8
+ EOF
9
+
10
+ provider(:dummy) { DummyProvider }
11
+ end
12
+
13
+ class DummyProvider < Vagrant.plugin("2", :provider)
14
+ # No-op
15
+ end
16
+ end
@@ -0,0 +1,179 @@
1
+ require "fileutils"
2
+ require "pathname"
3
+ require "tempfile"
4
+
5
+ require "json"
6
+ require "log4r"
7
+
8
+ require "vagrant/util/platform"
9
+ require "vagrant/util/subprocess"
10
+
11
+ require "support/isolated_environment"
12
+ require "support/tempdir"
13
+
14
+ module Unit
15
+ class IsolatedEnvironment < ::IsolatedEnvironment
16
+ def create_vagrant_env(options=nil)
17
+ options = {
18
+ :cwd => @workdir,
19
+ :home_path => @homedir
20
+ }.merge(options || {})
21
+
22
+ Vagrant::Environment.new(options)
23
+ end
24
+
25
+ # This creates a file in the isolated environment. By default this file
26
+ # will be created in the working directory of the isolated environment.
27
+ def file(name, contents)
28
+ @workdir.join(name).open("w+") do |f|
29
+ f.write(contents)
30
+ end
31
+ end
32
+
33
+ def vagrantfile(contents, root=nil)
34
+ root ||= @workdir
35
+ root.join("Vagrantfile").open("w+") do |f|
36
+ f.write(contents)
37
+ end
38
+ end
39
+
40
+ def box(name, vagrantfile_contents="")
41
+ # Create the box directory
42
+ box_dir = boxes_dir.join(name)
43
+ box_dir.mkpath
44
+
45
+ # Create the "box.ovf" file because that is how Vagrant heuristically
46
+ # determines a box is a V1 box.
47
+ box_dir.join("box.ovf").open("w") { |f| f.write("") }
48
+
49
+ # Populate the vagrantfile
50
+ vagrantfile(vagrantfile_contents, box_dir)
51
+
52
+ # Return the directory
53
+ box_dir
54
+ end
55
+
56
+ # Create an alias because "box" makes a V1 box, so "box1"
57
+ alias :box1 :box
58
+
59
+ # Creates a fake box to exist in this environment.
60
+ #
61
+ # @param [String] name Name of the box
62
+ # @param [Symbol] provider Provider the box was built for.
63
+ # @return [Pathname] Path to the box directory.
64
+ def box2(name, provider, options=nil)
65
+ # Default options
66
+ options = {
67
+ :vagrantfile => ""
68
+ }.merge(options || {})
69
+
70
+ # Make the box directory
71
+ box_dir = boxes_dir.join(name, provider.to_s)
72
+ box_dir.mkpath
73
+
74
+ # Create a metadata.json file
75
+ box_metadata_file = box_dir.join("metadata.json")
76
+ box_metadata_file.open("w") do |f|
77
+ f.write(JSON.generate({
78
+ :provider => provider.to_s
79
+ }))
80
+ end
81
+
82
+ # Create a Vagrantfile
83
+ box_vagrantfile = box_dir.join("Vagrantfile")
84
+ box_vagrantfile.open("w") do |f|
85
+ f.write(options[:vagrantfile])
86
+ end
87
+
88
+ # Return the box directory
89
+ box_dir
90
+ end
91
+
92
+ # This creates a "box" file that is a valid V1 box.
93
+ #
94
+ # @return [Pathname] Path to the newly created box.
95
+ def box1_file
96
+ # Create a temporary directory to store our data we will tar up
97
+ td_source = Tempdir.new
98
+ td_dest = Tempdir.new
99
+
100
+ # Store the temporary directory so it is not deleted until
101
+ # this instance is garbage collected.
102
+ @_box2_file_temp ||= []
103
+ @_box2_file_temp << td_dest
104
+
105
+ # The source as a Pathname, which is easier to work with
106
+ source = Pathname.new(td_source.path)
107
+
108
+ # The destination file
109
+ result = Pathname.new(td_dest.path).join("temporary.box")
110
+
111
+ # Put a "box.ovf" in there.
112
+ source.join("box.ovf").open("w") do |f|
113
+ f.write("FOO!")
114
+ end
115
+
116
+ Dir.chdir(source) do
117
+ # Find all the files in our current directory and tar it up!
118
+ files = Dir.glob(File.join(".", "**", "*"))
119
+
120
+ # Package!
121
+ Vagrant::Util::Subprocess.execute("bsdtar", "-czf", result.to_s, *files)
122
+ end
123
+
124
+ # Resulting box
125
+ result
126
+ end
127
+
128
+ # This creates a "box" file with the given provider.
129
+ #
130
+ # @param [Symbol] provider Provider for the box.
131
+ # @return [Pathname] Path to the newly created box.
132
+ def box2_file(provider, options=nil)
133
+ options ||= {}
134
+
135
+ # This is the metadata we want to store in our file
136
+ metadata = {
137
+ "type" => "v2_box",
138
+ "provider" => provider
139
+ }.merge(options[:metadata] || {})
140
+
141
+ # Create a temporary directory to store our data we will tar up
142
+ td_source = Tempdir.new
143
+ td_dest = Tempdir.new
144
+
145
+ # Store the temporary directory so it is not deleted until
146
+ # this instance is garbage collected.
147
+ @_box2_file_temp ||= []
148
+ @_box2_file_temp << td_dest
149
+
150
+ # The source as a Pathname, which is easier to work with
151
+ source = Pathname.new(td_source.path)
152
+
153
+ # The destination file
154
+ result = Pathname.new(td_dest.path).join("temporary.box")
155
+
156
+ # Put the metadata.json in here.
157
+ source.join("metadata.json").open("w") do |f|
158
+ f.write(JSON.generate(metadata))
159
+ end
160
+
161
+ Dir.chdir(source) do
162
+ # Find all the files in our current directory and tar it up!
163
+ files = Dir.glob(File.join(".", "**", "*"))
164
+
165
+ # Package!
166
+ Vagrant::Util::Subprocess.execute("bsdtar", "-czf", result.to_s, *files)
167
+ end
168
+
169
+ # Resulting box
170
+ result
171
+ end
172
+
173
+ def boxes_dir
174
+ dir = @homedir.join("boxes")
175
+ dir.mkpath
176
+ dir
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,104 @@
1
+ require "tempfile"
2
+
3
+ require "support/tempdir"
4
+ require "unit/support/isolated_environment"
5
+
6
+ shared_context "unit" do
7
+ before(:each) do
8
+ # State to store the list of registered plugins that we have to
9
+ # unregister later.
10
+ @_plugins = []
11
+
12
+ # Create a thing to store our temporary files so that they aren't
13
+ # unlinked right away.
14
+ @_temp_files = []
15
+ end
16
+
17
+ after(:each) do
18
+ # Unregister each of the plugins we have may have temporarily
19
+ # registered for the duration of this test.
20
+ @_plugins.each do |plugin|
21
+ Vagrant.plugin("1").manager.unregister(plugin)
22
+ Vagrant.plugin("2").manager.unregister(plugin)
23
+ end
24
+ end
25
+
26
+ # This creates an isolated environment so that Vagrant doesn't
27
+ # muck around with your real system during unit tests.
28
+ #
29
+ # The returned isolated environment has a variety of helper
30
+ # methods on it to easily create files, Vagrantfiles, boxes,
31
+ # etc.
32
+ def isolated_environment
33
+ env = Unit::IsolatedEnvironment.new
34
+ yield env if block_given?
35
+ env
36
+ end
37
+
38
+ # This registers a Vagrant plugin for the duration of a single test.
39
+ # This will yield a new plugin class that you can then call the
40
+ # public plugin methods on.
41
+ #
42
+ # @yield [plugin] Yields the plugin class for you to call the public
43
+ # API that you need to.
44
+ def register_plugin(version=nil)
45
+ version ||= Vagrant::Config::CURRENT_VERSION
46
+ plugin = Class.new(Vagrant.plugin(version))
47
+ plugin.name("Test Plugin #{plugin.inspect}")
48
+ yield plugin if block_given?
49
+ @_plugins << plugin
50
+ plugin
51
+ end
52
+
53
+ # This helper creates a temporary file and returns a Pathname
54
+ # object pointed to it.
55
+ #
56
+ # @return [Pathname]
57
+ def temporary_file(contents=nil)
58
+ f = Tempfile.new("vagrant-unit")
59
+
60
+ if contents
61
+ f.write(contents)
62
+ f.flush
63
+ end
64
+
65
+ # Store the tempfile in an instance variable so that it is not
66
+ # garbage collected, so that the tempfile is not unlinked.
67
+ @_temp_files << f
68
+
69
+ return Pathname.new(f.path)
70
+ end
71
+
72
+ # This creates a temporary directory and returns a {Pathname}
73
+ # pointing to it.
74
+ #
75
+ # @return [Pathname]
76
+ def temporary_dir
77
+ # Create a temporary directory and append it to the instance
78
+ # variabe so that it isn't garbage collected and deleted
79
+ d = Tempdir.new("vagrant-unit")
80
+ @_temp_files << d
81
+
82
+ # Return the pathname
83
+ return Pathname.new(d.path)
84
+ end
85
+
86
+ # This helper provides temporary environmental variable changes.
87
+ def with_temp_env(environment)
88
+ # Build up the new environment, preserving the old values so we
89
+ # can replace them back in later.
90
+ old_env = {}
91
+ environment.each do |key, value|
92
+ old_env[key] = ENV[key]
93
+ ENV[key] = value
94
+ end
95
+
96
+ # Call the block, returning its return value
97
+ return yield
98
+ ensure
99
+ # Reset the environment no matter what
100
+ old_env.each do |key, value|
101
+ ENV[key] = value
102
+ end
103
+ end
104
+ end