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,229 @@
1
+ require "set"
2
+
3
+ require "log4r"
4
+
5
+ module Vagrant
6
+ module Plugin
7
+ module V1
8
+ # This is the superclass for all V1 plugins.
9
+ class Plugin
10
+ # Special marker that can be used for action hooks that matches
11
+ # all action sequences.
12
+ ALL_ACTIONS = :__all_actions__
13
+
14
+ # The logger for this class.
15
+ LOGGER = Log4r::Logger.new("vagrant::plugin::v1::plugin")
16
+
17
+ # Set the root class up to be ourself, so that we can reference this
18
+ # from within methods which are probably in subclasses.
19
+ ROOT_CLASS = self
20
+
21
+ # This returns the manager for all V1 plugins.
22
+ #
23
+ # @return [V1::Manager]
24
+ def self.manager
25
+ @manager ||= Manager.new
26
+ end
27
+
28
+ # Set the name of the plugin. The moment that this is called, the
29
+ # plugin will be registered and available. Before this is called, a
30
+ # plugin does not exist. The name must be unique among all installed
31
+ # plugins.
32
+ #
33
+ # @param [String] name Name of the plugin.
34
+ # @return [String] The name of the plugin.
35
+ def self.name(name=UNSET_VALUE)
36
+ # Get or set the value first, so we have a name for logging when
37
+ # we register.
38
+ result = get_or_set(:name, name)
39
+
40
+ # The plugin should be registered if we're setting a real name on it
41
+ Plugin.manager.register(self) if name != UNSET_VALUE
42
+
43
+ # Return the result
44
+ result
45
+ end
46
+
47
+ # Sets a human-friendly descrition of the plugin.
48
+ #
49
+ # @param [String] value Description of the plugin.
50
+ # @return [String] Description of the plugin.
51
+ def self.description(value=UNSET_VALUE)
52
+ get_or_set(:description, value)
53
+ end
54
+
55
+ # Registers a callback to be called when a specific action sequence
56
+ # is run. This allows plugin authors to hook into things like VM
57
+ # bootup, VM provisioning, etc.
58
+ #
59
+ # @param [Symbol] name Name of the action.
60
+ # @return [Array] List of the hooks for the given action.
61
+ def self.action_hook(name, &block)
62
+ # Get the list of hooks for the given hook name
63
+ data[:action_hooks] ||= {}
64
+ hooks = data[:action_hooks][name.to_sym] ||= []
65
+
66
+ # Return the list if we don't have a block
67
+ return hooks if !block_given?
68
+
69
+ # Otherwise add the block to the list of hooks for this action.
70
+ hooks << block
71
+ end
72
+
73
+ # Defines additional command line commands available by key. The key
74
+ # becomes the subcommand, so if you register a command "foo" then
75
+ # "vagrant foo" becomes available.
76
+ #
77
+ # @param [String] name Subcommand key.
78
+ def self.command(name=UNSET_VALUE, &block)
79
+ data[:command] ||= Registry.new
80
+
81
+ if name != UNSET_VALUE
82
+ # Validate the name of the command
83
+ if name.to_s !~ /^[-a-z0-9]+$/i
84
+ raise InvalidCommandName, "Commands can only contain letters, numbers, and hyphens"
85
+ end
86
+
87
+ # Register a new command class only if a name was given.
88
+ data[:command].register(name.to_sym, &block)
89
+ end
90
+
91
+ # Return the registry
92
+ data[:command]
93
+ end
94
+
95
+ # Defines additional communicators to be available. Communicators
96
+ # should be returned by a block passed to this method. This is done
97
+ # to ensure that the class is lazy loaded, so if your class inherits
98
+ # from or uses any Vagrant internals specific to Vagrant 1.0, then
99
+ # the plugin can still be defined without breaking anything in future
100
+ # versions of Vagrant.
101
+ #
102
+ # @param [String] name Communicator name.
103
+ def self.communicator(name=UNSET_VALUE, &block)
104
+ data[:communicator] ||= Registry.new
105
+
106
+ # Register a new communicator class only if a name was given.
107
+ data[:communicator].register(name.to_sym, &block) if name != UNSET_VALUE
108
+
109
+ # Return the registry
110
+ data[:communicator]
111
+ end
112
+
113
+ # Defines additional configuration keys to be available in the
114
+ # Vagrantfile. The configuration class should be returned by a
115
+ # block passed to this method. This is done to ensure that the class
116
+ # is lazy loaded, so if your class inherits from any classes that
117
+ # are specific to Vagrant 1.0, then the plugin can still be defined
118
+ # without breaking anything in future versions of Vagrant.
119
+ #
120
+ # @param [String] name Configuration key.
121
+ # @param [Boolean] upgrade_safe If this is true, then this configuration
122
+ # key is safe to load during an upgrade, meaning that it depends
123
+ # on NO Vagrant internal classes. Do _not_ set this to true unless
124
+ # you really know what you're doing, since you can cause Vagrant
125
+ # to crash (although Vagrant will output a user-friendly error
126
+ # message if this were to happen).
127
+ def self.config(name=UNSET_VALUE, upgrade_safe=false, &block)
128
+ data[:config] ||= Registry.new
129
+
130
+ # Register a new config class only if a name was given.
131
+ if name != UNSET_VALUE
132
+ data[:config].register(name.to_sym, &block)
133
+
134
+ # If we were told this is an upgrade safe configuration class
135
+ # then we add it to the set.
136
+ if upgrade_safe
137
+ data[:config_upgrade_safe] ||= Set.new
138
+ data[:config_upgrade_safe].add(name.to_sym)
139
+ end
140
+ end
141
+
142
+ # Return the registry
143
+ data[:config]
144
+ end
145
+
146
+ # Defines an additionally available guest implementation with
147
+ # the given key.
148
+ #
149
+ # @param [String] name Name of the guest.
150
+ def self.guest(name=UNSET_VALUE, &block)
151
+ data[:guests] ||= Registry.new
152
+
153
+ # Register a new guest class only if a name was given
154
+ data[:guests].register(name.to_sym, &block) if name != UNSET_VALUE
155
+
156
+ # Return the registry
157
+ data[:guests]
158
+ end
159
+
160
+ # Defines an additionally available host implementation with
161
+ # the given key.
162
+ #
163
+ # @param [String] name Name of the host.
164
+ def self.host(name=UNSET_VALUE, &block)
165
+ data[:hosts] ||= Registry.new
166
+
167
+ # Register a new host class only if a name was given
168
+ data[:hosts].register(name.to_sym, &block) if name != UNSET_VALUE
169
+
170
+ # Return the registry
171
+ data[:hosts]
172
+ end
173
+
174
+ # Registers additional providers to be available.
175
+ #
176
+ # @param [Symbol] name Name of the provider.
177
+ def self.provider(name=UNSET_VALUE, &block)
178
+ data[:providers] ||= Registry.new
179
+
180
+ # Register a new provider class only if a name was given
181
+ data[:providers].register(name.to_sym, &block) if name != UNSET_VALUE
182
+
183
+ # Return the registry
184
+ data[:providers]
185
+ end
186
+
187
+ # Registers additional provisioners to be available.
188
+ #
189
+ # @param [String] name Name of the provisioner.
190
+ def self.provisioner(name=UNSET_VALUE, &block)
191
+ data[:provisioners] ||= Registry.new
192
+
193
+ # Register a new provisioner class only if a name was given
194
+ data[:provisioners].register(name.to_sym, &block) if name != UNSET_VALUE
195
+
196
+ # Return the registry
197
+ data[:provisioners]
198
+ end
199
+
200
+ # Returns the internal data associated with this plugin. This
201
+ # should NOT be called by the general public.
202
+ #
203
+ # @return [Hash]
204
+ def self.data
205
+ @data ||= {}
206
+ end
207
+
208
+ protected
209
+
210
+ # Sentinel value denoting that a value has not been set.
211
+ UNSET_VALUE = Object.new
212
+
213
+ # Helper method that will set a value if a value is given, or otherwise
214
+ # return the already set value.
215
+ #
216
+ # @param [Symbol] key Key for the data
217
+ # @param [Object] value Value to store.
218
+ # @return [Object] Stored value.
219
+ def self.get_or_set(key, value=UNSET_VALUE)
220
+ # If no value is to be set, then return the value we have already set
221
+ return data[key] if value.eql?(UNSET_VALUE)
222
+
223
+ # Otherwise set the value
224
+ data[key] = value
225
+ end
226
+ end
227
+ end
228
+ end
229
+ end
@@ -0,0 +1,68 @@
1
+ module Vagrant
2
+ module Plugin
3
+ module V1
4
+ # This is the base class for a provider for the V1 API. A provider
5
+ # is responsible for creating compute resources to match the needs
6
+ # of a Vagrant-configured system.
7
+ class Provider
8
+ # Initialize the provider to represent the given machine.
9
+ #
10
+ # @param [Vagrant::Machine] machine The machine that this provider
11
+ # is responsible for.
12
+ def initialize(machine)
13
+ end
14
+
15
+ # This should return an action callable for the given name.
16
+ #
17
+ # @param [Symbol] name Name of the action.
18
+ # @return [Object] A callable action sequence object, whether it
19
+ # is a proc, object, etc.
20
+ def action(name)
21
+ nil
22
+ end
23
+
24
+ # This method is called if the underying machine ID changes. Providers
25
+ # can use this method to load in new data for the actual backing
26
+ # machine or to realize that the machine is now gone (the ID can
27
+ # become `nil`). No parameters are given, since the underlying machine
28
+ # is simply the machine instance given to this object. And no
29
+ # return value is necessary.
30
+ def machine_id_changed
31
+ end
32
+
33
+ # This should return a hash of information that explains how to
34
+ # SSH into the machine. If the machine is not at a point where
35
+ # SSH is even possible, then `nil` should be returned.
36
+ #
37
+ # The general structure of this returned hash should be the
38
+ # following:
39
+ #
40
+ # {
41
+ # :host => "1.2.3.4",
42
+ # :port => "22",
43
+ # :username => "mitchellh",
44
+ # :private_key_path => "/path/to/my/key"
45
+ # }
46
+ #
47
+ # **Note:** Vagrant only supports private key based authentication,
48
+ # mainly for the reason that there is no easy way to exec into an
49
+ # `ssh` prompt with a password, whereas we can pass a private key
50
+ # via commandline.
51
+ #
52
+ # @return [Hash] SSH information. For the structure of this hash
53
+ # read the accompanying documentation for this method.
54
+ def ssh_info
55
+ nil
56
+ end
57
+
58
+ # This should return the state of the machine within this provider.
59
+ # The state can be any symbol.
60
+ #
61
+ # @return [Symbol]
62
+ def state
63
+ nil
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,50 @@
1
+ module Vagrant
2
+ module Plugin
3
+ module V1
4
+ # This is the base class for a provisioner for the V1 API. A provisioner
5
+ # is primarily responsible for installing software on a Vagrant guest.
6
+ class Provisioner
7
+ # The environment which provisioner is running in. This is the
8
+ # action environment, not a Vagrant::Environment.
9
+ attr_reader :env
10
+
11
+ # The configuration for this provisioner. This will be an instance of
12
+ # the `Config` class which is part of the provisioner.
13
+ attr_reader :config
14
+
15
+ def initialize(env, config)
16
+ @env = env
17
+ @config = config
18
+ end
19
+
20
+ # This method is expected to return a class that is used for
21
+ # configuring the provisioner. This return value is expected to be
22
+ # a subclass of {Config}.
23
+ #
24
+ # @return [Config]
25
+ def self.config_class
26
+ end
27
+
28
+ # This is the method called to "prepare" the provisioner. This is called
29
+ # before any actions are run by the action runner (see {Vagrant::Actions::Runner}).
30
+ # This can be used to setup shared folders, forward ports, etc. Whatever is
31
+ # necessary on a "meta" level.
32
+ #
33
+ # No return value is expected.
34
+ def prepare
35
+ end
36
+
37
+ # This is the method called to provision the system. This method
38
+ # is expected to do whatever necessary to provision the system (create files,
39
+ # SSH, etc.)
40
+ def provision!
41
+ end
42
+
43
+ # This is the method called to when the system is being destroyed
44
+ # and allows the provisioners to engage in any cleanup tasks necessary.
45
+ def cleanup
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,19 @@
1
+ require "log4r"
2
+
3
+ require "vagrant/plugin/v1/errors"
4
+
5
+ module Vagrant
6
+ module Plugin
7
+ module V1
8
+ autoload :Command, "vagrant/plugin/v1/command"
9
+ autoload :Communicator, "vagrant/plugin/v1/communicator"
10
+ autoload :Config, "vagrant/plugin/v1/config"
11
+ autoload :Guest, "vagrant/plugin/v1/guest"
12
+ autoload :Host, "vagrant/plugin/v1/host"
13
+ autoload :Manager, "vagrant/plugin/v1/manager"
14
+ autoload :Plugin, "vagrant/plugin/v1/plugin"
15
+ autoload :Provider, "vagrant/plugin/v1/provider"
16
+ autoload :Provisioner, "vagrant/plugin/v1/provisioner"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,234 @@
1
+ require 'log4r'
2
+
3
+ require "vagrant/util/safe_puts"
4
+
5
+ module Vagrant
6
+ module Plugin
7
+ module V2
8
+ # This is the base class for a CLI command.
9
+ class Command
10
+ include Util::SafePuts
11
+
12
+ def initialize(argv, env)
13
+ @argv = argv
14
+ @env = env
15
+ @logger = Log4r::Logger.new("vagrant::command::#{self.class.to_s.downcase}")
16
+ end
17
+
18
+ # This is what is called on the class to actually execute it. Any
19
+ # subclasses should implement this method and do any option parsing
20
+ # and validation here.
21
+ def execute
22
+ end
23
+
24
+ protected
25
+
26
+ # Parses the options given an OptionParser instance.
27
+ #
28
+ # This is a convenience method that properly handles duping the
29
+ # originally argv array so that it is not destroyed.
30
+ #
31
+ # This method will also automatically detect "-h" and "--help"
32
+ # and print help. And if any invalid options are detected, the help
33
+ # will be printed, as well.
34
+ #
35
+ # If this method returns `nil`, then you should assume that help
36
+ # was printed and parsing failed.
37
+ def parse_options(opts=nil)
38
+ # Creating a shallow copy of the arguments so the OptionParser
39
+ # doesn't destroy the originals.
40
+ argv = @argv.dup
41
+
42
+ # Default opts to a blank optionparser if none is given
43
+ opts ||= OptionParser.new
44
+
45
+ # Add the help option, which must be on every command.
46
+ opts.on_tail("-h", "--help", "Print this help") do
47
+ safe_puts(opts.help)
48
+ return nil
49
+ end
50
+
51
+ opts.parse!(argv)
52
+ return argv
53
+ rescue OptionParser::InvalidOption
54
+ raise Errors::CLIInvalidOptions, :help => opts.help.chomp
55
+ end
56
+
57
+ # Yields a VM for each target VM for the command.
58
+ #
59
+ # This is a convenience method for easily implementing methods that
60
+ # take a target VM (in the case of multi-VM) or every VM if no
61
+ # specific VM name is specified.
62
+ #
63
+ # @param [String] name The name of the VM. Nil if every VM.
64
+ # @param [Hash] options Additional tweakable settings.
65
+ # @option options [Symbol] :provider The provider to back the
66
+ # machines with. All machines will be backed with this
67
+ # provider. If none is given, a sensible default is chosen.
68
+ # @option options [Boolean] :reverse If true, the resulting order
69
+ # of machines is reversed.
70
+ # @option options [Boolean] :single_target If true, then an
71
+ # exception will be raised if more than one target is found.
72
+ def with_target_vms(names=nil, options=nil)
73
+ @logger.debug("Getting target VMs for command. Arguments:")
74
+ @logger.debug(" -- names: #{names.inspect}")
75
+ @logger.debug(" -- options: #{options.inspect}")
76
+
77
+ # Using VMs requires a Vagrant environment to be properly setup
78
+ raise Errors::NoEnvironmentError if !@env.root_path
79
+
80
+ # Setup the options hash
81
+ options ||= {}
82
+
83
+ # Require that names be an array
84
+ names ||= []
85
+ names = [names] if !names.is_a?(Array)
86
+
87
+ # This is a helper that gets a single machine with the proper
88
+ # provider. The "proper provider" in this case depends on what was
89
+ # given:
90
+ #
91
+ # * If a provider was explicitly specified, then use that provider.
92
+ # But if an active machine exists with a DIFFERENT provider,
93
+ # then throw an error (for now), since we don't yet support
94
+ # bringing up machines with different providers.
95
+ #
96
+ # * If no provider was specified, then use the active machine's
97
+ # provider if it exists, otherwise use the default provider.
98
+ #
99
+ get_machine = lambda do |name|
100
+ # Check for an active machine with the same name
101
+ provider_to_use = options[:provider]
102
+ provider_to_use = provider_to_use.to_sym if provider_to_use
103
+
104
+ @env.active_machines.each do |active_name, active_provider|
105
+ if name == active_name
106
+ # We found an active machine with the same name
107
+
108
+ if provider_to_use && provider_to_use != active_provider
109
+ # We found an active machine with a provider that doesn't
110
+ # match the requested provider. Show an error.
111
+ raise Errors::ActiveMachineWithDifferentProvider,
112
+ :name => active_name.to_s,
113
+ :active_provider => active_provider.to_s,
114
+ :requested_provider => provider_to_use.to_s
115
+ else
116
+ # Use this provider and exit out of the loop. One of the
117
+ # invariants [for now] is that there shouldn't be machines
118
+ # with multiple providers.
119
+ @logger.info("Active machine found with name #{active_name}. " +
120
+ "Using provider: #{active_provider}")
121
+ provider_to_use = active_provider
122
+ break
123
+ end
124
+ end
125
+ end
126
+
127
+ # Use the default provider if nothing else
128
+ provider_to_use ||= @env.default_provider
129
+
130
+ # Get the right machine with the right provider
131
+ @env.machine(name, provider_to_use)
132
+ end
133
+
134
+ # First determine the proper array of VMs.
135
+ machines = []
136
+ if names.length > 0
137
+ names.each do |name|
138
+ if pattern = name[/^\/(.+?)\/$/, 1]
139
+ @logger.debug("Finding machines that match regex: #{pattern}")
140
+
141
+ # This is a regular expression name, so we convert to a regular
142
+ # expression and allow that sort of matching.
143
+ regex = Regexp.new(pattern)
144
+
145
+ @env.machine_names.each do |machine_name|
146
+ if machine_name =~ regex
147
+ machines << get_machine.call(machine_name)
148
+ end
149
+ end
150
+
151
+ raise Errors::VMNoMatchError if machines.empty?
152
+ else
153
+ # String name, just look for a specific VM
154
+ @logger.debug("Finding machine that match name: #{name}")
155
+ machines << get_machine.call(name.to_sym)
156
+ raise Errors::VMNotFoundError, :name => name if !machines[0]
157
+ end
158
+ end
159
+ else
160
+ # No name was given, so we return every VM in the order
161
+ # configured.
162
+ @logger.debug("Loading all machines...")
163
+ machines = @env.machine_names.map do |machine_name|
164
+ get_machine.call(machine_name)
165
+ end
166
+ end
167
+
168
+ # Make sure we're only working with one VM if single target
169
+ if options[:single_target] && machines.length != 1
170
+ @logger.debug("Using primary machine since single target")
171
+ primary_name = @env.primary_machine_name
172
+ raise Errors::MultiVMTargetRequired if !primary_name
173
+ machines = [get_machine.call(primary_name)]
174
+ end
175
+
176
+ # If we asked for reversed ordering, then reverse it
177
+ machines.reverse! if options[:reverse]
178
+
179
+ # Go through each VM and yield it!
180
+ machines.each do |machine|
181
+ @logger.info("With machine: #{machine.name} (#{machine.provider.inspect})")
182
+ yield machine
183
+ end
184
+ end
185
+
186
+ # This method will split the argv given into three parts: the
187
+ # flags to this command, the subcommand, and the flags to the
188
+ # subcommand. For example:
189
+ #
190
+ # -v status -h -v
191
+ #
192
+ # The above would yield 3 parts:
193
+ #
194
+ # ["-v"]
195
+ # "status"
196
+ # ["-h", "-v"]
197
+ #
198
+ # These parts are useful because the first is a list of arguments
199
+ # given to the current command, the second is a subcommand, and the
200
+ # third are the commands given to the subcommand.
201
+ #
202
+ # @return [Array] The three parts.
203
+ def split_main_and_subcommand(argv)
204
+ # Initialize return variables
205
+ main_args = nil
206
+ sub_command = nil
207
+ sub_args = []
208
+
209
+ # We split the arguments into two: One set containing any
210
+ # flags before a word, and then the rest. The rest are what
211
+ # get actually sent on to the subcommand.
212
+ argv.each_index do |i|
213
+ if !argv[i].start_with?("-")
214
+ # We found the beginning of the sub command. Split the
215
+ # args up.
216
+ main_args = argv[0, i]
217
+ sub_command = argv[i]
218
+ sub_args = argv[i + 1, argv.length - i + 1]
219
+
220
+ # Break so we don't find the next non flag and shift our
221
+ # main args.
222
+ break
223
+ end
224
+ end
225
+
226
+ # Handle the case that argv was empty or didn't contain any subcommand
227
+ main_args = argv.dup if main_args.nil?
228
+
229
+ return [main_args, sub_command, sub_args]
230
+ end
231
+ end
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,98 @@
1
+ module Vagrant
2
+ module Plugin
3
+ module V2
4
+ # Base class for a communicator in Vagrant. A communicator is
5
+ # responsible for communicating with a machine in some way. There
6
+ # are various stages of Vagrant that require things such as uploading
7
+ # files to the machine, executing shell commands, etc. Implementors
8
+ # of this class are expected to provide this functionality in some
9
+ # way.
10
+ #
11
+ # Note that a communicator must provide **all** of the methods
12
+ # in this base class. There is currently no way for one communicator
13
+ # to provide say a more efficient way of uploading a file, but not
14
+ # provide shell execution. This sort of thing will come in a future
15
+ # version.
16
+ class Communicator
17
+ # This returns true/false depending on if the given machine
18
+ # can be communicated with using this communicator. If this returns
19
+ # `true`, then this class will be used as the primary communication
20
+ # method for the machine.
21
+ #
22
+ # @return [Boolean]
23
+ def self.match?(machine)
24
+ false
25
+ end
26
+
27
+ # Initializes the communicator with the machine that we will be
28
+ # communicating with. This base method does nothing (it doesn't
29
+ # even store the machine in an instance variable for you), so you're
30
+ # expected to override this and do something with the machine if
31
+ # you care about it.
32
+ #
33
+ # @param [Machine] machine The machine this instance is expected to
34
+ # communicate with.
35
+ def initialize(machine)
36
+ end
37
+
38
+ # Checks if the target machine is ready for communication. If this
39
+ # returns true, then all the other methods for communicating with
40
+ # the machine are expected to be functional.
41
+ #
42
+ # @return [Boolean]
43
+ def ready?
44
+ false
45
+ end
46
+
47
+ # Download a file from the remote machine to the local machine.
48
+ #
49
+ # @param [String] from Path of the file on the remote machine.
50
+ # @param [String] to Path of where to save the file locally.
51
+ def download(from, to)
52
+ end
53
+
54
+ # Upload a file to the remote machine.
55
+ #
56
+ # @param [String] from Path of the file locally to upload.
57
+ # @param [String] to Path of where to save the file on the remote
58
+ # machine.
59
+ def upload(from, to)
60
+ end
61
+
62
+ # Execute a command on the remote machine. The exact semantics
63
+ # of this method are up to the implementor, but in general the
64
+ # users of this class will expect this to be a shell.
65
+ #
66
+ # This method gives you no way to write data back to the remote
67
+ # machine, so only execute commands that don't expect input.
68
+ #
69
+ # @param [String] command Command to execute.
70
+ # @yield [type, data] Realtime output of the command being executed.
71
+ # @yieldparam [String] type Type of the output. This can be
72
+ # `:stdout`, `:stderr`, etc. The exact types are up to the
73
+ # implementor.
74
+ # @yieldparam [String] data Data for the given output.
75
+ # @return [Integer] Exit code of the command.
76
+ def execute(command, opts=nil)
77
+ end
78
+
79
+ # Executes a command on the remote machine with administrative
80
+ # privileges. See {#execute} for documentation, as the API is the
81
+ # same.
82
+ #
83
+ # @see #execute
84
+ def sudo(command, opts=nil)
85
+ end
86
+
87
+ # Executes a command and returns true if the command succeeded,
88
+ # and false otherwise. By default, this executes as a normal user,
89
+ # and it is up to the communicator implementation if they expose an
90
+ # option for running tests as an administrator.
91
+ #
92
+ # @see #execute
93
+ def test(command, opts=nil)
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end