vagrant-unbundled 2.2.6.2 → 2.2.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (287) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +14 -0
  3. data/CHANGELOG.md +213 -2
  4. data/Gemfile +1 -1
  5. data/README.md +9 -51
  6. data/RELEASE.md +1 -1
  7. data/bin/vagrant +23 -0
  8. data/contrib/README.md +1 -0
  9. data/contrib/bash/completion.sh +13 -1
  10. data/contrib/sudoers/linux-suse +2 -2
  11. data/contrib/zsh/_vagrant +738 -0
  12. data/contrib/zsh/generate_zsh_completion.rb +165 -0
  13. data/lib/vagrant.rb +25 -4
  14. data/lib/vagrant/action.rb +8 -0
  15. data/lib/vagrant/action/builder.rb +184 -38
  16. data/lib/vagrant/action/builtin/box_add.rb +20 -8
  17. data/lib/vagrant/action/builtin/box_check_outdated.rb +12 -15
  18. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  19. data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
  20. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  21. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  22. data/lib/vagrant/action/builtin/disk.rb +52 -0
  23. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  24. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  25. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  26. data/lib/vagrant/action/builtin/mixin_provisioners.rb +20 -1
  27. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  28. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  29. data/lib/vagrant/action/builtin/ssh_run.rb +21 -3
  30. data/lib/vagrant/action/builtin/synced_folders.rb +16 -0
  31. data/lib/vagrant/action/builtin/trigger.rb +37 -0
  32. data/lib/vagrant/action/hook.rb +76 -23
  33. data/lib/vagrant/action/runner.rb +12 -27
  34. data/lib/vagrant/action/warden.rb +28 -22
  35. data/lib/vagrant/box.rb +11 -4
  36. data/lib/vagrant/box_collection.rb +1 -1
  37. data/lib/vagrant/box_metadata.rb +17 -3
  38. data/lib/vagrant/bundler.rb +298 -59
  39. data/lib/vagrant/cli.rb +4 -2
  40. data/lib/vagrant/errors.rb +61 -1
  41. data/lib/vagrant/machine.rb +64 -11
  42. data/lib/vagrant/machine_index.rb +28 -1
  43. data/lib/vagrant/plugin/manager.rb +25 -14
  44. data/lib/vagrant/plugin/v2/command.rb +7 -2
  45. data/lib/vagrant/plugin/v2/components.rb +6 -0
  46. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  47. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  48. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  49. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  50. data/lib/vagrant/shared_helpers.rb +36 -0
  51. data/lib/vagrant/ui.rb +51 -5
  52. data/lib/vagrant/util.rb +1 -0
  53. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  54. data/lib/vagrant/util/caps.rb +48 -0
  55. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  56. data/lib/vagrant/util/curl_helper.rb +8 -5
  57. data/lib/vagrant/util/directory.rb +19 -0
  58. data/lib/vagrant/util/downloader.rb +10 -5
  59. data/lib/vagrant/util/file_checksum.rb +6 -2
  60. data/lib/vagrant/util/guest_hosts.rb +68 -0
  61. data/lib/vagrant/util/guest_inspection.rb +9 -1
  62. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  63. data/lib/vagrant/util/io.rb +7 -27
  64. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  65. data/lib/vagrant/util/is_port_open.rb +8 -20
  66. data/lib/vagrant/util/map_command_options.rb +33 -0
  67. data/lib/vagrant/util/mime.rb +92 -0
  68. data/lib/vagrant/util/network_ip.rb +11 -1
  69. data/lib/vagrant/util/numeric.rb +69 -0
  70. data/lib/vagrant/util/platform.rb +10 -2
  71. data/lib/vagrant/util/powershell.rb +1 -1
  72. data/lib/vagrant/util/subprocess.rb +9 -1
  73. data/lib/vagrant/util/template_renderer.rb +2 -2
  74. data/lib/vagrant/util/uploader.rb +7 -4
  75. data/lib/vagrant/vagrantfile.rb +1 -1
  76. data/plugins/commands/autocomplete/command/install.rb +49 -0
  77. data/plugins/commands/autocomplete/command/root.rb +64 -0
  78. data/plugins/commands/autocomplete/plugin.rb +18 -0
  79. data/plugins/commands/box/command/outdated.rb +14 -2
  80. data/plugins/commands/cap/command.rb +5 -1
  81. data/plugins/commands/cloud/auth/login.rb +20 -23
  82. data/plugins/commands/cloud/auth/logout.rb +2 -10
  83. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +57 -0
  84. data/plugins/commands/cloud/auth/whoami.rb +18 -20
  85. data/plugins/commands/cloud/box/create.rb +33 -29
  86. data/plugins/commands/cloud/box/delete.rb +30 -24
  87. data/plugins/commands/cloud/box/show.rb +41 -31
  88. data/plugins/commands/cloud/box/update.rb +34 -26
  89. data/plugins/commands/cloud/client/client.rb +50 -81
  90. data/plugins/commands/cloud/list.rb +3 -4
  91. data/plugins/commands/cloud/locales/en.yml +10 -10
  92. data/plugins/commands/cloud/plugin.rb +10 -0
  93. data/plugins/commands/cloud/provider/create.rb +38 -28
  94. data/plugins/commands/cloud/provider/delete.rb +39 -29
  95. data/plugins/commands/cloud/provider/update.rb +37 -28
  96. data/plugins/commands/cloud/provider/upload.rb +44 -34
  97. data/plugins/commands/cloud/publish.rb +185 -108
  98. data/plugins/commands/cloud/search.rb +34 -21
  99. data/plugins/commands/cloud/util.rb +266 -162
  100. data/plugins/commands/cloud/version/create.rb +33 -28
  101. data/plugins/commands/cloud/version/delete.rb +35 -28
  102. data/plugins/commands/cloud/version/release.rb +35 -29
  103. data/plugins/commands/cloud/version/revoke.rb +36 -29
  104. data/plugins/commands/cloud/version/update.rb +29 -25
  105. data/plugins/commands/destroy/command.rb +6 -2
  106. data/plugins/commands/login/plugin.rb +0 -13
  107. data/plugins/commands/snapshot/command/save.rb +13 -8
  108. data/plugins/commands/ssh_config/command.rb +1 -1
  109. data/plugins/communicators/ssh/communicator.rb +25 -24
  110. data/plugins/communicators/winrm/config.rb +1 -1
  111. data/plugins/communicators/winrm/helper.rb +1 -1
  112. data/plugins/communicators/winrm/shell.rb +1 -1
  113. data/plugins/communicators/winssh/communicator.rb +126 -38
  114. data/plugins/communicators/winssh/config.rb +3 -7
  115. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  116. data/plugins/guests/alpine/cap/rsync.rb +1 -1
  117. data/plugins/guests/alpine/plugin.rb +16 -0
  118. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  119. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  120. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  121. data/plugins/guests/arch/cap/smb.rb +1 -1
  122. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  123. data/plugins/guests/centos/cap/flavor.rb +24 -0
  124. data/plugins/guests/centos/guest.rb +9 -0
  125. data/plugins/guests/centos/plugin.rb +20 -0
  126. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  127. data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
  128. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
  129. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +109 -13
  130. data/plugins/guests/darwin/plugin.rb +15 -0
  131. data/plugins/guests/debian/cap/change_host_name.rb +12 -11
  132. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  133. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  134. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  135. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  136. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  137. data/plugins/guests/haiku/plugin.rb +15 -0
  138. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  139. data/plugins/guests/linux/cap/halt.rb +9 -1
  140. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
  141. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
  142. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +75 -0
  143. data/plugins/guests/linux/cap/reboot.rb +53 -0
  144. data/plugins/guests/linux/plugin.rb +20 -0
  145. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  146. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  147. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  148. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  149. data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
  150. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  151. data/plugins/guests/redhat/cap/nfs_client.rb +2 -2
  152. data/plugins/guests/redhat/cap/smb.rb +20 -0
  153. data/plugins/guests/redhat/plugin.rb +5 -0
  154. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  155. data/plugins/guests/solaris11/plugin.rb +5 -0
  156. data/plugins/guests/suse/cap/change_host_name.rb +31 -9
  157. data/plugins/guests/windows/cap/public_key.rb +3 -3
  158. data/plugins/guests/windows/cap/reboot.rb +10 -5
  159. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  160. data/plugins/hosts/darwin/cap/nfs.rb +11 -0
  161. data/plugins/hosts/darwin/plugin.rb +15 -0
  162. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  163. data/plugins/hosts/linux/cap/nfs.rb +21 -2
  164. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  165. data/plugins/hosts/linux/plugin.rb +10 -0
  166. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  167. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  168. data/plugins/hosts/windows/plugin.rb +15 -0
  169. data/plugins/kernel_v2/config/cloud_init.rb +133 -0
  170. data/plugins/kernel_v2/config/disk.rb +221 -0
  171. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  172. data/plugins/kernel_v2/config/vm.rb +230 -15
  173. data/plugins/kernel_v2/config/vm_provisioner.rb +17 -3
  174. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  175. data/plugins/providers/docker/action.rb +8 -17
  176. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  177. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  178. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  179. data/plugins/providers/docker/communicator.rb +1 -1
  180. data/plugins/providers/docker/driver.rb +73 -10
  181. data/plugins/providers/docker/errors.rb +4 -0
  182. data/plugins/providers/docker/executor/local.rb +7 -1
  183. data/plugins/providers/docker/plugin.rb +5 -0
  184. data/plugins/providers/hyperv/action.rb +3 -1
  185. data/plugins/providers/hyperv/action/configure.rb +8 -0
  186. data/plugins/providers/hyperv/action/export.rb +4 -2
  187. data/plugins/providers/hyperv/cap/cleanup_disks.rb +54 -0
  188. data/plugins/providers/hyperv/cap/configure_disks.rb +200 -0
  189. data/plugins/providers/hyperv/cap/validate_disk_ext.rb +34 -0
  190. data/plugins/providers/hyperv/config.rb +5 -0
  191. data/plugins/providers/hyperv/driver.rb +90 -9
  192. data/plugins/providers/hyperv/plugin.rb +25 -0
  193. data/plugins/providers/hyperv/scripts/attach_disk_drive.ps1 +28 -0
  194. data/plugins/providers/hyperv/scripts/dismount_vhd.ps1 +13 -0
  195. data/plugins/providers/hyperv/scripts/get_vhd.ps1 +16 -0
  196. data/plugins/providers/hyperv/scripts/get_vm_status.ps1 +1 -1
  197. data/plugins/providers/hyperv/scripts/list_hdds.ps1 +17 -0
  198. data/plugins/providers/hyperv/scripts/new_vhd.ps1 +31 -0
  199. data/plugins/providers/hyperv/scripts/remove_disk_drive.ps1 +25 -0
  200. data/plugins/providers/hyperv/scripts/resize_disk_drive.ps1 +18 -0
  201. data/plugins/providers/hyperv/scripts/set_enhanced_session_transport_type.ps1 +24 -0
  202. data/plugins/providers/hyperv/scripts/set_vm_integration_services.ps1 +3 -3
  203. data/plugins/providers/hyperv/scripts/utils/VagrantVM/VagrantVM.psm1 +14 -6
  204. data/plugins/providers/virtualbox/action.rb +14 -1
  205. data/plugins/providers/virtualbox/action/clean_machine_folder.rb +10 -1
  206. data/plugins/providers/virtualbox/action/export.rb +4 -2
  207. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  208. data/plugins/providers/virtualbox/action/import.rb +8 -4
  209. data/plugins/providers/virtualbox/action/prepare_clone_snapshot.rb +4 -2
  210. data/plugins/providers/virtualbox/action/snapshot_delete.rb +4 -2
  211. data/plugins/providers/virtualbox/action/snapshot_restore.rb +4 -2
  212. data/plugins/providers/virtualbox/cap/cleanup_disks.rb +85 -0
  213. data/plugins/providers/virtualbox/cap/configure_disks.rb +440 -0
  214. data/plugins/providers/virtualbox/cap/mount_options.rb +35 -0
  215. data/plugins/providers/virtualbox/cap/validate_disk_ext.rb +34 -0
  216. data/plugins/providers/virtualbox/driver/base.rb +15 -0
  217. data/plugins/providers/virtualbox/driver/meta.rb +17 -2
  218. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  219. data/plugins/providers/virtualbox/driver/version_6_1.rb +39 -0
  220. data/plugins/providers/virtualbox/model/storage_controller.rb +135 -0
  221. data/plugins/providers/virtualbox/model/storage_controller_array.rb +98 -0
  222. data/plugins/providers/virtualbox/plugin.rb +38 -0
  223. data/plugins/providers/virtualbox/provider.rb +2 -1
  224. data/plugins/providers/virtualbox/synced_folder.rb +1 -0
  225. data/plugins/provisioners/ansible/cap/guest/alpine/ansible_install.rb +44 -0
  226. data/plugins/provisioners/ansible/cap/guest/arch/ansible_install.rb +20 -3
  227. data/plugins/provisioners/ansible/cap/guest/debian/ansible_install.rb +4 -5
  228. data/plugins/provisioners/ansible/cap/guest/fedora/ansible_install.rb +2 -2
  229. data/plugins/provisioners/ansible/cap/guest/freebsd/ansible_install.rb +2 -2
  230. data/plugins/provisioners/ansible/cap/guest/pip/pip.rb +8 -4
  231. data/plugins/provisioners/ansible/cap/guest/redhat/ansible_install.rb +2 -2
  232. data/plugins/provisioners/ansible/cap/guest/suse/ansible_install.rb +2 -1
  233. data/plugins/provisioners/ansible/cap/guest/ubuntu/ansible_install.rb +3 -3
  234. data/plugins/provisioners/ansible/plugin.rb +5 -0
  235. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  236. data/plugins/provisioners/container/client.rb +203 -0
  237. data/plugins/provisioners/container/config.rb +83 -0
  238. data/plugins/provisioners/container/installer.rb +13 -0
  239. data/plugins/provisioners/container/plugin.rb +23 -0
  240. data/plugins/provisioners/container/provisioner.rb +28 -0
  241. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  242. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  243. data/plugins/provisioners/docker/client.rb +4 -175
  244. data/plugins/provisioners/docker/config.rb +2 -72
  245. data/plugins/provisioners/docker/installer.rb +3 -5
  246. data/plugins/provisioners/docker/plugin.rb +6 -6
  247. data/plugins/provisioners/docker/provisioner.rb +4 -10
  248. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  249. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  250. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  251. data/plugins/provisioners/podman/client.rb +12 -0
  252. data/plugins/provisioners/podman/config.rb +28 -0
  253. data/plugins/provisioners/podman/installer.rb +33 -0
  254. data/plugins/provisioners/podman/plugin.rb +38 -0
  255. data/plugins/provisioners/podman/provisioner.rb +52 -0
  256. data/plugins/provisioners/salt/provisioner.rb +4 -0
  257. data/plugins/provisioners/shell/config.rb +1 -6
  258. data/plugins/provisioners/shell/provisioner.rb +61 -26
  259. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  260. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  261. data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
  262. data/plugins/synced_folders/smb/plugin.rb +20 -0
  263. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  264. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  265. data/scripts/website_push_www.sh +1 -1
  266. data/templates/commands/init/Vagrantfile.erb +1 -1
  267. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  268. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  269. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  270. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  271. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  272. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  273. data/templates/guests/linux/etc_fstab.erb +6 -0
  274. data/templates/locales/en.yml +235 -6
  275. data/templates/locales/providers_docker.yml +6 -0
  276. data/templates/nfs/exports_darwin.erb +7 -0
  277. data/vagrant.gemspec +14 -15
  278. data/version.txt +1 -1
  279. metadata +3577 -3855
  280. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  281. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  282. data/plugins/commands/login/client.rb +0 -253
  283. data/plugins/commands/login/command.rb +0 -137
  284. data/plugins/commands/login/errors.rb +0 -24
  285. data/plugins/commands/login/locales/en.yml +0 -49
  286. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
  287. data/scripts/website_push_docs.sh +0 -40
@@ -9,7 +9,10 @@ module VagrantPlugins
9
9
 
10
10
  # Unique name for this provisioner
11
11
  #
12
- # @return [String]
12
+ # Accepts a string, but is ultimately forced into a symbol in the top level method inside
13
+ # #Config::VM.provision method while being parsed from a Vagrantfile
14
+ #
15
+ # @return [Symbol]
13
16
  attr_reader :name
14
17
 
15
18
  # Internal unique name for this provisioner
@@ -53,6 +56,12 @@ module VagrantPlugins
53
56
  # @return [String, Symbol]
54
57
  attr_accessor :after
55
58
 
59
+ # Boolean, when true signifies that some communicator must
60
+ # be available in order for the provisioner to run.
61
+ #
62
+ # @return [Boolean]
63
+ attr_accessor :communicator_required
64
+
56
65
  def initialize(name, type, **options)
57
66
  @logger = Log4r::Logger.new("vagrant::config::vm::provisioner")
58
67
  @logger.debug("Provisioner defined: #{name}")
@@ -66,6 +75,7 @@ module VagrantPlugins
66
75
  @type = type
67
76
  @before = options[:before]
68
77
  @after = options[:after]
78
+ @communicator_required = options.fetch(:communicator_required, true)
69
79
 
70
80
  # Attempt to find the provisioner...
71
81
  if !Vagrant.plugin("2").manager.provisioners[type]
@@ -115,6 +125,10 @@ module VagrantPlugins
115
125
 
116
126
  provisioner_names = provisioners.map { |i| i.name.to_s if i.name != name }.compact
117
127
 
128
+ if ![TrueClass, FalseClass].include?(@communicator_required.class)
129
+ errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "communicator_required", type: "boolean")
130
+ end
131
+
118
132
  if @before && @after
119
133
  errors << I18n.t("vagrant.provisioners.base.both_before_after_set")
120
134
  end
@@ -124,7 +138,7 @@ module VagrantPlugins
124
138
  if @before.is_a?(Symbol) && !VALID_BEFORE_AFTER_TYPES.include?(@before)
125
139
  errors << I18n.t("vagrant.provisioners.base.invalid_alias_value", opt: "before", alias: VALID_BEFORE_AFTER_TYPES.join(", "))
126
140
  elsif !@before.is_a?(String) && !VALID_BEFORE_AFTER_TYPES.include?(@before)
127
- errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "before")
141
+ errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "before", type: "string")
128
142
  end
129
143
 
130
144
  if !provisioner_names.include?(@before)
@@ -150,7 +164,7 @@ module VagrantPlugins
150
164
  if @after.is_a?(Symbol)
151
165
  errors << I18n.t("vagrant.provisioners.base.invalid_alias_value", opt: "after", alias: VALID_BEFORE_AFTER_TYPES.join(", "))
152
166
  elsif !@after.is_a?(String)
153
- errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "after")
167
+ errors << I18n.t("vagrant.provisioners.base.wrong_type", opt: "after", type: "string")
154
168
  end
155
169
 
156
170
  if !provisioner_names.include?(@after)
@@ -114,7 +114,11 @@ module VagrantPlugins
114
114
 
115
115
  # Internal options
116
116
  @id = SecureRandom.uuid
117
- @command = command.to_sym
117
+ if command.respond_to?(:to_sym)
118
+ @command = command.to_sym
119
+ else
120
+ @command = command
121
+ end
118
122
  @ruby_block = UNSET_VALUE
119
123
 
120
124
  @logger.debug("Trigger defined for: #{command}")
@@ -214,10 +218,7 @@ module VagrantPlugins
214
218
  end
215
219
 
216
220
  if @type == :command || !@type
217
- commands = []
218
- Vagrant.plugin("2").manager.commands.each do |key,data|
219
- commands.push(key)
220
- end
221
+ commands = Vagrant.plugin("2").manager.commands.keys.map(&:to_s)
221
222
 
222
223
  if !commands.include?(@command) && @command != :all
223
224
  machine.ui.warn(I18n.t("vagrant.config.triggers.bad_command_warning",
@@ -66,14 +66,8 @@ module VagrantPlugins
66
66
  next
67
67
  end
68
68
 
69
- b3.use Call, HasSSH do |env3, b4|
70
- if env3[:result]
71
- b4.use Provision
72
- else
73
- b4.use Message,
74
- I18n.t("docker_provider.messages.provision_no_ssh"),
75
- post: true
76
- end
69
+ b3.use Call, HasProvisioner do |env3, b4|
70
+ b4.use Provision
77
71
  end
78
72
  end
79
73
  end
@@ -216,14 +210,8 @@ module VagrantPlugins
216
210
  Vagrant::Action::Builder.new.tap do |b|
217
211
  b.use Call, IsState, :running do |env, b2|
218
212
  if env[:machine_action] != :run_command
219
- b2.use Call, HasSSH do |env2, b3|
220
- if env2[:result]
221
- b3.use Provision
222
- else
223
- b3.use Message,
224
- I18n.t("docker_provider.messages.provision_no_ssh"),
225
- post: true
226
- end
213
+ b2.use Call, HasProvisioner do |env2, b3|
214
+ b3.use Provision
227
215
  end
228
216
  end
229
217
 
@@ -251,14 +239,16 @@ module VagrantPlugins
251
239
  if env[:machine_action] != :run_command
252
240
  # If the container is NOT created yet, then do some setup steps
253
241
  # necessary for creating it.
242
+
254
243
  b2.use Call, IsState, :preparing do |env2, b3|
255
244
  if env2[:result]
256
245
  b3.use EnvSet, port_collision_repair: true
257
246
  b3.use HostMachinePortWarning
258
247
  b3.use HostMachinePortChecker
248
+ b3.use ForwardedPorts # This action converts the `ports` param into proper network configs
249
+ b3.use PrepareForwardedPortCollisionParams
259
250
  b3.use HandleForwardedPortCollisions
260
251
  b3.use SyncedFolders
261
- b3.use ForwardedPorts
262
252
  b3.use Pull
263
253
  b3.use Create
264
254
  b3.use WaitForRunning
@@ -313,6 +303,7 @@ module VagrantPlugins
313
303
  autoload :IsBuild, action_root.join("is_build")
314
304
  autoload :IsHostMachineCreated, action_root.join("is_host_machine_created")
315
305
  autoload :Login, action_root.join("login")
306
+ autoload :PrepareForwardedPortCollisionParams, action_root.join("prepare_forwarded_port_collision_params")
316
307
  autoload :PrepareNetworks, action_root.join("prepare_networks")
317
308
  autoload :PrepareNFSValidIds, action_root.join("prepare_nfs_valid_ids")
318
309
  autoload :PrepareNFSSettings, action_root.join("prepare_nfs_settings")
@@ -6,6 +6,8 @@ module VagrantPlugins
6
6
  @app = app
7
7
  end
8
8
 
9
+ # Converts the `ports` docker provider param into proper network configs
10
+ # of type :forwarded_port
9
11
  def call(env)
10
12
  env[:machine].provider_config.ports.each do |p|
11
13
  host_ip = nil
@@ -0,0 +1,61 @@
1
+ module VagrantPlugins
2
+ module DockerProvider
3
+ module Action
4
+ class PrepareForwardedPortCollisionParams
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ machine = env[:machine]
11
+
12
+ # Get the forwarded ports used by other containers and
13
+ # consider those in use as well.
14
+ other_used_ports = machine.provider.driver.read_used_ports
15
+ env[:port_collision_extra_in_use] = other_used_ports
16
+
17
+ # Build the remap for any existing collision detections
18
+ #
19
+ # Note: This remap might not be required yet (as it is with the virtualbox provider)
20
+ # so for now we leave the remap hash empty.
21
+ remap = {}
22
+ env[:port_collision_remap] = remap
23
+
24
+ # This port checker method calls the custom port_check method
25
+ # defined below. If its false, it will go ahead and use the built-in
26
+ # port_check method to see if there are any live containers with bound
27
+ # ports
28
+ docker_port_check = proc { |host_ip, host_port|
29
+ result = port_check(env, host_port)
30
+ if !result
31
+ result = Vagrant::Action::Builtin::HandleForwardedPortCollisions.port_check(machine, host_ip, host_port)
32
+ end
33
+ result}
34
+ env[:port_collision_port_check] = docker_port_check
35
+
36
+ @app.call(env)
37
+ end
38
+
39
+ protected
40
+
41
+ # This check is required the docker provider. Containers
42
+ # can bind ports but be halted. We don't want new containers to
43
+ # grab these bound ports, so this check is here for that since
44
+ # the checks above won't detect it
45
+ #
46
+ # @param [Vagrant::Environment] env
47
+ # @param [String] host_port
48
+ # @returns [Bool]
49
+ def port_check(env, host_port)
50
+ extra_in_use = env[:port_collision_extra_in_use]
51
+
52
+ if extra_in_use
53
+ return extra_in_use.include?(host_port.to_s)
54
+ else
55
+ return false
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,11 @@
1
+ module VagrantPlugins
2
+ module DockerProvider
3
+ module Cap
4
+ module HasCommunicator
5
+ def self.has_communicator(machine)
6
+ return machine.provider_config.has_ssh
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -151,7 +151,7 @@ module VagrantPlugins
151
151
  "-i #{path}"
152
152
  end
153
153
 
154
- # Use ad-hoc SSH options for the hop on the docker proxy
154
+ # Use ad-hoc SSH options for the hop on the docker proxy
155
155
  if info[:forward_agent]
156
156
  ssh_args << "-o ForwardAgent=yes"
157
157
  end
@@ -15,19 +15,46 @@ module VagrantPlugins
15
15
  @executor = Executor::Local.new
16
16
  end
17
17
 
18
+ # Returns the id for a new container built from `docker build`. Raises
19
+ # an exception if the id was unable to be captured from the output
20
+ #
21
+ # @return [String] id - ID matched from the docker build output.
18
22
  def build(dir, **opts, &block)
19
- args = Array(opts[:extra_args])
20
- args << dir
21
- result = execute('docker', 'build', *args, &block)
22
- matches = result.scan(/Successfully built (.+)$/i)
23
- if matches.empty?
24
- # This will cause a stack trace in Vagrant, but it is a bug
25
- # if this happens anyways.
26
- raise "UNKNOWN OUTPUT: #{result}"
23
+ args = Array(opts[:extra_args])
24
+ args << dir
25
+ opts = {with_stderr: true}
26
+ result = execute('docker', 'build', *args, opts, &block)
27
+ # Check for the new output format 'writing image sha256...'
28
+ # In this case, docker builtkit is enabled. Its format is different
29
+ # from standard docker
30
+ matches = result.scan(/writing image .+:([0-9a-z]+) done/i).last
31
+ if !matches
32
+ if podman?
33
+ # Check for podman format when it is emulating docker CLI.
34
+ # Podman outputs the full hash of the container on
35
+ # the last line after a successful build.
36
+ match = result.split.select { |str| str.match?(/[0-9a-z]{64}/) }.last
37
+ return match[0..7] unless match.nil?
38
+ else
39
+ matches = result.scan(/Successfully built (.+)$/i).last
40
+ end
41
+
42
+ if !matches
43
+ # This will cause a stack trace in Vagrant, but it is a bug
44
+ # if this happens anyways.
45
+ raise Errors::BuildError, result: result
46
+ end
27
47
  end
28
48
 
29
- # Return the last match, and the capture of it
30
- matches[-1][0]
49
+ # Return the matched group `id`
50
+ matches[0]
51
+ end
52
+
53
+ # Check if podman emulating docker CLI is enabled.
54
+ #
55
+ # @return [Bool]
56
+ def podman?
57
+ execute('docker', '--version').include?("podman")
31
58
  end
32
59
 
33
60
  def create(params, **opts, &block)
@@ -99,6 +126,41 @@ module VagrantPlugins
99
126
  result =~ /^#{Regexp.escape(id)}$/
100
127
  end
101
128
 
129
+ # Reads all current docker containers and determines what ports
130
+ # are currently registered to be forwarded
131
+ # {2222=>#<Set: {"127.0.0.1"}>, 8080=>#<Set: {"*"}>, 9090=>#<Set: {"*"}>}
132
+ #
133
+ # Note: This is this format because of what the builtin action for resolving colliding
134
+ # port forwards expects.
135
+ #
136
+ # @return [Hash[Set]] used_ports - {forward_port: #<Set: {"host ip address"}>}
137
+ def read_used_ports
138
+ used_ports = Hash.new{|hash,key| hash[key] = Set.new}
139
+
140
+ all_containers.each do |c|
141
+ container_info = inspect_container(c)
142
+
143
+ if container_info["HostConfig"]["PortBindings"]
144
+ port_bindings = container_info["HostConfig"]["PortBindings"]
145
+ next if port_bindings.empty? # Nothing defined, but not nil either
146
+
147
+ port_bindings.each do |guest_port,host_mapping|
148
+ host_mapping.each do |h|
149
+ if h["HostIp"] == ""
150
+ hostip = "*"
151
+ else
152
+ hostip = h["HostIp"]
153
+ end
154
+ hostport = h["HostPort"]
155
+ used_ports[hostport].add(hostip)
156
+ end
157
+ end
158
+ end
159
+ end
160
+
161
+ used_ports
162
+ end
163
+
102
164
  def running?(cid)
103
165
  result = execute('docker', 'ps', '-q', '--no-trunc')
104
166
  result =~ /^#{Regexp.escape cid}$/m
@@ -154,6 +216,7 @@ module VagrantPlugins
154
216
  return true
155
217
  rescue => e
156
218
  return false if e.to_s.include?("is using it")
219
+ return false if e.to_s.include?("is being used")
157
220
  raise if !e.to_s.include?("No such image")
158
221
  end
159
222
 
@@ -5,6 +5,10 @@ module VagrantPlugins
5
5
  error_namespace("docker_provider.errors")
6
6
  end
7
7
 
8
+ class BuildError < DockerError
9
+ error_key(:build_error)
10
+ end
11
+
8
12
  class CommunicatorNonDocker < DockerError
9
13
  error_key(:communicator_non_docker)
10
14
  end
@@ -27,7 +27,13 @@ module VagrantPlugins
27
27
  stdout: result.stdout
28
28
  end
29
29
 
30
- result.stdout
30
+ if opts
31
+ if opts[:with_stderr]
32
+ return result.stdout + " " + result.stderr
33
+ else
34
+ return result.stdout
35
+ end
36
+ end
31
37
  end
32
38
 
33
39
  def windows?
@@ -67,6 +67,11 @@ module VagrantPlugins
67
67
  Cap::ProxyMachine
68
68
  end
69
69
 
70
+ provider_capability("docker", "has_communicator") do
71
+ require_relative "cap/has_communicator"
72
+ Cap::HasCommunicator
73
+ end
74
+
70
75
  protected
71
76
 
72
77
  def self.init!
@@ -149,10 +149,12 @@ module VagrantPlugins
149
149
  b3.use NetSetMac
150
150
  end
151
151
 
152
+ b3.use CleanupDisks
153
+ b3.use Disk
154
+ b3.use SyncedFolderCleanup
152
155
  b3.use StartInstance
153
156
  b3.use WaitForIPAddress
154
157
  b3.use WaitForCommunicator, [:running]
155
- b3.use SyncedFolderCleanup
156
158
  b3.use SyncedFolders
157
159
  b3.use SetHostname
158
160
  end
@@ -97,6 +97,14 @@ module VagrantPlugins
97
97
  env[:machine].provider_config.vm_integration_services)
98
98
  end
99
99
 
100
+ if env[:machine].provider_config.enable_enhanced_session_mode
101
+ env[:ui].detail(I18n.t("vagrant.hyperv_enable_enhanced_session"))
102
+ env[:machine].provider.driver.set_enhanced_session_transport_type("HvSocket")
103
+ else
104
+ env[:ui].detail(I18n.t("vagrant.hyperv_disable_enhanced_session"))
105
+ env[:machine].provider.driver.set_enhanced_session_transport_type("VMBus")
106
+ end
107
+
100
108
  @app.call(env)
101
109
  end
102
110
  end
@@ -25,8 +25,10 @@ module VagrantPlugins
25
25
  @env[:ui].info I18n.t("vagrant.actions.vm.export.exporting")
26
26
  export_tmp_dir = Vagrant::Util::Platform.wsl_to_windows_path(@env["export.temp_dir"])
27
27
  @env[:machine].provider.driver.export(export_tmp_dir) do |progress|
28
- @env[:ui].clear_line
29
- @env[:ui].report_progress(progress.percent, 100, false)
28
+ @env[:ui].rewriting do |ui|
29
+ ui.clear_line
30
+ ui.report_progress(progress.percent, 100, false)
31
+ end
30
32
  end
31
33
 
32
34
  # Clear the line a final time so the next data can appear
@@ -0,0 +1,54 @@
1
+ require "log4r"
2
+ require "vagrant/util/experimental"
3
+
4
+ module VagrantPlugins
5
+ module HyperV
6
+ module Cap
7
+ module CleanupDisks
8
+ LOGGER = Log4r::Logger.new("vagrant::plugins::hyperv::cleanup_disks")
9
+
10
+ # @param [Vagrant::Machine] machine
11
+ # @param [VagrantPlugins::Kernel_V2::VagrantConfigDisk] defined_disks
12
+ # @param [Hash] disk_meta_file - A hash of all the previously defined disks from the last configure_disk action
13
+ def self.cleanup_disks(machine, defined_disks, disk_meta_file)
14
+ return if disk_meta_file.values.flatten.empty?
15
+
16
+ return if !Vagrant::Util::Experimental.feature_enabled?("disks")
17
+
18
+ handle_cleanup_disk(machine, defined_disks, disk_meta_file["disk"])
19
+ # TODO: Floppy and DVD disks
20
+ end
21
+
22
+ protected
23
+
24
+ # @param [Vagrant::Machine] machine
25
+ # @param [VagrantPlugins::Kernel_V2::VagrantConfigDisk] defined_disks
26
+ # @param [Hash] disk_meta - A hash of all the previously defined disks from the last configure_disk action
27
+ def self.handle_cleanup_disk(machine, defined_disks, disk_meta)
28
+ all_disks = machine.provider.driver.list_hdds
29
+
30
+ disk_meta.each do |d|
31
+ # look at Path instead of Name or UUID
32
+ disk_name = File.basename(d["Path"], '.*')
33
+ dsk = defined_disks.select { |dk| dk.name == disk_name }
34
+
35
+ if !dsk.empty? || d["primary"] == true
36
+ next
37
+ else
38
+ LOGGER.warn("Found disk not in Vagrantfile config: '#{d["Name"]}'. Removing disk from guest #{machine.name}")
39
+
40
+ machine.ui.warn(I18n.t("vagrant.cap.cleanup_disks.disk_cleanup", name: d["Name"]), prefix: true)
41
+
42
+ disk_actual = all_disks.select { |a| File.realdirpath(a["Path"]) == File.realdirpath(d["Path"]) }.first
43
+ if !disk_actual
44
+ machine.ui.warn(I18n.t("vagrant.cap.cleanup_disks.disk_not_found", name: d["Name"]), prefix: true)
45
+ else
46
+ machine.provider.driver.remove_disk(disk_actual["ControllerType"], disk_actual["ControllerNumber"], disk_actual["ControllerLocation"], disk_actual["Path"])
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end