vagrant-unbundled 2.2.6.1 → 2.2.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +14 -0
  3. data/CHANGELOG.md +153 -2
  4. data/README.md +5 -7
  5. data/bin/vagrant +23 -0
  6. data/contrib/README.md +1 -0
  7. data/contrib/bash/completion.sh +13 -1
  8. data/contrib/sudoers/linux-suse +2 -2
  9. data/contrib/zsh/_vagrant +736 -0
  10. data/contrib/zsh/generate_zsh_completion.rb +166 -0
  11. data/lib/vagrant.rb +25 -0
  12. data/lib/vagrant/action.rb +8 -0
  13. data/lib/vagrant/action/builder.rb +193 -38
  14. data/lib/vagrant/action/builtin/box_add.rb +15 -7
  15. data/lib/vagrant/action/builtin/box_check_outdated.rb +12 -15
  16. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  17. data/lib/vagrant/action/builtin/cloud_init_setup.rb +127 -0
  18. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  19. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  20. data/lib/vagrant/action/builtin/disk.rb +52 -0
  21. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  22. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  23. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  24. data/lib/vagrant/action/builtin/mixin_provisioners.rb +20 -1
  25. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  26. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  27. data/lib/vagrant/action/builtin/ssh_run.rb +21 -3
  28. data/lib/vagrant/action/builtin/synced_folders.rb +10 -0
  29. data/lib/vagrant/action/builtin/trigger.rb +37 -0
  30. data/lib/vagrant/action/hook.rb +76 -23
  31. data/lib/vagrant/action/runner.rb +11 -26
  32. data/lib/vagrant/action/warden.rb +28 -22
  33. data/lib/vagrant/box.rb +5 -4
  34. data/lib/vagrant/box_metadata.rb +17 -3
  35. data/lib/vagrant/bundler.rb +265 -53
  36. data/lib/vagrant/cli.rb +4 -2
  37. data/lib/vagrant/errors.rb +61 -1
  38. data/lib/vagrant/machine.rb +56 -6
  39. data/lib/vagrant/machine_index.rb +27 -1
  40. data/lib/vagrant/plugin/manager.rb +25 -14
  41. data/lib/vagrant/plugin/v2/command.rb +6 -2
  42. data/lib/vagrant/plugin/v2/components.rb +6 -0
  43. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  44. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  45. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  46. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  47. data/lib/vagrant/shared_helpers.rb +28 -0
  48. data/lib/vagrant/ui.rb +51 -5
  49. data/lib/vagrant/util.rb +1 -0
  50. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  51. data/lib/vagrant/util/caps.rb +48 -0
  52. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  53. data/lib/vagrant/util/curl_helper.rb +8 -5
  54. data/lib/vagrant/util/directory.rb +19 -0
  55. data/lib/vagrant/util/downloader.rb +7 -3
  56. data/lib/vagrant/util/file_checksum.rb +6 -2
  57. data/lib/vagrant/util/guest_hosts.rb +68 -0
  58. data/lib/vagrant/util/guest_inspection.rb +9 -1
  59. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  60. data/lib/vagrant/util/io.rb +7 -27
  61. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  62. data/lib/vagrant/util/is_port_open.rb +8 -20
  63. data/lib/vagrant/util/map_command_options.rb +33 -0
  64. data/lib/vagrant/util/network_ip.rb +11 -1
  65. data/lib/vagrant/util/numeric.rb +69 -0
  66. data/lib/vagrant/util/platform.rb +8 -1
  67. data/lib/vagrant/util/powershell.rb +1 -1
  68. data/lib/vagrant/util/subprocess.rb +9 -1
  69. data/lib/vagrant/vagrantfile.rb +1 -1
  70. data/plugins/commands/autocomplete/command/install.rb +49 -0
  71. data/plugins/commands/autocomplete/command/root.rb +64 -0
  72. data/plugins/commands/autocomplete/plugin.rb +18 -0
  73. data/plugins/commands/box/command/outdated.rb +14 -2
  74. data/plugins/commands/cloud/locales/en.yml +1 -1
  75. data/plugins/commands/cloud/publish.rb +1 -1
  76. data/plugins/commands/destroy/command.rb +6 -2
  77. data/plugins/commands/snapshot/command/save.rb +13 -8
  78. data/plugins/commands/ssh_config/command.rb +1 -1
  79. data/plugins/communicators/ssh/communicator.rb +25 -24
  80. data/plugins/communicators/winrm/config.rb +1 -1
  81. data/plugins/communicators/winrm/helper.rb +1 -1
  82. data/plugins/communicators/winrm/shell.rb +1 -1
  83. data/plugins/communicators/winssh/communicator.rb +126 -38
  84. data/plugins/communicators/winssh/config.rb +3 -7
  85. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  86. data/plugins/guests/alpine/cap/rsync.rb +1 -1
  87. data/plugins/guests/alpine/plugin.rb +16 -0
  88. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  89. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  90. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  91. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  92. data/plugins/guests/centos/cap/flavor.rb +24 -0
  93. data/plugins/guests/centos/guest.rb +9 -0
  94. data/plugins/guests/centos/plugin.rb +20 -0
  95. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  96. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +99 -13
  97. data/plugins/guests/darwin/plugin.rb +5 -0
  98. data/plugins/guests/debian/cap/change_host_name.rb +11 -11
  99. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  100. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  101. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  102. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  103. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  104. data/plugins/guests/haiku/plugin.rb +15 -0
  105. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  106. data/plugins/guests/linux/cap/halt.rb +9 -1
  107. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +16 -0
  108. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +4 -11
  109. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +62 -0
  110. data/plugins/guests/linux/cap/reboot.rb +48 -0
  111. data/plugins/guests/linux/plugin.rb +20 -0
  112. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  113. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  114. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  115. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  116. data/plugins/guests/redhat/cap/change_host_name.rb +10 -5
  117. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  118. data/plugins/guests/redhat/cap/nfs_client.rb +2 -2
  119. data/plugins/guests/redhat/cap/smb.rb +20 -0
  120. data/plugins/guests/redhat/plugin.rb +5 -0
  121. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  122. data/plugins/guests/solaris11/plugin.rb +5 -0
  123. data/plugins/guests/suse/cap/change_host_name.rb +13 -12
  124. data/plugins/guests/windows/cap/public_key.rb +3 -3
  125. data/plugins/guests/windows/cap/reboot.rb +2 -1
  126. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  127. data/plugins/hosts/darwin/cap/nfs.rb +11 -0
  128. data/plugins/hosts/darwin/plugin.rb +15 -0
  129. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  130. data/plugins/hosts/linux/cap/nfs.rb +21 -2
  131. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  132. data/plugins/hosts/linux/plugin.rb +10 -0
  133. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  134. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  135. data/plugins/hosts/windows/plugin.rb +15 -0
  136. data/plugins/kernel_v2/config/cloud_init.rb +126 -0
  137. data/plugins/kernel_v2/config/disk.rb +221 -0
  138. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  139. data/plugins/kernel_v2/config/vm.rb +225 -11
  140. data/plugins/kernel_v2/config/vm_provisioner.rb +17 -3
  141. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  142. data/plugins/providers/docker/action.rb +8 -17
  143. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  144. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  145. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  146. data/plugins/providers/docker/communicator.rb +1 -1
  147. data/plugins/providers/docker/driver.rb +73 -10
  148. data/plugins/providers/docker/errors.rb +4 -0
  149. data/plugins/providers/docker/executor/local.rb +7 -1
  150. data/plugins/providers/docker/plugin.rb +5 -0
  151. data/plugins/providers/hyperv/action.rb +2 -0
  152. data/plugins/providers/hyperv/action/configure.rb +8 -0
  153. data/plugins/providers/hyperv/action/export.rb +4 -2
  154. data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
  155. data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
  156. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
  157. data/plugins/providers/hyperv/config.rb +5 -0
  158. data/plugins/providers/hyperv/driver.rb +90 -9
  159. data/plugins/providers/hyperv/plugin.rb +25 -0
  160. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
  161. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
  162. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
  163. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
  164. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
  165. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
  166. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
  167. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
  168. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
  169. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
  170. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
  171. data/plugins/providers/virtualbox/action.rb +14 -1
  172. data/plugins/providers/virtualbox/action/clean_machine_folder.rb +10 -1
  173. data/plugins/providers/virtualbox/action/export.rb +4 -2
  174. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  175. data/plugins/providers/virtualbox/action/import.rb +8 -4
  176. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
  177. data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
  178. data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
  179. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
  180. data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
  181. data/plugins/providers/virtualbox/cap/mount_options.rb +35 -0
  182. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
  183. data/plugins/providers/virtualbox/driver/base.rb +15 -0
  184. data/plugins/providers/virtualbox/driver/meta.rb +17 -2
  185. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  186. data/plugins/providers/virtualbox/driver/version_6_1.rb +39 -0
  187. data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
  188. data/plugins/providers/virtualbox/model/storage_controller_array.rb +100 -0
  189. data/plugins/providers/virtualbox/plugin.rb +38 -0
  190. data/plugins/providers/virtualbox/synced_folder.rb +1 -0
  191. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
  192. data/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb +20 -3
  193. data/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb +4 -5
  194. data/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb +2 -2
  195. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +2 -2
  196. data/plugins/provisioners/ansible/cap/guest/pip/pip.rb +8 -4
  197. data/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb +2 -2
  198. data/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb +2 -1
  199. data/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb +3 -3
  200. data/plugins/provisioners/ansible/plugin.rb +5 -0
  201. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  202. data/plugins/provisioners/container/client.rb +203 -0
  203. data/plugins/provisioners/container/config.rb +83 -0
  204. data/plugins/provisioners/container/installer.rb +13 -0
  205. data/plugins/provisioners/container/plugin.rb +23 -0
  206. data/plugins/provisioners/container/provisioner.rb +28 -0
  207. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  208. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  209. data/plugins/provisioners/docker/client.rb +4 -175
  210. data/plugins/provisioners/docker/config.rb +2 -72
  211. data/plugins/provisioners/docker/installer.rb +3 -5
  212. data/plugins/provisioners/docker/plugin.rb +6 -6
  213. data/plugins/provisioners/docker/provisioner.rb +4 -10
  214. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  215. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  216. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  217. data/plugins/provisioners/podman/client.rb +12 -0
  218. data/plugins/provisioners/podman/config.rb +28 -0
  219. data/plugins/provisioners/podman/installer.rb +33 -0
  220. data/plugins/provisioners/podman/plugin.rb +38 -0
  221. data/plugins/provisioners/podman/provisioner.rb +52 -0
  222. data/plugins/provisioners/salt/provisioner.rb +4 -0
  223. data/plugins/provisioners/shell/config.rb +1 -6
  224. data/plugins/provisioners/shell/provisioner.rb +61 -26
  225. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  226. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  227. data/plugins/synced_folders/smb/cap/mount_options.rb +36 -0
  228. data/plugins/synced_folders/smb/plugin.rb +10 -0
  229. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  230. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  231. data/templates/commands/init/Vagrantfile.erb +1 -1
  232. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  233. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  234. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  235. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  236. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  237. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  238. data/templates/guests/linux/etc_fstab.erb +6 -0
  239. data/templates/locales/en.yml +235 -6
  240. data/templates/locales/providers_docker.yml +6 -0
  241. data/templates/nfs/exports_darwin.erb +7 -0
  242. data/vagrant.gemspec +12 -12
  243. data/version.txt +1 -1
  244. metadata +3937 -3686
  245. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  246. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  247. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
@@ -62,9 +62,11 @@ module Vagrant
62
62
  # Initialize and execute the command class, returning the exit status.
63
63
  result = 0
64
64
  begin
65
- @triggers.fire_triggers(@sub_command.to_sym, :before, nil, :command) if Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
65
+ @triggers.fire(@sub_command, :before, nil, :command) if
66
+ Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
66
67
  result = command_class.new(@sub_args, @env).execute
67
- @triggers.fire_triggers(@sub_command.to_sym, :after, nil, :command) if Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
68
+ @triggers.fire(@sub_command, :after, nil, :command) if
69
+ Vagrant::Util::Experimental.feature_enabled?("typed_triggers")
68
70
  rescue Interrupt
69
71
  @env.ui.info(I18n.t("vagrant.cli_interrupt"))
70
72
  result = 1
@@ -100,7 +100,7 @@ module Vagrant
100
100
 
101
101
  def translate_error(opts)
102
102
  return nil if !opts[:_key]
103
- I18n.t("#{opts[:_namespace]}.#{opts[:_key]}", opts)
103
+ I18n.t("#{opts[:_namespace]}.#{opts[:_key]}", **opts)
104
104
  end
105
105
  end
106
106
 
@@ -248,6 +248,10 @@ module Vagrant
248
248
  error_key(:bundler_error)
249
249
  end
250
250
 
251
+ class SourceSpecNotFound < BundlerError
252
+ error_key(:source_spec_not_found)
253
+ end
254
+
251
255
  class CantReadMACAddresses < VagrantError
252
256
  error_key(:cant_read_mac_addresses)
253
257
  end
@@ -300,6 +304,14 @@ module Vagrant
300
304
  error_key(:clone_machine_not_found)
301
305
  end
302
306
 
307
+ class CloudInitNotFound < VagrantError
308
+ error_key(:cloud_init_not_found)
309
+ end
310
+
311
+ class CloudInitCommandFailed < VagrantError
312
+ error_key(:cloud_init_command_failed)
313
+ end
314
+
303
315
  class CommandDeprecated < VagrantError
304
316
  error_key(:command_deprecated)
305
317
  end
@@ -336,6 +348,10 @@ module Vagrant
336
348
  error_key(:corrupt_machine_index)
337
349
  end
338
350
 
351
+ class CreateIsoHostCapNotFound < VagrantError
352
+ error_key(:create_iso_host_cap_not_found)
353
+ end
354
+
339
355
  class DarwinMountFailed < VagrantError
340
356
  error_key(:darwin_mount_failed)
341
357
  end
@@ -396,6 +412,10 @@ module Vagrant
396
412
  error_key(:auto_empty, "vagrant.actions.vm.forward_ports")
397
413
  end
398
414
 
415
+ class ForwardPortHostIPNotFound < VagrantError
416
+ error_key(:host_ip_not_found, "vagrant.actions.vm.forward_ports")
417
+ end
418
+
399
419
  class ForwardPortCollision < VagrantError
400
420
  error_key(:collision_error, "vagrant.actions.vm.forward_ports")
401
421
  end
@@ -420,6 +440,10 @@ module Vagrant
420
440
  error_key(:host_explicit_not_detected)
421
441
  end
422
442
 
443
+ class ISOBuildFailed < VagrantError
444
+ error_key(:iso_build_failed)
445
+ end
446
+
423
447
  class LinuxMountFailed < VagrantError
424
448
  error_key(:linux_mount_failed)
425
449
  end
@@ -436,6 +460,10 @@ module Vagrant
436
460
  error_key(:machine_action_locked)
437
461
  end
438
462
 
463
+ class MachineFolderNotAccessible < VagrantError
464
+ error_key(:machine_folder_not_accessible)
465
+ end
466
+
439
467
  class MachineGuestNotReady < VagrantError
440
468
  error_key(:machine_guest_not_ready)
441
469
  end
@@ -456,6 +484,10 @@ module Vagrant
456
484
  error_key(:multi_vm_target_required)
457
485
  end
458
486
 
487
+ class NetplanNoAvailableRenderers < VagrantError
488
+ error_key(:netplan_no_available_renderers)
489
+ end
490
+
459
491
  class NetSSHException < VagrantError
460
492
  error_key(:net_ssh_exception)
461
493
  end
@@ -612,6 +644,10 @@ module Vagrant
612
644
  error_key(:plugin_install_license_not_found)
613
645
  end
614
646
 
647
+ class PluginInstallFailed < VagrantError
648
+ error_key(:plugin_install_failed)
649
+ end
650
+
615
651
  class PluginInstallSpace < VagrantError
616
652
  error_key(:plugin_install_space)
617
653
  end
@@ -776,6 +812,10 @@ module Vagrant
776
812
  error_key(:ssh_key_type_not_supported)
777
813
  end
778
814
 
815
+ class SSHNoExitStatus < VagrantError
816
+ error_key(:ssh_no_exit_status)
817
+ end
818
+
779
819
  class SSHNoRoute < VagrantError
780
820
  error_key(:ssh_no_route)
781
821
  end
@@ -900,6 +940,26 @@ module Vagrant
900
940
  error_key(:virtualbox_broken_version_040214)
901
941
  end
902
942
 
943
+ class VirtualBoxDisksDefinedExceedLimit < VagrantError
944
+ error_key(:virtualbox_disks_defined_exceed_limit)
945
+ end
946
+
947
+ class VirtualBoxDisksControllerNotFound < VagrantError
948
+ error_key(:virtualbox_disks_controller_not_found)
949
+ end
950
+
951
+ class VirtualBoxDisksNoSupportedControllers < VagrantError
952
+ error_key(:virtualbox_disks_no_supported_controllers)
953
+ end
954
+
955
+ class VirtualBoxDisksPrimaryNotFound < VagrantError
956
+ error_key(:virtualbox_disks_primary_not_found)
957
+ end
958
+
959
+ class VirtualBoxDisksUnsupportedController < VagrantError
960
+ error_key(:virtualbox_disks_unsupported_controller)
961
+ end
962
+
903
963
  class VirtualBoxGuestPropertyNotFound < VagrantError
904
964
  error_key(:virtualbox_guest_property_not_found)
905
965
  end
@@ -1,4 +1,5 @@
1
1
  require_relative "util/ssh"
2
+ require_relative "action/builtin/mixin_synced_folders"
2
3
 
3
4
  require "digest/md5"
4
5
  require "thread"
@@ -10,6 +11,8 @@ module Vagrant
10
11
  # API for querying the state and making state changes to the machine, which
11
12
  # is backed by any sort of provider (VirtualBox, VMware, etc.).
12
13
  class Machine
14
+ extend Vagrant::Action::Builtin::MixinSyncedFolders
15
+
13
16
  # The box that is backing this machine.
14
17
  #
15
18
  # @return [Box]
@@ -62,6 +65,11 @@ module Vagrant
62
65
  # @return [Hash]
63
66
  attr_reader :provider_options
64
67
 
68
+ # The triggers with machine specific configuration applied
69
+ #
70
+ # @return [Vagrant::Plugin::V2::Trigger]
71
+ attr_reader :triggers
72
+
65
73
  # The UI for outputting in the scope of this machine.
66
74
  #
67
75
  # @return [UI]
@@ -160,8 +168,6 @@ module Vagrant
160
168
  # as extra data set on the environment hash for the middleware
161
169
  # runner.
162
170
  def action(name, opts=nil)
163
- @triggers.fire_triggers(name, :before, @name.to_s, :action)
164
-
165
171
  @logger.info("Calling action: #{name} on provider #{@provider}")
166
172
 
167
173
  opts ||= {}
@@ -210,8 +216,6 @@ module Vagrant
210
216
  ui.machine("action", name.to_s, "end")
211
217
  action_result
212
218
  end
213
-
214
- @triggers.fire_triggers(name, :after, @name.to_s, :action)
215
219
  # preserve returning environment after machine action runs
216
220
  return return_env
217
221
  rescue Errors::EnvironmentLockedError
@@ -230,6 +234,7 @@ module Vagrant
230
234
  def action_raw(name, callable, extra_env=nil)
231
235
  # Run the action with the action runner on the environment
232
236
  env = {
237
+ raw_action_name: name,
233
238
  action_name: "machine_action_#{name}".to_sym,
234
239
  machine: self,
235
240
  machine_action: name,
@@ -476,8 +481,9 @@ module Vagrant
476
481
 
477
482
  # We also set some fields that are purely controlled by Vagrant
478
483
  info[:forward_agent] = @config.ssh.forward_agent
479
- info[:forward_x11] = @config.ssh.forward_x11
480
- info[:forward_env] = @config.ssh.forward_env
484
+ info[:forward_x11] = @config.ssh.forward_x11
485
+ info[:forward_env] = @config.ssh.forward_env
486
+ info[:connect_timeout] = @config.ssh.connect_timeout
481
487
 
482
488
  info[:ssh_command] = @config.ssh.ssh_command if @config.ssh.ssh_command
483
489
 
@@ -553,6 +559,41 @@ module Vagrant
553
559
  result
554
560
  end
555
561
 
562
+ # Returns the state of this machine. The state is queried from the
563
+ # backing provider, so it can be any arbitrary symbol.
564
+ #
565
+ # @param [Symbol] state of machine
566
+ # @return [Entry] entry of recovered machine
567
+ def recover_machine(state)
568
+ entry = @env.machine_index.get(index_uuid)
569
+ if entry
570
+ @env.machine_index.release(entry)
571
+ return entry
572
+ end
573
+
574
+ entry = MachineIndex::Entry.new(id=index_uuid, {})
575
+ entry.local_data_path = @env.local_data_path
576
+ entry.name = @name.to_s
577
+ entry.provider = @provider_name.to_s
578
+ entry.state = state
579
+ entry.vagrantfile_path = @env.root_path
580
+ entry.vagrantfile_name = @env.vagrantfile_name
581
+
582
+ if @box
583
+ entry.extra_data["box"] = {
584
+ "name" => @box.name,
585
+ "provider" => @box.provider.to_s,
586
+ "version" => @box.version.to_s,
587
+ }
588
+ end
589
+
590
+ @state_mutex.synchronize do
591
+ entry = @env.machine_index.recover(entry)
592
+ @env.machine_index.release(entry)
593
+ end
594
+ return entry
595
+ end
596
+
556
597
  # Returns the user ID that created this machine. This is specific to
557
598
  # the host machine that this was created on.
558
599
  #
@@ -578,6 +619,15 @@ module Vagrant
578
619
  end
579
620
  end
580
621
 
622
+ # This returns the set of shared folders that should be done for
623
+ # this machine. It returns the folders in a hash keyed by the
624
+ # implementation class for the synced folders.
625
+ #
626
+ # @return [Hash<Symbol, Hash<String, Hash>>]
627
+ def synced_folders
628
+ self.class.synced_folders(self)
629
+ end
630
+
581
631
  protected
582
632
 
583
633
  # Returns the path to the file that stores the UID.
@@ -231,6 +231,32 @@ module Vagrant
231
231
  Entry.new(id, struct)
232
232
  end
233
233
 
234
+ # Reinsert a machine into the global index if it has
235
+ # a valid existing uuid but does not currently exist
236
+ # in the index.
237
+ #
238
+ # @param [Entry] entry
239
+ # @return [Entry]
240
+ def recover(entry)
241
+ @lock.synchronize do
242
+ with_index_lock do
243
+ # Reload the data
244
+ unlocked_reload
245
+ # Don't recover if entry already exists in the global
246
+ return entry if find_by_prefix(entry.id)
247
+
248
+ lock_file = lock_machine(entry.id)
249
+ if !lock_file
250
+ raise Errors::MachineLocked,
251
+ name: entry.name,
252
+ provider: entry.provider
253
+ end
254
+ @machine_locks[entry.id] = lock_file
255
+ end
256
+ end
257
+ return set(entry)
258
+ end
259
+
234
260
  protected
235
261
 
236
262
  # Finds a machine where the UUID is prefixed by the given string.
@@ -452,7 +478,7 @@ module Vagrant
452
478
  # Creates a {Vagrant::Environment} for this entry.
453
479
  #
454
480
  # @return [Vagrant::Environment]
455
- def vagrant_env(home_path, **opts)
481
+ def vagrant_env(home_path, opts={})
456
482
  Vagrant::Util::SilenceWarnings.silence! do
457
483
  Environment.new({
458
484
  cwd: @vagrantfile_path,
@@ -51,7 +51,7 @@ module Vagrant
51
51
  @globalized = true
52
52
  @logger.debug("Enabling globalized plugins")
53
53
  plugins = installed_plugins
54
- bundler_init(plugins)
54
+ bundler_init(plugins, global: user_file.path)
55
55
  plugins
56
56
  end
57
57
 
@@ -66,7 +66,7 @@ module Vagrant
66
66
  @local_file = StateFile.new(env.local_data_path.join("plugins.json"))
67
67
  Vagrant::Bundler.instance.environment_path = env.local_data_path
68
68
  plugins = local_file.installed_plugins
69
- bundler_init(plugins)
69
+ bundler_init(plugins, local: local_file.path)
70
70
  plugins
71
71
  end
72
72
  end
@@ -80,7 +80,7 @@ module Vagrant
80
80
  #
81
81
  # @param [Hash] plugins List of plugins
82
82
  # @return [nil]
83
- def bundler_init(plugins)
83
+ def bundler_init(plugins, **opts)
84
84
  if !Vagrant.plugins_init?
85
85
  @logger.warn("Plugin initialization is disabled")
86
86
  return nil
@@ -99,7 +99,7 @@ module Vagrant
99
99
  )
100
100
  end
101
101
  begin
102
- Vagrant::Bundler.instance.init!(plugins)
102
+ Vagrant::Bundler.instance.init!(plugins, **opts)
103
103
  rescue StandardError, ScriptError => err
104
104
  @logger.error("Plugin initialization error - #{err.class}: #{err}")
105
105
  err.backtrace.each do |backtrace_line|
@@ -150,17 +150,28 @@ module Vagrant
150
150
  else
151
151
  result = local_spec
152
152
  end
153
- # Add the plugin to the state file
154
- plugin_file = opts[:env_local] ? @local_file : @user_file
155
- plugin_file.add_plugin(
156
- result.name,
157
- version: opts[:version],
158
- require: opts[:require],
159
- sources: opts[:sources],
160
- env_local: !!opts[:env_local],
161
- installed_gem_version: result.version.to_s
162
- )
163
153
 
154
+ if result
155
+ # Add the plugin to the state file
156
+ plugin_file = opts[:env_local] ? @local_file : @user_file
157
+ plugin_file.add_plugin(
158
+ result.name,
159
+ version: opts[:version],
160
+ require: opts[:require],
161
+ sources: opts[:sources],
162
+ env_local: !!opts[:env_local],
163
+ installed_gem_version: result.version.to_s
164
+ )
165
+ else
166
+ r = Gem::Dependency.new(name, opts[:version])
167
+ result = Gem::Specification.find { |s|
168
+ s.satisfies_requirement?(r) &&
169
+ s.activated?
170
+ }
171
+ raise Errors::PluginInstallFailed,
172
+ name: name if result.nil?
173
+ @logger.warn("Plugin install returned no result as no new plugins were installed.")
174
+ end
164
175
  # After install clean plugin gems to remove any cruft. This is useful
165
176
  # for removing outdated dependencies or other versions of an installed
166
177
  # plugin if the plugin is upgraded/downgraded
@@ -51,7 +51,7 @@ module Vagrant
51
51
  argv = @argv.dup
52
52
 
53
53
  # Default opts to a blank optionparser if none is given
54
- opts ||= OptionParser.new
54
+ opts ||= Vagrant::OptionParser.new
55
55
 
56
56
  # Add the help option, which must be on every command.
57
57
  opts.on_tail("-h", "--help", "Print this help") do
@@ -61,7 +61,7 @@ module Vagrant
61
61
 
62
62
  opts.parse!(argv)
63
63
  return argv
64
- rescue OptionParser::InvalidOption, OptionParser::MissingArgument
64
+ rescue OptionParser::InvalidOption, OptionParser::MissingArgument, OptionParser::AmbiguousOption
65
65
  raise Errors::CLIInvalidOptions, help: opts.help.chomp
66
66
  end
67
67
 
@@ -230,6 +230,10 @@ module Vagrant
230
230
  color_index = 0
231
231
 
232
232
  machines.each do |machine|
233
+ if machine.state && machine.state.id != :not_created && !@env.machine_index.include?(machine.index_uuid)
234
+ machine.recover_machine(machine.state.id)
235
+ end
236
+
233
237
  # Set the machine color
234
238
  machine.ui.opts[:color] = color_order[color_index % color_order.length]
235
239
  color_index += 1
@@ -64,6 +64,11 @@ module Vagrant
64
64
  # @return [Registry<Symbol, Array<Class, Integer>>]
65
65
  attr_reader :synced_folders
66
66
 
67
+ # This contains all the registered synced folder capabilities.
68
+ #
69
+ # @return [Hash<Symbol, Registry>]
70
+ attr_reader :synced_folder_capabilities
71
+
67
72
  def initialize
68
73
  # The action hooks hash defaults to []
69
74
  @action_hooks = Hash.new { |h, k| h[k] = [] }
@@ -78,6 +83,7 @@ module Vagrant
78
83
  @provider_capabilities = Hash.new { |h, k| h[k] = Registry.new }
79
84
  @pushes = Registry.new
80
85
  @synced_folders = Registry.new
86
+ @synced_folder_capabilities = Hash.new { |h, k| h[k] = Registry.new }
81
87
  end
82
88
  end
83
89
  end
@@ -28,6 +28,59 @@ module Vagrant
28
28
  result
29
29
  end
30
30
 
31
+ # Find all hooks that are applicable for the given key. This
32
+ # lookup does not include hooks which are defined for ALL_ACTIONS.
33
+ # Key lookups will match on either string or symbol values. The
34
+ # provided keys is broken down into multiple parts for lookups,
35
+ # which allows defining hooks with an entire namespaced name,
36
+ # or a short suffx. For example:
37
+ #
38
+ # Assume we are given an action class
39
+ # key = Vagrant::Action::Builtin::SyncedFolders
40
+ #
41
+ # The list of keys that will be checked for hooks:
42
+ # ["Vagrant::Action::Builtin::SyncedFolders", "vagrant_action_builtin_synced_folders",
43
+ # "Action::Builtin::SyncedFolders", "action_builtin_synced_folders",
44
+ # "Builtin::SyncedFolders", "builtin_synced_folders",
45
+ # "SyncedFolders", "synced_folders"]
46
+ #
47
+ # @param key [Class, String] key Key for hook lookups
48
+ # @return [Array<Proc>]
49
+ def find_action_hooks(key)
50
+ result = []
51
+
52
+ generate_hook_keys(key).each do |k|
53
+ @registered.each do |plugin|
54
+ result += plugin.components.action_hooks[k]
55
+ result += plugin.components.action_hooks[k.to_sym]
56
+ end
57
+ end
58
+
59
+ result
60
+ end
61
+
62
+ # Generate all valid lookup keys for given key
63
+ #
64
+ # @param [Class, String] key Base key for generation
65
+ # @return [Array<String>] all valid keys
66
+ def generate_hook_keys(key)
67
+ if key.is_a?(Class)
68
+ key = key.name.to_s
69
+ else
70
+ key = key.to_s
71
+ end
72
+ parts = key.split("::")
73
+ [].tap do |keys|
74
+ until parts.empty?
75
+ x = parts.join("::")
76
+ keys << x
77
+ y = x.gsub(/([a-z])([A-Z])/, '\1_\2').gsub('::', '_').downcase
78
+ keys << y if x != y
79
+ parts.shift
80
+ end
81
+ end
82
+ end
83
+
31
84
  # This returns all the registered commands.
32
85
  #
33
86
  # @return [Registry<Symbol, Array<Proc, Hash>>]
@@ -204,7 +257,21 @@ module Vagrant
204
257
  end
205
258
  end
206
259
  end
260
+
261
+ # This returns all the registered synced folder capabilities.
262
+ #
263
+ # @return [Hash]
264
+ def synced_folder_capabilities
265
+ results = Hash.new { |h, k| h[k] = Registry.new }
207
266
 
267
+ @registered.each do |plugin|
268
+ plugin.components.synced_folder_capabilities.each do |synced_folder, caps|
269
+ results[synced_folder].merge!(caps)
270
+ end
271
+ end
272
+
273
+ results
274
+ end
208
275
  # This registers a plugin. This should _NEVER_ be called by the public
209
276
  # and should only be called from within Vagrant. Vagrant will
210
277
  # automatically register V2 plugins when a name is set on the