vagrant-unbundled 2.2.7.0 → 2.2.16.0

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 (282) hide show
  1. checksums.yaml +4 -4
  2. data/.hashibot.hcl +2 -0
  3. data/CHANGELOG.md +228 -0
  4. data/Gemfile +1 -1
  5. data/README.md +9 -51
  6. data/RELEASE.md +1 -1
  7. data/bin/vagrant +50 -1
  8. data/contrib/README.md +1 -0
  9. data/contrib/sudoers/linux-suse +2 -2
  10. data/contrib/zsh/_vagrant +738 -0
  11. data/contrib/zsh/generate_zsh_completion.rb +165 -0
  12. data/lib/vagrant.rb +28 -5
  13. data/lib/vagrant/action.rb +7 -0
  14. data/lib/vagrant/action/builder.rb +184 -38
  15. data/lib/vagrant/action/builtin/box_add.rb +24 -8
  16. data/lib/vagrant/action/builtin/box_check_outdated.rb +2 -1
  17. data/lib/vagrant/action/builtin/cleanup_disks.rb +56 -0
  18. data/lib/vagrant/action/builtin/cloud_init_setup.rb +122 -0
  19. data/lib/vagrant/action/builtin/cloud_init_wait.rb +30 -0
  20. data/lib/vagrant/action/builtin/delayed.rb +26 -0
  21. data/lib/vagrant/action/builtin/disk.rb +14 -1
  22. data/lib/vagrant/action/builtin/handle_box.rb +3 -1
  23. data/lib/vagrant/action/builtin/handle_forwarded_port_collisions.rb +28 -9
  24. data/lib/vagrant/action/builtin/has_provisioner.rb +36 -0
  25. data/lib/vagrant/action/builtin/mixin_provisioners.rb +1 -0
  26. data/lib/vagrant/action/builtin/mixin_synced_folders.rb +20 -21
  27. data/lib/vagrant/action/builtin/set_hostname.rb +5 -1
  28. data/lib/vagrant/action/builtin/synced_folders.rb +16 -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 +12 -27
  32. data/lib/vagrant/action/warden.rb +28 -31
  33. data/lib/vagrant/box.rb +11 -4
  34. data/lib/vagrant/box_collection.rb +1 -1
  35. data/lib/vagrant/bundler.rb +310 -61
  36. data/lib/vagrant/cli.rb +4 -2
  37. data/lib/vagrant/environment.rb +1 -0
  38. data/lib/vagrant/errors.rb +69 -1
  39. data/lib/vagrant/machine.rb +64 -11
  40. data/lib/vagrant/machine_index.rb +28 -1
  41. data/lib/vagrant/patches/net-ssh.rb +186 -0
  42. data/lib/vagrant/plugin/manager.rb +45 -16
  43. data/lib/vagrant/plugin/v2/command.rb +7 -2
  44. data/lib/vagrant/plugin/v2/components.rb +6 -0
  45. data/lib/vagrant/plugin/v2/manager.rb +67 -0
  46. data/lib/vagrant/plugin/v2/plugin.rb +13 -0
  47. data/lib/vagrant/plugin/v2/synced_folder.rb +50 -0
  48. data/lib/vagrant/plugin/v2/trigger.rb +64 -25
  49. data/lib/vagrant/shared_helpers.rb +36 -0
  50. data/lib/vagrant/ui.rb +43 -2
  51. data/lib/vagrant/util.rb +2 -0
  52. data/lib/vagrant/util/ansi_escape_code_remover.rb +1 -1
  53. data/lib/vagrant/util/caps.rb +48 -0
  54. data/lib/vagrant/util/credential_scrubber.rb +1 -1
  55. data/lib/vagrant/util/curl_helper.rb +12 -8
  56. data/lib/vagrant/util/directory.rb +19 -0
  57. data/lib/vagrant/util/downloader.rb +10 -5
  58. data/lib/vagrant/util/guest_hosts.rb +68 -0
  59. data/lib/vagrant/util/guest_inspection.rb +9 -1
  60. data/lib/vagrant/util/install_cli_autocomplete.rb +118 -0
  61. data/lib/vagrant/util/io.rb +7 -27
  62. data/lib/vagrant/util/ipv4_interfaces.rb +15 -0
  63. data/lib/vagrant/util/is_port_open.rb +8 -19
  64. data/lib/vagrant/util/map_command_options.rb +33 -0
  65. data/lib/vagrant/util/mime.rb +92 -0
  66. data/lib/vagrant/util/network_ip.rb +11 -1
  67. data/lib/vagrant/util/numeric.rb +28 -0
  68. data/lib/vagrant/util/platform.rb +10 -2
  69. data/lib/vagrant/util/powershell.rb +31 -15
  70. data/lib/vagrant/util/subprocess.rb +9 -1
  71. data/lib/vagrant/util/template_renderer.rb +2 -2
  72. data/lib/vagrant/util/uploader.rb +7 -4
  73. data/lib/vagrant/vagrantfile.rb +2 -2
  74. data/plugins/commands/autocomplete/command/install.rb +49 -0
  75. data/plugins/commands/autocomplete/command/root.rb +64 -0
  76. data/plugins/commands/autocomplete/plugin.rb +18 -0
  77. data/plugins/commands/cap/command.rb +5 -1
  78. data/plugins/commands/cloud/auth/login.rb +20 -23
  79. data/plugins/commands/cloud/auth/logout.rb +2 -10
  80. data/plugins/commands/cloud/auth/middleware/add_authentication.rb +60 -31
  81. data/plugins/commands/cloud/auth/middleware/add_downloader_authentication.rb +64 -0
  82. data/plugins/commands/cloud/auth/whoami.rb +18 -20
  83. data/plugins/commands/cloud/box/create.rb +33 -29
  84. data/plugins/commands/cloud/box/delete.rb +30 -24
  85. data/plugins/commands/cloud/box/show.rb +41 -31
  86. data/plugins/commands/cloud/box/update.rb +34 -26
  87. data/plugins/commands/cloud/client/client.rb +55 -79
  88. data/plugins/commands/cloud/list.rb +3 -4
  89. data/plugins/commands/cloud/locales/en.yml +15 -11
  90. data/plugins/commands/cloud/plugin.rb +10 -0
  91. data/plugins/commands/cloud/provider/create.rb +38 -28
  92. data/plugins/commands/cloud/provider/delete.rb +39 -29
  93. data/plugins/commands/cloud/provider/update.rb +37 -28
  94. data/plugins/commands/cloud/provider/upload.rb +53 -33
  95. data/plugins/commands/cloud/publish.rb +193 -106
  96. data/plugins/commands/cloud/search.rb +34 -21
  97. data/plugins/commands/cloud/util.rb +273 -161
  98. data/plugins/commands/cloud/version/create.rb +33 -28
  99. data/plugins/commands/cloud/version/delete.rb +35 -28
  100. data/plugins/commands/cloud/version/release.rb +35 -29
  101. data/plugins/commands/cloud/version/revoke.rb +36 -29
  102. data/plugins/commands/cloud/version/update.rb +29 -25
  103. data/plugins/commands/destroy/command.rb +7 -7
  104. data/plugins/commands/login/plugin.rb +0 -13
  105. data/plugins/commands/ssh_config/command.rb +1 -1
  106. data/plugins/communicators/ssh/communicator.rb +25 -24
  107. data/plugins/communicators/winrm/config.rb +1 -1
  108. data/plugins/communicators/winrm/helper.rb +1 -1
  109. data/plugins/communicators/winrm/shell.rb +1 -1
  110. data/plugins/communicators/winssh/communicator.rb +126 -38
  111. data/plugins/communicators/winssh/config.rb +3 -7
  112. data/plugins/guests/alpine/cap/change_host_name.rb +10 -11
  113. data/plugins/guests/alpine/cap/configure_networks.rb +1 -1
  114. data/plugins/guests/alt/cap/change_host_name.rb +40 -53
  115. data/plugins/guests/arch/cap/change_host_name.rb +5 -14
  116. data/plugins/guests/arch/cap/configure_networks.rb +27 -10
  117. data/plugins/guests/arch/cap/smb.rb +1 -1
  118. data/plugins/guests/atomic/cap/change_host_name.rb +5 -14
  119. data/plugins/guests/centos/cap/flavor.rb +24 -0
  120. data/plugins/guests/centos/guest.rb +9 -0
  121. data/plugins/guests/centos/plugin.rb +20 -0
  122. data/plugins/guests/darwin/cap/change_host_name.rb +10 -6
  123. data/plugins/guests/darwin/cap/darwin_version.rb +40 -0
  124. data/plugins/guests/darwin/cap/mount_smb_shared_folder.rb +1 -1
  125. data/plugins/guests/darwin/cap/mount_vmware_shared_folder.rb +33 -10
  126. data/plugins/guests/darwin/plugin.rb +15 -0
  127. data/plugins/guests/debian/cap/change_host_name.rb +12 -11
  128. data/plugins/guests/debian/cap/configure_networks.rb +14 -6
  129. data/plugins/guests/esxi/cap/public_key.rb +3 -1
  130. data/plugins/guests/fedora/guest.rb +4 -4
  131. data/plugins/guests/freebsd/cap/change_host_name.rb +10 -6
  132. data/plugins/guests/gentoo/cap/change_host_name.rb +14 -22
  133. data/plugins/guests/haiku/cap/rsync.rb +19 -0
  134. data/plugins/guests/haiku/plugin.rb +15 -0
  135. data/plugins/guests/linux/cap/change_host_name.rb +46 -0
  136. data/plugins/guests/linux/cap/halt.rb +9 -1
  137. data/plugins/guests/linux/cap/mount_smb_shared_folder.rb +25 -34
  138. data/plugins/guests/linux/cap/mount_virtualbox_shared_folder.rb +10 -11
  139. data/plugins/guests/linux/cap/persist_mount_shared_folder.rb +74 -0
  140. data/plugins/guests/linux/cap/reboot.rb +36 -7
  141. data/plugins/guests/linux/plugin.rb +10 -0
  142. data/plugins/guests/omnios/cap/change_host_name.rb +10 -16
  143. data/plugins/guests/openbsd/cap/change_host_name.rb +10 -6
  144. data/plugins/guests/openwrt/cap/change_host_name.rb +19 -0
  145. data/plugins/guests/openwrt/cap/halt.rb +16 -0
  146. data/plugins/guests/openwrt/cap/insert_public_key.rb +20 -0
  147. data/plugins/guests/openwrt/cap/remove_public_key.rb +22 -0
  148. data/plugins/guests/openwrt/cap/rsync.rb +35 -0
  149. data/plugins/guests/openwrt/guest.rb +23 -0
  150. data/plugins/guests/openwrt/plugin.rb +61 -0
  151. data/plugins/guests/photon/cap/change_host_name.rb +9 -15
  152. data/plugins/guests/pld/cap/change_host_name.rb +11 -17
  153. data/plugins/guests/redhat/cap/change_host_name.rb +14 -5
  154. data/plugins/guests/redhat/cap/flavor.rb +3 -1
  155. data/plugins/guests/redhat/cap/smb.rb +20 -0
  156. data/plugins/guests/redhat/plugin.rb +5 -0
  157. data/plugins/guests/slackware/cap/change_host_name.rb +11 -17
  158. data/plugins/guests/solaris11/plugin.rb +5 -0
  159. data/plugins/guests/suse/cap/change_host_name.rb +31 -9
  160. data/plugins/guests/windows/cap/public_key.rb +3 -3
  161. data/plugins/guests/windows/cap/reboot.rb +10 -5
  162. data/plugins/hosts/darwin/cap/fs_iso.rb +49 -0
  163. data/plugins/hosts/darwin/plugin.rb +10 -0
  164. data/plugins/hosts/linux/cap/fs_iso.rb +49 -0
  165. data/plugins/hosts/linux/cap/nfs.rb +1 -0
  166. data/plugins/hosts/linux/cap/rdp.rb +1 -1
  167. data/plugins/hosts/linux/plugin.rb +10 -0
  168. data/plugins/hosts/windows/cap/fs_iso.rb +48 -0
  169. data/plugins/hosts/windows/cap/rdp.rb +1 -1
  170. data/plugins/hosts/windows/plugin.rb +15 -0
  171. data/plugins/kernel_v2/config/cloud_init.rb +133 -0
  172. data/plugins/kernel_v2/config/disk.rb +67 -14
  173. data/plugins/kernel_v2/config/ssh_connect.rb +24 -0
  174. data/plugins/kernel_v2/config/vm.rb +155 -21
  175. data/plugins/kernel_v2/config/vm_provisioner.rb +13 -2
  176. data/plugins/kernel_v2/config/vm_trigger.rb +6 -5
  177. data/plugins/providers/docker/action.rb +8 -17
  178. data/plugins/providers/docker/action/forwarded_ports.rb +2 -0
  179. data/plugins/providers/docker/action/prepare_forwarded_port_collision_params.rb +61 -0
  180. data/plugins/providers/docker/cap/has_communicator.rb +11 -0
  181. data/plugins/providers/docker/communicator.rb +1 -1
  182. data/plugins/providers/docker/driver.rb +58 -7
  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 +13 -1
  205. data/plugins/providers/virtualbox/action/export.rb +4 -2
  206. data/plugins/providers/virtualbox/action/forward_ports.rb +2 -2
  207. data/plugins/providers/virtualbox/action/import.rb +8 -4
  208. data/plugins/providers/virtualbox/action/network.rb +12 -5
  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 +40 -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 +16 -2
  218. data/plugins/providers/virtualbox/driver/version_5_0.rb +217 -2
  219. data/plugins/providers/virtualbox/driver/version_6_1.rb +23 -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 +42 -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/freebsd/ansible_install.rb +1 -1
  227. data/plugins/provisioners/ansible/plugin.rb +5 -0
  228. data/plugins/provisioners/ansible/provisioner/base.rb +1 -1
  229. data/plugins/provisioners/container/client.rb +203 -0
  230. data/plugins/provisioners/container/config.rb +83 -0
  231. data/plugins/provisioners/container/installer.rb +13 -0
  232. data/plugins/provisioners/container/plugin.rb +23 -0
  233. data/plugins/provisioners/container/provisioner.rb +28 -0
  234. data/plugins/provisioners/docker/cap/{redhat → centos}/docker_install.rb +10 -7
  235. data/plugins/provisioners/docker/cap/centos/docker_start_service.rb +24 -0
  236. data/plugins/provisioners/docker/client.rb +4 -175
  237. data/plugins/provisioners/docker/config.rb +2 -72
  238. data/plugins/provisioners/docker/installer.rb +3 -5
  239. data/plugins/provisioners/docker/plugin.rb +6 -6
  240. data/plugins/provisioners/docker/provisioner.rb +4 -10
  241. data/plugins/provisioners/podman/cap/centos/podman_install.rb +35 -0
  242. data/plugins/provisioners/podman/cap/linux/podman_installed.rb +13 -0
  243. data/plugins/provisioners/podman/cap/redhat/podman_install.rb +26 -0
  244. data/plugins/provisioners/podman/client.rb +12 -0
  245. data/plugins/provisioners/podman/config.rb +28 -0
  246. data/plugins/provisioners/podman/installer.rb +33 -0
  247. data/plugins/provisioners/podman/plugin.rb +38 -0
  248. data/plugins/provisioners/podman/provisioner.rb +52 -0
  249. data/plugins/provisioners/salt/bootstrap-salt.sh +7 -4
  250. data/plugins/provisioners/salt/provisioner.rb +4 -0
  251. data/plugins/provisioners/shell/config.rb +1 -6
  252. data/plugins/provisioners/shell/provisioner.rb +61 -26
  253. data/plugins/synced_folders/nfs/synced_folder.rb +3 -1
  254. data/plugins/synced_folders/smb/cap/default_fstab_modification.rb +11 -0
  255. data/plugins/synced_folders/smb/cap/mount_options.rb +56 -0
  256. data/plugins/synced_folders/smb/plugin.rb +20 -0
  257. data/plugins/synced_folders/smb/synced_folder.rb +2 -2
  258. data/plugins/synced_folders/unix_mount_helpers.rb +14 -0
  259. data/scripts/website_push_www.sh +1 -1
  260. data/templates/commands/init/Vagrantfile.min.erb +3 -0
  261. data/templates/guests/arch/{network_dhcp.erb → default_network/network_dhcp.erb} +0 -0
  262. data/templates/guests/arch/{network_static.erb → default_network/network_static.erb} +0 -0
  263. data/templates/guests/arch/{network_static6.erb → default_network/network_static6.erb} +0 -0
  264. data/templates/guests/arch/systemd_networkd/network_dhcp.erb +6 -0
  265. data/templates/guests/arch/systemd_networkd/network_static.erb +9 -0
  266. data/templates/guests/arch/systemd_networkd/network_static6.erb +9 -0
  267. data/templates/guests/linux/etc_fstab.erb +6 -0
  268. data/templates/guests/nixos/network.erb +5 -6
  269. data/templates/locales/en.yml +221 -5
  270. data/templates/locales/providers_docker.yml +4 -0
  271. data/templates/nfs/exports_darwin.erb +1 -1
  272. data/vagrant.gemspec +14 -20
  273. data/version.txt +1 -1
  274. metadata +5092 -8978
  275. data/lib/vagrant/action/builtin/after_trigger.rb +0 -31
  276. data/lib/vagrant/action/builtin/before_trigger.rb +0 -28
  277. data/plugins/commands/login/client.rb +0 -253
  278. data/plugins/commands/login/command.rb +0 -137
  279. data/plugins/commands/login/errors.rb +0 -24
  280. data/plugins/commands/login/locales/en.yml +0 -49
  281. data/plugins/provisioners/docker/cap/redhat/docker_start_service.rb +0 -16
  282. data/scripts/website_push_docs.sh +0 -40
@@ -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
@@ -24,13 +24,21 @@ module VagrantPlugins
24
24
  args << dir
25
25
  opts = {with_stderr: true}
26
26
  result = execute('docker', 'build', *args, opts, &block)
27
- matches = result.match(/Successfully built (?<id>.+)$/i)
27
+ # Check for the new output format 'writing image sha256...'
28
+ # In this case, docker buildkit is enabled. Its format is different
29
+ # from standard docker
30
+ matches = result.scan(/writing image .+:([^\s]+)/i).last
28
31
  if !matches
29
- # Check for the new output format 'writing image sha256...'
30
- # In this case, docker builtkit is enabled. Its format is different
31
- # from standard docker
32
- @logger.warn("Could not determine docker container ID. Scanning for buildkit output instead")
33
- matches = result.match(/writing image .+:(?<id>[0-9a-z]+) done/i)
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
+
34
42
  if !matches
35
43
  # This will cause a stack trace in Vagrant, but it is a bug
36
44
  # if this happens anyways.
@@ -39,7 +47,14 @@ module VagrantPlugins
39
47
  end
40
48
 
41
49
  # Return the matched group `id`
42
- matches[: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")
43
58
  end
44
59
 
45
60
  def create(params, **opts, &block)
@@ -111,6 +126,41 @@ module VagrantPlugins
111
126
  result =~ /^#{Regexp.escape(id)}$/
112
127
  end
113
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
+
114
164
  def running?(cid)
115
165
  result = execute('docker', 'ps', '-q', '--no-trunc')
116
166
  result =~ /^#{Regexp.escape cid}$/m
@@ -166,6 +216,7 @@ module VagrantPlugins
166
216
  return true
167
217
  rescue => e
168
218
  return false if e.to_s.include?("is using it")
219
+ return false if e.to_s.include?("is being used")
169
220
  raise if !e.to_s.include?("No such image")
170
221
  end
171
222
 
@@ -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
@@ -0,0 +1,200 @@
1
+ require "log4r"
2
+ require "fileutils"
3
+ require "vagrant/util/numeric"
4
+ require "vagrant/util/experimental"
5
+
6
+ module VagrantPlugins
7
+ module HyperV
8
+ module Cap
9
+ module ConfigureDisks
10
+ LOGGER = Log4r::Logger.new("vagrant::plugins::hyperv::configure_disks")
11
+
12
+ # @param [Vagrant::Machine] machine
13
+ # @param [VagrantPlugins::Kernel_V2::VagrantConfigDisk] defined_disks
14
+ # @return [Hash] configured_disks - A hash of all the current configured disks
15
+ def self.configure_disks(machine, defined_disks)
16
+ return {} if defined_disks.empty?
17
+
18
+ return {} if !Vagrant::Util::Experimental.feature_enabled?("disks")
19
+
20
+ machine.ui.info(I18n.t("vagrant.cap.configure_disks.start"))
21
+
22
+ current_disks = machine.provider.driver.list_hdds
23
+
24
+ configured_disks = {disk: [], floppy: [], dvd: []}
25
+
26
+ defined_disks.each do |disk|
27
+ if disk.type == :disk
28
+ disk_data = handle_configure_disk(machine, disk, current_disks)
29
+ configured_disks[:disk] << disk_data unless disk_data.empty?
30
+ elsif disk.type == :floppy
31
+ # TODO: Write me
32
+ machine.ui.info(I18n.t("vagrant.cap.configure_disks.floppy_not_supported", name: disk.name))
33
+ elsif disk.type == :dvd
34
+ # TODO: Write me
35
+ machine.ui.info(I18n.t("vagrant.cap.configure_disks.dvd_not_supported", name: disk.name))
36
+ end
37
+ end
38
+
39
+ configured_disks
40
+ end
41
+
42
+ protected
43
+
44
+ # @param [Vagrant::Machine] machine - the current machine
45
+ # @param [Config::Disk] disk - the current disk to configure
46
+ # @param [Array] all_disks - A list of all currently defined disks in VirtualBox
47
+ # @return [Hash] current_disk - Returns the current disk. Returns nil if it doesn't exist
48
+ def self.get_current_disk(machine, disk, all_disks)
49
+ current_disk = nil
50
+ if disk.primary
51
+ # Ensure we grab the proper primary disk
52
+ # We can't rely on the order of `all_disks`, as they will not
53
+ # always come in port order, but primary should always be Location 0 Number 0.
54
+
55
+ current_disk = all_disks.detect { |d| d["ControllerLocation"] == 0 && d["ControllerNumber"] == 0 }
56
+
57
+ # Need to get actual disk info to obtain UUID instead of what's returned
58
+ #
59
+ # This is not required for newly created disks, as its metadata is
60
+ # set when creating and attaching the disk. This is only for the primary
61
+ # disk, since it already exists.
62
+ current_disk = machine.provider.driver.get_disk(current_disk["Path"])
63
+ else
64
+ # Hyper-V disk names aren't the actual names of the disk, so we have
65
+ # to grab the name from the file path instead
66
+ current_disk = all_disks.detect { |d| File.basename(d["Path"], '.*') == disk.name}
67
+ end
68
+
69
+ current_disk
70
+ end
71
+
72
+ # Handles all disk configs of type `:disk`
73
+ #
74
+ # @param [Vagrant::Machine] machine - the current machine
75
+ # @param [Config::Disk] disk - the current disk to configure
76
+ # @param [Array] all_disks - A list of all currently defined disks in VirtualBox
77
+ # @return [Hash] - disk_metadata
78
+ def self.handle_configure_disk(machine, disk, all_disks)
79
+ disk_metadata = {}
80
+
81
+ # Grab the existing configured disk, if it exists
82
+ current_disk = get_current_disk(machine, disk, all_disks)
83
+
84
+ # Configure current disk
85
+ if !current_disk
86
+ # create new disk and attach
87
+ disk_metadata = create_disk(machine, disk)
88
+ elsif compare_disk_size(machine, disk, current_disk)
89
+ disk_metadata = resize_disk(machine, disk, current_disk)
90
+ else
91
+ disk_metadata = {UUID: current_disk["DiskIdentifier"], Name: disk.name, Path: current_disk["Path"]}
92
+ if disk.primary
93
+ disk_metadata[:primary] = true
94
+ end
95
+ end
96
+
97
+ disk_metadata
98
+ end
99
+
100
+ # Check to see if current disk is configured based on defined_disks
101
+ #
102
+ # @param [Kernel_V2::VagrantConfigDisk] disk_config
103
+ # @param [Hash] defined_disk
104
+ # @return [Boolean]
105
+ def self.compare_disk_size(machine, disk_config, defined_disk)
106
+ # Hyper-V returns disk size in bytes
107
+ requested_disk_size = disk_config.size
108
+ disk_actual = machine.provider.driver.get_disk(defined_disk["Path"])
109
+ defined_disk_size = disk_actual["Size"]
110
+
111
+ if defined_disk_size > requested_disk_size
112
+ if File.extname(disk_actual["Path"]) == ".vhdx"
113
+ # VHDX formats can be shrunk
114
+ return true
115
+ else
116
+ machine.ui.warn(I18n.t("vagrant.cap.configure_disks.shrink_size_not_supported", name: disk_config.name))
117
+ return false
118
+ end
119
+ elsif defined_disk_size < requested_disk_size
120
+ return true
121
+ else
122
+ return false
123
+ end
124
+ end
125
+
126
+ # Creates and attaches a disk to a machine
127
+ #
128
+ # @param [Vagrant::Machine] machine
129
+ # @param [Kernel_V2::VagrantConfigDisk] disk_config
130
+ def self.create_disk(machine, disk_config)
131
+ machine.ui.detail(I18n.t("vagrant.cap.configure_disks.create_disk", name: disk_config.name))
132
+ disk_provider_config = {}
133
+
134
+ if disk_config.provider_config && disk_config.provider_config.key?(:hyperv)
135
+ disk_provider_config = disk_config.provider_config[:hyperv]
136
+ end
137
+
138
+ if !disk_provider_config.empty?
139
+ disk_provider_config = convert_size_vars!(disk_provider_config)
140
+ end
141
+
142
+ # Get the machines data dir, that will now be the path for the new disk
143
+ guest_disk_folder = machine.data_dir.join("Virtual Hard Disks")
144
+
145
+ if disk_config.file
146
+ disk_file = disk_config.file
147
+ LOGGER.info("Disk already defined by user at '#{disk_file}'. Using this disk instead of creating a new one...")
148
+ else
149
+ # Set the extension
150
+ disk_ext = disk_config.disk_ext
151
+ disk_file = File.join(guest_disk_folder, disk_config.name) + ".#{disk_ext}"
152
+
153
+ LOGGER.info("Attempting to create a new disk file '#{disk_file}' of size '#{disk_config.size}' bytes")
154
+
155
+ machine.provider.driver.create_disk(disk_file, disk_config.size, disk_provider_config)
156
+ end
157
+
158
+ disk_info = machine.provider.driver.get_disk(disk_file)
159
+ disk_metadata = {UUID: disk_info["DiskIdentifier"], Name: disk_config.name, Path: disk_info["Path"]}
160
+
161
+ machine.provider.driver.attach_disk(disk_file, disk_provider_config)
162
+
163
+ disk_metadata
164
+ end
165
+
166
+ # Converts any "shortcut" options such as "123MB" into its byte form. This
167
+ # is due to what parameter type is expected when calling the `New-VHD`
168
+ # powershell command
169
+ #
170
+ # @param [Hash] disk_provider_config
171
+ # @return [Hash] disk_provider_config
172
+ def self.convert_size_vars!(disk_provider_config)
173
+ if disk_provider_config.key?(:BlockSizeBytes)
174
+ bytes = Vagrant::Util::Numeric.string_to_bytes(disk_provider_config[:BlockSizeBytes])
175
+ disk_provider_config[:BlockSizeBytes] = bytes
176
+ end
177
+
178
+ disk_provider_config
179
+ end
180
+
181
+ # @param [Vagrant::Machine] machine
182
+ # @param [Config::Disk] disk_config - the current disk to configure
183
+ # @param [Hash] defined_disk - current disk as represented by VirtualBox
184
+ # @return [Hash] - disk_metadata
185
+ def self.resize_disk(machine, disk_config, defined_disk)
186
+ machine.ui.detail(I18n.t("vagrant.cap.configure_disks.resize_disk", name: disk_config.name), prefix: true)
187
+
188
+ machine.provider.driver.resize_disk(defined_disk["Path"], disk_config.size.to_i)
189
+
190
+ disk_info = machine.provider.driver.get_disk(defined_disk["Path"])
191
+
192
+ # Store updated metadata
193
+ disk_metadata = {UUID: disk_info["DiskIdentifier"], Name: disk_config.name, Path: disk_info["Path"]}
194
+
195
+ disk_metadata
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end