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,163 @@
1
+ require "log4r"
2
+
3
+ module Vagrant
4
+ # This class handles guest-OS specific interactions with a machine.
5
+ # It is primarily responsible for detecting the proper guest OS
6
+ # implementation and then delegating capabilities.
7
+ #
8
+ # Vagrant has many tasks which require specific guest OS knowledge.
9
+ # These are implemented using a guest/capability system. Various plugins
10
+ # register as "guests" which determine the underlying OS of the system.
11
+ # Then, "guest capabilities" register themselves for a specific OS (one
12
+ # or more), and these capabilities are called.
13
+ #
14
+ # Example capabilities might be "mount_virtualbox_shared_folder" or
15
+ # "configure_networks".
16
+ #
17
+ # This system allows for maximum flexibility and pluginability for doing
18
+ # guest OS specific operations.
19
+ class Guest
20
+ attr_reader :chain
21
+
22
+ # The name of the guest OS. This is available after {#detect!} is
23
+ # called.
24
+ #
25
+ # @return [Symbol]
26
+ attr_reader :name
27
+
28
+ def initialize(machine, guests, capabilities)
29
+ @logger = Log4r::Logger.new("vagrant::guest")
30
+ @capabilities = capabilities
31
+ @chain = []
32
+ @guests = guests
33
+ @machine = machine
34
+ @name = nil
35
+ end
36
+
37
+ # This will detect the proper guest OS for the machine and set up
38
+ # the class to actually execute capabilities.
39
+ def detect!
40
+ @logger.info("Detect guest for machine: #{@machine}")
41
+
42
+ # Get the mapping of guests with the most parents. We start searching
43
+ # with the guests with the most parents first.
44
+ parent_count = {}
45
+ @guests.each do |name, parts|
46
+ parent_count[name] = 0
47
+
48
+ parent = parts[1]
49
+ while parent
50
+ parent_count[name] += 1
51
+ parent = @guests[parent]
52
+ parent = parent[1] if parent
53
+ end
54
+ end
55
+
56
+ # Now swap around the mapping so that it is a mapping of
57
+ # count to the actual list of guest names
58
+ parent_count_to_guests = {}
59
+ parent_count.each do |name, count|
60
+ parent_count_to_guests[count] ||= []
61
+ parent_count_to_guests[count] << name
62
+ end
63
+
64
+ catch(:guest_os) do
65
+ sorted_counts = parent_count_to_guests.keys.sort.reverse
66
+ sorted_counts.each do |count|
67
+ parent_count_to_guests[count].each do |name|
68
+ @logger.debug("Trying: #{name}")
69
+ guest_info = @guests[name]
70
+ guest = guest_info[0].new
71
+
72
+ if guest.detect?(@machine)
73
+ @logger.info("Detected: #{name}!")
74
+ @chain << [name, guest]
75
+ @name = name
76
+
77
+ # Build the proper chain of parents if there are any.
78
+ # This allows us to do "inheritence" of capabilities later
79
+ if guest_info[1]
80
+ parent_name = guest_info[1]
81
+ parent_info = @guests[parent_name]
82
+ while parent_info
83
+ @chain << [parent_name, parent_info[0].new]
84
+ parent_name = parent_info[1]
85
+ parent_info = @guests[parent_name]
86
+ end
87
+ end
88
+
89
+ @logger.info("Full guest chain: #{@chain.inspect}")
90
+
91
+ # Exit the search
92
+ throw :guest_os
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ # We shouldn't reach this point. Ideally we would detect
99
+ # all operating systems.
100
+ raise Errors::GuestNotDetected if @chain.empty?
101
+ end
102
+
103
+ # Tests whether the guest has the named capability.
104
+ #
105
+ # @return [Boolean]
106
+ def capability?(cap_name)
107
+ !capability_module(cap_name).nil?
108
+ end
109
+
110
+ # Executes the capability with the given name, optionally passing
111
+ # more arguments onwards to the capability.
112
+ def capability(cap_name, *args)
113
+ @logger.info("Execute capability: #{cap_name} (#{@chain[0][0]})")
114
+ cap_mod = capability_module(cap_name.to_sym)
115
+ if !cap_mod
116
+ raise Errors::GuestCapabilityNotFound,
117
+ :cap => cap_name.to_s,
118
+ :guest => @chain[0][0].to_s
119
+ end
120
+
121
+ cap_method = nil
122
+ begin
123
+ cap_method = cap_mod.method(cap_name)
124
+ rescue NameError
125
+ raise Errors::GuestCapabilityInvalid,
126
+ :cap => cap_name.to_s,
127
+ :guest => @chain[0][0].to_s
128
+ end
129
+
130
+ cap_method.call(@machine, *args)
131
+ end
132
+
133
+ # This returns whether the guest is ready to work. If this returns
134
+ # `false`, then {#detect!} should be called in order to detect the
135
+ # guest OS.
136
+ #
137
+ # @return [Boolean]
138
+ def ready?
139
+ !@chain.empty?
140
+ end
141
+
142
+ protected
143
+
144
+ # Returns the registered module for a capability with the given name.
145
+ #
146
+ # @param [Symbol] cap_name
147
+ # @return [Module]
148
+ def capability_module(cap_name)
149
+ @logger.debug("Searching for cap: #{cap_name}")
150
+ @chain.each do |guest_name, guest|
151
+ @logger.debug("Checking in: #{guest_name}")
152
+ caps = @capabilities[guest_name]
153
+
154
+ if caps && caps.has_key?(cap_name)
155
+ @logger.debug("Found cap: #{cap_name} in #{guest_name}")
156
+ return caps[cap_name]
157
+ end
158
+ end
159
+
160
+ nil
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,28 @@
1
+ require 'log4r'
2
+
3
+ module Vagrant
4
+ module Hosts
5
+ # This method detects the correct host based on the `match?` methods
6
+ # implemented in the registered hosts.
7
+ #
8
+ # @param [Hash] registry Hash mapping key to host class
9
+ def self.detect(registry)
10
+ logger = Log4r::Logger.new("vagrant::hosts")
11
+
12
+ # Sort the hosts by their precedence
13
+ host_klasses = registry.values.sort_by { |a| a.precedence }.reverse
14
+ logger.debug("Host path search classes: #{host_klasses.inspect}")
15
+
16
+ # Test for matches and return the host class that matches
17
+ host_klasses.each do |klass|
18
+ if klass.match?
19
+ logger.info("Host class: #{klass}")
20
+ return klass
21
+ end
22
+ end
23
+
24
+ # No matches found...
25
+ return nil
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,325 @@
1
+ require "log4r"
2
+
3
+ module Vagrant
4
+ # This represents a machine that Vagrant manages. This provides a singular
5
+ # API for querying the state and making state changes to the machine, which
6
+ # is backed by any sort of provider (VirtualBox, VMWare, etc.).
7
+ class Machine
8
+ # The box that is backing this machine.
9
+ #
10
+ # @return [Box]
11
+ attr_reader :box
12
+
13
+ # Configuration for the machine.
14
+ #
15
+ # @return [Object]
16
+ attr_reader :config
17
+
18
+ # Directory where machine-specific data can be stored.
19
+ #
20
+ # @return [Pathname]
21
+ attr_reader :data_dir
22
+
23
+ # The environment that this machine is a part of.
24
+ #
25
+ # @return [Environment]
26
+ attr_reader :env
27
+
28
+ # ID of the machine. This ID comes from the provider and is not
29
+ # guaranteed to be of any particular format except that it is
30
+ # a string.
31
+ #
32
+ # @return [String]
33
+ attr_reader :id
34
+
35
+ # Name of the machine. This is assigned by the Vagrantfile.
36
+ #
37
+ # @return [String]
38
+ attr_reader :name
39
+
40
+ # The provider backing this machine.
41
+ #
42
+ # @return [Object]
43
+ attr_reader :provider
44
+
45
+ # The provider-specific configuration for this machine.
46
+ #
47
+ # @return [Object]
48
+ attr_reader :provider_config
49
+
50
+ # The name of the provider.
51
+ #
52
+ # @return [Symbol]
53
+ attr_reader :provider_name
54
+
55
+ # The options given to the provider when registering the plugin.
56
+ #
57
+ # @return [Hash]
58
+ attr_reader :provider_options
59
+
60
+ # The UI for outputting in the scope of this machine.
61
+ #
62
+ # @return [UI]
63
+ attr_reader :ui
64
+
65
+ # Initialize a new machine.
66
+ #
67
+ # @param [String] name Name of the virtual machine.
68
+ # @param [Class] provider The provider backing this machine. This is
69
+ # currently expected to be a V1 `provider` plugin.
70
+ # @param [Object] provider_config The provider-specific configuration for
71
+ # this machine.
72
+ # @param [Hash] provider_options The provider-specific options from the
73
+ # plugin definition.
74
+ # @param [Object] config The configuration for this machine.
75
+ # @param [Pathname] data_dir The directory where machine-specific data
76
+ # can be stored. This directory is ensured to exist.
77
+ # @param [Box] box The box that is backing this virtual machine.
78
+ # @param [Environment] env The environment that this machine is a
79
+ # part of.
80
+ def initialize(name, provider_name, provider_cls, provider_config, provider_options, config, data_dir, box, env, base=false)
81
+ @logger = Log4r::Logger.new("vagrant::machine")
82
+ @logger.info("Initializing machine: #{name}")
83
+ @logger.info(" - Provider: #{provider_cls}")
84
+ @logger.info(" - Box: #{box}")
85
+ @logger.info(" - Data dir: #{data_dir}")
86
+
87
+ @box = box
88
+ @config = config
89
+ @data_dir = data_dir
90
+ @env = env
91
+ @guest = Guest.new(
92
+ self,
93
+ Vagrant.plugin("2").manager.guests,
94
+ Vagrant.plugin("2").manager.guest_capabilities)
95
+ @name = name
96
+ @provider_config = provider_config
97
+ @provider_name = provider_name
98
+ @provider_options = provider_options
99
+ @ui = @env.ui.scope(@name)
100
+
101
+ # Read the ID, which is usually in local storage
102
+ @id = nil
103
+
104
+ # XXX: This is temporary. This will be removed very soon.
105
+ if base
106
+ @id = name
107
+ else
108
+ # Read the id file from the data directory if it exists as the
109
+ # ID for the pre-existing physical representation of this machine.
110
+ id_file = @data_dir.join("id")
111
+ @id = id_file.read if id_file.file?
112
+ end
113
+
114
+ # Initializes the provider last so that it has access to all the
115
+ # state we setup on this machine.
116
+ @provider = provider_cls.new(self)
117
+ end
118
+
119
+ # This calls an action on the provider. The provider may or may not
120
+ # actually implement the action.
121
+ #
122
+ # @param [Symbol] name Name of the action to run.
123
+ # @param [Hash] extra_env This data will be passed into the action runner
124
+ # as extra data set on the environment hash for the middleware
125
+ # runner.
126
+ def action(name, extra_env=nil)
127
+ @logger.info("Calling action: #{name} on provider #{@provider}")
128
+
129
+ # Get the callable from the provider.
130
+ callable = @provider.action(name)
131
+
132
+ # If this action doesn't exist on the provider, then an exception
133
+ # must be raised.
134
+ if callable.nil?
135
+ raise Errors::UnimplementedProviderAction,
136
+ :action => name,
137
+ :provider => @provider.to_s
138
+ end
139
+
140
+ # Run the action with the action runner on the environment
141
+ env = {
142
+ :action_name => "machine_action_#{name}".to_sym,
143
+ :machine => self,
144
+ :machine_action => name,
145
+ :ui => @ui
146
+ }.merge(extra_env || {})
147
+ @env.action_runner.run(callable, env)
148
+ end
149
+
150
+ # Returns a communication object for executing commands on the remote
151
+ # machine. Note that the _exact_ semantics of this are up to the
152
+ # communication provider itself. Despite this, the semantics are expected
153
+ # to be consistent across operating systems. For example, all linux-based
154
+ # systems should have similar communication (usually a shell). All
155
+ # Windows systems should have similar communication as well. Therefore,
156
+ # prior to communicating with the machine, users of this method are
157
+ # expected to check the guest OS to determine their behavior.
158
+ #
159
+ # This method will _always_ return some valid communication object.
160
+ # The `ready?` API can be used on the object to check if communication
161
+ # is actually ready.
162
+ #
163
+ # @return [Object]
164
+ def communicate
165
+ if !@communicator
166
+ # For now, we always return SSH. In the future, we'll abstract
167
+ # this and allow plugins to define new methods of communication.
168
+ klass = Vagrant.plugin("2").manager.communicators[:ssh]
169
+ @communicator = klass.new(self)
170
+ end
171
+
172
+ @communicator
173
+ end
174
+
175
+ # Returns a guest implementation for this machine. The guest implementation
176
+ # knows how to do guest-OS specific tasks, such as configuring networks,
177
+ # mounting folders, etc.
178
+ #
179
+ # @return [Guest]
180
+ def guest
181
+ raise Errors::MachineGuestNotReady if !communicate.ready?
182
+ @guest.detect! if !@guest.ready?
183
+ @guest
184
+ end
185
+
186
+ # This sets the unique ID associated with this machine. This will
187
+ # persist this ID so that in the future Vagrant will be able to find
188
+ # this machine again. The unique ID must be absolutely unique to the
189
+ # virtual machine, and can be used by providers for finding the
190
+ # actual machine associated with this instance.
191
+ #
192
+ # **WARNING:** Only providers should ever use this method.
193
+ #
194
+ # @param [String] value The ID.
195
+ def id=(value)
196
+ # The file that will store the id if we have one. This allows the
197
+ # ID to persist across Vagrant runs.
198
+ id_file = @data_dir.join("id")
199
+
200
+ if value
201
+ # Write the "id" file with the id given.
202
+ id_file.open("w+") do |f|
203
+ f.write(value)
204
+ end
205
+ else
206
+ # Delete the file, since the machine is now destroyed
207
+ id_file.delete if id_file.file?
208
+ end
209
+
210
+ # Store the ID locally
211
+ @id = value
212
+
213
+ # Notify the provider that the ID changed in case it needs to do
214
+ # any accounting from it.
215
+ @provider.machine_id_changed
216
+ end
217
+
218
+ # This returns a clean inspect value so that printing the value via
219
+ # a pretty print (`p`) results in a readable value.
220
+ #
221
+ # @return [String]
222
+ def inspect
223
+ "#<#{self.class}: #{@name} (#{@provider.class})>"
224
+ end
225
+
226
+ # This returns the SSH info for accessing this machine. This SSH info
227
+ # is queried from the underlying provider. This method returns `nil` if
228
+ # the machine is not ready for SSH communication.
229
+ #
230
+ # The structure of the resulting hash is guaranteed to contain the
231
+ # following structure, although it may return other keys as well
232
+ # not documented here:
233
+ #
234
+ # {
235
+ # :host => "1.2.3.4",
236
+ # :port => "22",
237
+ # :username => "mitchellh",
238
+ # :private_key_path => "/path/to/my/key"
239
+ # }
240
+ #
241
+ # Note that Vagrant makes no guarantee that this info works or is
242
+ # correct. This is simply the data that the provider gives us or that
243
+ # is configured via a Vagrantfile. It is still possible after this
244
+ # point when attempting to connect via SSH to get authentication
245
+ # errors.
246
+ #
247
+ # @return [Hash] SSH information.
248
+ def ssh_info
249
+ # First, ask the provider for their information. If the provider
250
+ # returns nil, then the machine is simply not ready for SSH, and
251
+ # we return nil as well.
252
+ info = @provider.ssh_info
253
+ return nil if info.nil?
254
+
255
+ # Delete out the nil entries.
256
+ info.dup.each do |key, value|
257
+ info.delete(key) if value.nil?
258
+ end
259
+
260
+ # We set the defaults
261
+ info[:host] ||= @config.ssh.default.host
262
+ info[:port] ||= @config.ssh.default.port
263
+ info[:private_key_path] ||= @config.ssh.default.private_key_path
264
+ info[:username] ||= @config.ssh.default.username
265
+
266
+ # We set overrides if they are set. These take precedence over
267
+ # provider-returned data.
268
+ info[:host] = @config.ssh.host if @config.ssh.host
269
+ info[:port] = @config.ssh.port if @config.ssh.port
270
+ info[:username] = @config.ssh.username if @config.ssh.username
271
+
272
+ # We also set some fields that are purely controlled by Varant
273
+ info[:forward_agent] = @config.ssh.forward_agent
274
+ info[:forward_x11] = @config.ssh.forward_x11
275
+
276
+ # Set the private key path. If a specific private key is given in
277
+ # the Vagrantfile we set that. Otherwise, we use the default (insecure)
278
+ # private key, but only if the provider didn't give us one.
279
+ if !info[:private_key_path]
280
+ if @config.ssh.private_key_path
281
+ info[:private_key_path] = @config.ssh.private_key_path
282
+ else
283
+ info[:private_key_path] = @env.default_private_key_path
284
+ end
285
+ end
286
+
287
+ # Expand the private key path relative to the root path
288
+ info[:private_key_path] = File.expand_path(info[:private_key_path], @env.root_path)
289
+
290
+ # Return the final compiled SSH info data
291
+ info
292
+ end
293
+
294
+ # Returns the state of this machine. The state is queried from the
295
+ # backing provider, so it can be any arbitrary symbol.
296
+ #
297
+ # @return [Symbol]
298
+ def state
299
+ result = @provider.state
300
+ raise Errors::MachineStateInvalid if !result.is_a?(MachineState)
301
+ result
302
+ end
303
+
304
+ protected
305
+
306
+ # Given a guest name (such as `:windows`), this will load the associated
307
+ # guest implementation and return an instance.
308
+ #
309
+ # @param [Symbol] guest The name of the guest implementation.
310
+ # @return [Object]
311
+ def load_guest(guest)
312
+ @logger.info("Loading guest: #{guest}")
313
+
314
+ klass = Vagrant.plugin("2").manager.guests[guest]
315
+
316
+ if klass.nil?
317
+ raise Errors::VMGuestError,
318
+ :_key => :unknown_type,
319
+ :guest => guest.to_s
320
+ end
321
+
322
+ return klass.new(self)
323
+ end
324
+ end
325
+ end
@@ -0,0 +1,45 @@
1
+ module Vagrant
2
+ # This represents the state of a given machine. This is a very basic
3
+ # class that simply stores a short and long description of the state
4
+ # of a machine.
5
+ #
6
+ # The state also stores a state "id" which ca be used as a unique
7
+ # identifier for a state. This should be a symbol. This allows internal
8
+ # code to compare state such as ":not_created" instead of using
9
+ # string comparison.
10
+ #
11
+ # The short description should be a single word description of the
12
+ # state of the machine such as "running" or "not created".
13
+ #
14
+ # The long description can span multiple lines describing what the
15
+ # state actually means.
16
+ class MachineState
17
+ # Unique ID for this state.
18
+ #
19
+ # @return [Symbol]
20
+ attr_reader :id
21
+
22
+ # Short description for this state.
23
+ #
24
+ # @return [String]
25
+ attr_reader :short_description
26
+
27
+ # Long description for this state.
28
+ #
29
+ # @return [String]
30
+ attr_reader :long_description
31
+
32
+ # Creates a new instance to represent the state of a machine.
33
+ #
34
+ # @param [Symbol] id Unique identifier for this state.
35
+ # @param [String] short Short (preferably one-word) description of
36
+ # the state.
37
+ # @param [String] long Long description (can span multiple lines)
38
+ # of the state.
39
+ def initialize(id, short, long)
40
+ @id = id
41
+ @short_description = short
42
+ @long_description = long
43
+ end
44
+ end
45
+ end